2016-12-01 96 views
0

我正在嘗試編寫一個函數,它以下列格式從用戶處獲得輸入:0.3,0.2,1 in數據類型:float,float,int。如果兩個浮點數都爲0.0,則數據輸入完成。我初始化三個數組如何比較傳遞給函數的數組元素的值

float col1Train[1000]; 
float col2Train[1000]; 
int col3Train[1000]; 

的主要功能(可以合理地假定,存在由用戶不到1K數據項),並調用這樣的功能:

nTrainSets = readTrainingData(&col1Train, &col2Train, &col3Train); 

現在,我的問題是IF條件(標記如下)崩潰我的程序,我不知道爲什麼。我想檢查包含的數組元素是否爲0。

另外,同樣語句的替代表達式(至少我相信它是相同的嗎?)不是編譯引用float和* float的不匹配 - 爲什麼/我該如何解決這個問題?

int readTrainingData(float *col1[], float *col2[], int *col3[]) 
{ 
    int i = 0; 
    int scanfReturn = scanf("%f,%f,%d", &col1[i], &col2[i], &col3[i]); 
    while (scanfReturn == 3) { 
     printf ("read: %f, %f, %d", col1[i], col2[i], col3[i]); // Debug statement, execution succeeds 
     if (*col1[i] == 0.0f && *col2[i] == 0.0f) { // Causing the error 
     //if (*(col1 + i) == 0.0f && *(col2 + i) == 0.0f) { // Not even compiling 
      col1[i] = NULL; 
      col2[i] = NULL; 
      col3[i] = NULL; 
      break; 
     } 
     ++i; 
     scanfReturn = scanf("%f,%f,%d", &col1[i], &col2[i], &col3[i]); 
    } 
    return i - 1;  
} 

謝謝!

+0

'* COL1 [I] == 0.0f'是不對的。重寫爲'*(col1 + i)== 0.0f'或者簡單地作爲col [i] == 0.0f' – Fabulous

+0

@Fabulous我試過了,如上所述,它會導致:'error C2440:'==':在編譯期間無法從'float'轉換爲'float *' – replax

+1

爲什麼您將指針傳遞給數組而不是數組?函數調用與函數原型不匹配:'float * col1 []'是一個指針數組,不是指向數組的指針。 – mch

回答

1
float col1Train[1000]; 
float col2Train[1000]; 
int col3Train[1000]; 

考慮使用struct這裏:

struct train { 
    float col1; 
    float col2; 
    int col3; 
}; 

struct train Train[1000]; 

可以合理地假定不存在由用戶

永遠不要假設任何事情都小於1K數據項。只需傳遞函數調用中的元素數即可。因此,而不是

nTrainSets = readTrainingData(&col1Train, &col2Train, &col3Train); 

使用

nTrainSets = readTrainingData(1000, &col1Train, &col2Train, &col3Train); 

此外,將數組傳遞給函數實際上是一個指針傳遞給它的第一個參數的函數。所以,這樣稱呼:

nTrainSets = readTrainingData(1000, col1Train, col2Train, col3Train); 

然後函數原型也需要改變。取而代之的

int readTrainingData(float *col1[], float *col2[], int *col3[]) 

要麼寫

int readTrainingData(size_t size, float col1[], float col2[], int col3[]) 

int readTrainingData(size_t size, float * col1, float col2, int col3) 

與兩者basicly相同。我更喜歡變種float * col1,但有人可能會爭辯說,float col1[]文檔中指出實際的數組是預期的,而不僅僅是指向單個值的指針。

int scanfReturn = scanf("%lf,%lf,%d", &col1[i], &col2[i], &col3[i]); 

由於scanf需要一個指向無論如何,只是計算指針:現在

int scanfReturn = scanf("%lf,%lf,%d", col1 + i, col2 + i, col3 + i); 

,而相比之下,printf,其中"%f"期望一個double參數和float S是晉升爲double由於類型提升規則(並且"%lf"僅在以後被允許用作"%f"的同義詞),但功能家族實際上必須區分這兩種數據類型。因此,掃描double,你會使用"%lf"但對於float(您正在使用這裏什麼),你必須收斂到"%f"像這樣:

int scanfReturn = scanf("%f,%f,%d", col1 + i, col2 + i, col3 + i); 

然後

if (*(col1 + i) == 0.0f && *(col2 + i) == 0.0f) { 

或(COL1 [ I] == 0.0F & & COL2 [I] == 0.0F){

世界工作完美地與CISH方式存在:

if (!col1[i] && !col2[i]) { 

 col1[i] = NULL; 
     col2[i] = NULL; 
     col3[i] = NULL; 

在這裏,請使用0NULL,因爲NULL可能是一個指針,因此不能分配給非指針變量。

 col1[i] = 0; 
     col2[i] = 0; 
     col3[i] = 0; 

最後得出結論 「永不假設任何事情」 的一部分:在i增量,測試緩衝區溢出:

if (++i == size-1) { 
     col1[i] = 0; 
     col2[i] = 0; 
     col3[i] = 0; 
     break; 
    } 
+0

如何解釋»如果兩個浮點數的值均爲0.0,則數據輸入已完成。或者你是指這個帖子的其他部分? –

+0

'%lf'需要'double *'。 'float *'不兼容。當'col1 [i]'執行時,'*(col1 + i)'中也沒有理由使用笨拙的指針語法。 – user694733

+0

哦,是的,也許,我根本沒有調查'scanf',我自己並沒有使用它。只需編輯我的答案,我會接受它,如果它不被同行審查更快接受。 (現在沒有時間自己做。) –

0

該聲明if (*col1[i] == 0.0f && *col2[i] == 0.0f)是錯誤的。編譯器會將上述條件作爲指針數組(* col [i])和浮點數(0.0f)之間的比較,而不是您需要比較的數組。發生浮動*和浮

之間的誤差

失配,因爲您指向浮點值(浮子*)的地址相比較,以一個浮點值,即*col[i] == 0.0f

重寫條件if (col1[i] == 0.0f && col2[i] == 0.0f)if ((*(col1+i)) == 0.0f && (*(col2+i)) == 0.0f)

編輯:正如在註釋中指出的那樣,您必須將您的函數原型以及if條件更改爲工作。而不是傳遞陣列float *col[i]的指針,通過陣列float col[i]本身。數組到指針的轉換應在評估if條件時發生,從而使您的代碼按預期工作。

相關問題