CẬP NHẬT: 6 tháng sau, và tôi vừa xem câu trả lời này: Is it legal to index into a struct?: Answer by Slava. Tôi nghĩ rằng đây là một giải pháp tốt hơn MUCH so với bất kỳ giải pháp nào được cung cấp ở đây, vì hoàn toàn không có hành vi không xác định. Hy vọng rằng điều này sẽ giúp người tiếp theo, vì nó đã quá muộn để tôi thực hiện.Lặp lại qua cấu trúc theo tên biến
Trước khi bạn bình luận nói cho tôi để sử dụng một mảng hoặc vector, hoặc bất kỳ hình thức của container thay vào đó, nó là một sự thật khó mà tôi không thể. Tôi biết, điều này sẽ được giải quyết với một mảng, và bất kỳ giải pháp khác là khá "hacky". Tôi rất thích sử dụng một container, nhưng tôi hoàn toàn không thể.
Tôi là nhà phát triển cấp trung bình tại một công ty rất lớn và chúng tôi đang sử dụng thư viện toàn công ty để gửi dữ liệu qua ethernet. Có nhiều lý do tại sao nó không thể hỗ trợ mảng/vectơ, và thay vào đó, sử dụng cấu trúc của POD (Plain Old Data - ký tự, float, ints, bools). Tôi bắt đầu với một mảng float mà tôi phải sử dụng để điền vào một cấu trúc với cùng số lượng float. Vì mục đích của thư viện này là gửi tin nhắn qua ethernet, tôi chỉ cần thực hiện lặp lại hai lần - một lần trên thư gửi và một khi nhận. Tất cả các lần khác, dữ liệu này được lưu trữ dưới dạng một mảng. Tôi biết - tôi nên tuần tự hóa các mảng và gửi chúng như là, nhưng tôi lặp lại - tôi hoàn toàn không thể.
Tôi có một float[1024]
, và phải lặp qua mảng và điền vào các cấu trúc sau:
struct pseudovector
{
float data1;
float data2;
float data3;
...
float data1024;
}
Tôi đã tạo struct này với BOOST_PP_REPEAT và BOOST_PP_SEQ_FOR_EACH_I vì vậy mà tôi không cần phải viết ra tất cả 1024 nổi và tăng khả năng bảo trì/khả năng mở rộng. Trong cùng một thời trang, tôi đã cố gắng lặp qua cấu trúc thông qua pre-compiler ##
concatination (https://stackoverflow.com/a/29020943/2066079), nhưng vì điều này được thực hiện tại thời gian trước khi biên dịch, nó không thể được sử dụng cho thời gian chạy nhận/thiết lập.
Tôi đã xem xét việc thực hiện phản chiếu như How can I add reflection to a C++ application? và Ponder Library, nhưng cả hai cách tiếp cận yêu cầu bạn phải ghi rõ từng mục có thể được phản ánh. Trong trường hợp đó, tôi cũng có thể chỉ cần tạo một std::map<string, float>
và lặp trong vòng lặp for qua chuỗi/integer nối:
for(i=0;i<1024;i++)
{
array[i] = map.get(std::string("data")+(i+1))
}
bất cứ ai có thể giới thiệu một giải pháp sạch hơn mà không yêu cầu tôi viết ra vượt quá 1024 dòng mã? Trợ giúp của bạn được đánh giá cao!
Một lần nữa, tôi lặp lại - Tôi hoàn toàn không thể sử dụng mảng/vectơ thuộc bất kỳ loại nào.
điều này có vẻ như chống mẫu. bạn có thể bọc cấu trúc này trong một công đoàn? 'union wrapper {float arr [1024]; pseudovector vec; }; ' – vu1p3n0x
Tại sao không chỉ ' float [1024] fa; pseudovector pv; memcpy (fa, & pv, sizeof (pv)); '? –
@ c-smile Bởi vì đây là hành vi không xác định – dberm22