我正在學習如何編程,但在我一直在做的事情上遇到了障礙。一旦我使用該函式,我列印 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();
}
我懷疑這可能與 -> 使用有關,但我對這些部門不太了解。我也不想使用任何“更高級”的功能。
uj5u.com熱心網友回復:
您有多個問題,都與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
現在®istro[i]在呼叫中使用IngresoRep將是正確的,并且與函式的期望相匹配。
此外,您應該在IngresoRep函式之前對函式進行前向宣告main:
// Forward declaration of the function
void IngresoRep(REG * data, int i1);
int main(){
// ...
}
void IngresoRep(REG * data, int i1){
// ...
}
通過這個前向宣告,編譯器將能夠檢測您是否將錯誤的引數傳遞給函式,并會警告您。
uj5u.com熱心網友回復:
REG registro[28]; // I removed *
registro正在嘗試成為資料型別 struct REF 的陣列,因此*不需要符號:
- 沒有
*你所擁有的是 struct REG 資料型別的 28 個元素 - 你所擁有
*的是 28 個指向資料型別 struct REG 的指標
后來正確的尋址registro元素的方法不包括&操作,名稱registro是指向第一個元素的指標,所以registro i是指向i元素的指標
IngresoRep(registro i, i); // IngresoRep(®istro[i], i);
uj5u.com熱心網友回復:
我不太熱衷于 C。但是當您啟動陣列 (REG *registro[28]) 時,您的 REG 結構中沒有任何資料,因此您的資料可能會被設定為 int 的默認值 0,和 null 的字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480144.html
