![](/img/trans.png)
[英]How can I copy array from a Matlab struct array with fields to a struct of arrays
[英]I can't access the fields on a struct array
我正在学习如何编程,但在我一直在做的事情上遇到了障碍。 一旦我使用该函数,我打印 disp 字段的值,但它显示“0”,然后它卡在输入部分。
typedef struct{
char disp;
int cod;
float costH;
float costS;
char nom_emp[50];
int cod_emp;
float precio;
}REG;
int main(){
int end=1;
int cont, selector;
REG *registro[28];
for (int i = 0; i <= cont; i++){
IngresoRep(®istro[i], i);
}
}
void IngresoRep(REG * data, int i1){
//Input and control of device
scanf("%c", &data->disp); getchar();
while (data->disp != 'E' && data->disp != 'N' && data->disp != 'T'){
printf("\nTry again ");
scanf("%c", &data->disp); getchar();
}
我怀疑这可能与 -> 使用有关,但我对这些部门不太了解。 我也不想使用任何“更高级”的功能。
您有多个问题,都与registro
数组以及如何使用它有关:
REG *registro[28];
在这里,您定义了一个包含28
个指向REG
结构的指针的数组。 但是您将所有指针都保留为未初始化(这意味着它们将具有不确定的(读取:垃圾)值并且对取消引用无效)。
幸运的是,您实际上并没有取消引用指针,而是使用指针上的指针运算符来获取指向它们的指针:
IngresoRep(®istro[i], i);
registro[i]
的类型是REG *
。 ®istro[i]
的类型是REG **
。 这不是IngresoRep
函数所期望的。 由于您传递了错误的指针,您将有未定义的行为。
要解决这两个问题, registro
定义为REG
结构数组,而不是指针:
REG registro[28]; // 28 REG structure objects
现在在对IngresoRep
的调用中使用®istro[i]
将是正确的,并且符合函数的预期。
此外,您真的应该在main
函数之前对IngresoRep
函数进行前向声明:
// Forward declaration of the function
void IngresoRep(REG * data, int i1);
int main(){
// ...
}
void IngresoRep(REG * data, int i1){
// ...
}
通过这个前向声明,编译器将能够检测您是否将错误的参数传递给函数,并会警告您。
REG registro[28]; // I removed *
registro
试图成为数据类型 struct REF 的数组,因此不需要*
符号:
*
你拥有的是 28 个数据类型 struct REG 的元素*
你拥有的是 28 个指向数据类型 struct REG 的指针后来正确寻址registro
元素的方法不包括&操作,名称registro
是指向第一个元素的指针,所以registro + i
是指向第i
个元素的指针
IngresoRep(registro+i, i); // IngresoRep(®istro[i], i);
我不太热衷于 C。但是当您启动数组 (REG *registro[28]) 时,您的 REG 结构中没有任何数据,因此您的数据可能会被设置为 int 的默认值 0,和 null 的字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.