나는 통신을 위해 C로 드라이버를 개발 중이며 교환되는 메시지의 크기는 고정되어 있지 않다. 통신 버스의 권장 사항은 다중 주제에 대한 구조체를 사용하는 것입니다. 이는 또한 제 경우입니다.다른 방법으로 struct hack에서 할당 된 메모리를 수정하는 방법은 무엇입니까?
내 첫 번째 문제 : 새 메시지를 계속 수신해야하며 메시지 데이터를 처리해야하므로 (지연이 발생 함) 새 메시지를 계속 수신해야합니다.
첫 번째 해결 방법 : 데이터를 처리 할 새 메시지가있을 때 스레드를 사용합니다.
두 번째 문제 : 메시지의 데이터에는 구조체의 여러 데이터가있을 수 있으며 통신자는 구조체를 사용하여이 여러 값을 구성해야합니다.
두 번째 해법 : struct 해킹을 사용하여 struct의 메모리 동적 크기를 할당합니다.
현재 문제 : 스레드 또는 함수에 인수로 구조체를 전달할 때 데이터 구조가 손상되어 잘못된 값이 표시됩니다. 만들를
짧은 테스트입니다 : 내가 두 번째 (단 v.size
이 바로 값을주고있다)에서 첫 번째 인쇄 잘못된 값을 마우스 오른쪽 값을 가지고이 시험에서
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;
}
.
그리고 내 구조체는 테스트에서보다 조금 더 복잡합니다. 내 구조체는 다음과 같습니다.
typedef struct test1{
double v1;
double v2;
} test1;
typedef struct test2{
int size;
test1 values[];
} test2;
수정해야 할 모든 요소가 있으면 해당 함수에서 메모리 구조체를 수정하는 방법을 알고 있습니까? 복수 test2
데이터를 할당 할 수있는 것이 바람직합니다 (필수는 아닙니다).
구조의 끝에 '[]'를 사용하는 것은 _flexible array member_ (FAM)이며 C99 이상에서 완전히 지원된다는 점에 유의하십시오. 'struct hack'은'[] '대신에'[1]'을 사용하며 완전히 지원되지는 않습니다 (일반적으로 FAM이 도입되기 전에 필요했기 때문에 작동하지만 작동 코드에 대한 하위 호환성을 유지해야합니다)). –