Я разрабатываю драйвер на C для связи, и обмен сообщениями не имеет фиксированного размера. Рекомендация коммуникационной шины — использовать структуры для нескольких тем, что также относится и к моему случаю.
Моя 1-я проблема: я должен продолжать слушать новые сообщения, и когда я получаю одно, мне приходится обрабатывать данные сообщения (у него есть задержка) и все еще слушать новые сообщения.
1-е решение: использование потока при получении новых сообщений для обработки данных.
Моя вторая проблема: данные в сообщении могут иметь несколько данных структуры, и мой коммуникатор требует использования структуры для организации этих нескольких значений.
2-е решение: использование struct hack для выделения динамического размера памяти структуры.
Моя текущая проблема: когда я передаю свою структуру в качестве аргумента потоку или любой функции, я теряю структуру данных и получаю неправильные значения.
Короткий тест, который сделал:
typedef struct test{
int size;
int value[];
} test;
void allocation(test *v){
test *aux = (test *)malloc(sizeof(test)+3*sizeof(int));
int i;
aux->value[0] = 2;
aux->size = 3;
aux->value[1] = 1;
aux->value[2] = 5;
printf("Teste1 %d\n",aux->size);
for(i=0; i < aux->size; i++){
printf("%d\n", aux->value[i]);
}
*v = *aux;
}
void cleanup(test *v){
free(v);
}
int main(int argc, char *argv[]){
test v;
int i;
allocation(&v);
printf("Teste2 %d\n",v.size);
for(i=0; i < v.size; i++){
printf("%d\n", v.value[i]);
}
//cleanup(&v);
return 0;
}
В этом тесте я получил правильные значения в первом отпечатке и неправильные значения во втором (только v.size
дает правильное значение).
И моя структура немного сложнее, чем в тесте. Моя структура похожа на:
typedef struct test1{
double v1;
double v2;
} test1;
typedef struct test2{
int size;
test1 values[];
} test2;
Вы знаете, как исправить мою структуру памяти в этой функции, когда у меня есть все элементы, необходимые для исправления? Пожалуйста, имейте в виду, что желательно (не обязательно), чтобы я мог также выделить несколько test2
данных.
[]
в конце структуры является гибким элементом массива (FAM) и полностью поддерживается в C99 и более поздних версиях. «Структурный хак» использует[1]
вместо[]
и не полностью поддерживается (хотя обычно он работает, не в последнюю очередь потому, что он был необходим до того, как были введены FAM, и по-прежнему необходим для сохранения обратной совместимости для рабочего кода). - person Jonathan Leffler   schedule 20.01.2017