2017-06-05 39 views
-2

我是新的C和我找不到爲什麼它給我一個錯誤的任何答案:expression is not assignable上線11和20四處錯誤:表達不分配

這是創建一個簡單的代碼隨機數組,然後使用子程序對其進行排序。我仍然在學習C,並找不到任何研究的解決方案。

這裏是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
int myArray[100]; 
int* ptr = myArray; 
int i; 
int n = sizeof(myArray); 
int SortedArray[100]; 

int MakeRandArray(ptr, i) 
{ 
    for (i = 0; i < n; i++) { 
     (ptr + i) = rand() 
    } 
} 

int SortArray(ptr) 
{ 
    int a; 
    int j = (i + 1); 
    for (i = 0; i < n; i++) { 
     if ((ptr + i) > (ptr + j)) { 
      (ptr + i) = (ptr + j) 
     } 
    } 
} 

int main() 
{ 
    MakeRandArray(*ptr, i); 
    SortArray(*ptr); 
} 
+4

'*(PTR + 1)'取消引用的計算指針。但是在你的代碼中還有很多東西需要修復。 – Yunnosch

+4

沒有說功能定義中缺少'ptr'的類型... –

+4

分號也不會傷害太多。 – SHG

回答

1

這是一個版本,避免了錯誤,並且還提供了-Wall警告。
我沒有改變那些違背良好編碼習慣的東西。花點時間瞭解一下這些。閱讀關於你的問題和這個答案的評論。 作爲一個安可我讓你的排序工作(以非常盲目,低效的方式)並添加了打印機,用於演示目的。爲了方便,我使用數組大小​​10而不是100。看起來你打算保留原始數組並創建一個排序版本,我把它留給你。

#include <stdio.h> 
#include <stdlib.h> 
    int myArray[10]; 
    int *ptr = myArray; 
    // int i; Do not use globals for counters inside functions. 

    // it would be better to give the size of arrays as an explicit 
    // parameter to functions, instead of using a global variable 
    // (keeping this only for minimised differences to your code) 
    int n = sizeof(myArray)/sizeof(int); 

void MakeRandArray(int *ptr) 
{ 
    int i; 
    for(i = 0; i < n; i++) 
    { 
     *(ptr + i) = rand(); 
    } 
} 

void PrintArray(int *ptr) 
{ 
    int i; 
    for(i = 0; i < n; i++) 
    { 
     printf("%8d\n", *(ptr + i)); 
    } 
    printf("\n"); 
} 


void SortArray(int *ptr) 
{ 
    // this is far off even the simplest sorting algorithms 
    // it is worth reading up on one (e.g. the quite simple bubble sort), 
    // then enjoy optimising this (my) totally blind method here; 
    // note that I sort within the original array, 
    // you seem to intend to keep unsorted in addition to sorted 
    int i; 
    int j; 
    for (j = 0; j < n; j++) 
    { 
     for (i = 0; i < n-1; i++) 
     { int help; 
      if (*(ptr+i) > *(ptr + i + 1)) 
      { 
       help = *(ptr+i); 
       *(ptr + i) = *(ptr + i + 1); 
       *(ptr + i + 1)=help; 
      } 
     } 
    } 
}  

int main(void) 
{ 
    MakeRandArray(ptr); 
    PrintArray(ptr); 
    SortArray(ptr); 
    PrintArray(ptr); 

    return 0; 
} 

輸出:

 41 
    18467 
    6334 
    26500 
    19169 
    15724 
    11478 
    29358 
    26962 
    24464 

     41 
    6334 
    11478 
    15724 
    18467 
    19169 
    24464 
    26500 
    26962 
    29358 
+0

太多全局變量 - 太多全局變量。另外,因爲你有'int n = sizeof(myArray);',你正在訪問越界。在排序代碼中使用全局變量'i'有點討厭。使用'*(ptr + idx)'而不是'ptr [idx]'並不好。 –

+0

修正了出界(注意到我自己,但謝謝)。保持代碼儘可能接近OP版本。 – Yunnosch

+0

OP的代碼真的不夠好,不能保證代碼靠近它。 '0'從哪裏來,'29358'去哪了? –

3

你沒有正確取消引用指針。

在第11行:

ptr[i] = rand(); 

在第20行:

if (ptr[i] > ptr[j]){ 
    ptr[i] = ptr[j]; 
} 

或者,也可以在*(ptr + i)ptr[i]獲得的價值。

1

您正在使用舊式(預標準,K & R風格)函數定義。你應該使用微弱的現代C90和後來的原型風格函數定義。

您寫道:

int MakeRandArray(ptr, i) 
{ 
    for (i = 0; i < n; i++) { 
     (ptr + i) = rand() 
    } 
} 

在這個函數如圖所示,ptr類型是int,因爲是i類型 - 它們被隱式類型,以int,因爲你沒有指定類型。 (請注意,這些變量與全局變量ptri無關 - 它們只是隱藏全局變量,他們做的是而不是繼承了與全局變量相同的類型)。您應該將n傳遞給該函數,並且不應將i傳遞給功能。你應該避免所有這些全局變量。

您即時編譯錯誤是因爲你從*(ptr + i)省略*並且還省略了;在聲明的結尾。您應該使用ptr[i],因爲它比其他選項更簡單,易於輸入,更易於閱讀,更可靠,並且通常對每個人都更有益。

你聲稱你的函數返回一個int;它什麼都不返回。

因此,你的這個函數的代碼應該是:

void MakeRandArray(int *ptr, int n) 
{ 
    for (int i = 0; i < n; i++) 
     ptr[i] = rand(); 
} 

你可以把周圍的循環體的大括號,如果你喜歡;個人而言,我不喜歡這樣。在循環中定義i就像需要一個處理C99模式的編譯器。如果您確實卡住了,您可以在循環前定義int i;,並從循環控制線中刪除int。但是,你在Mac上;你並沒有被卡住。

整個代碼中都有類似的問題。

// Syntactically valid; semantically dubious - it does not sort! 
void SortArray(int *ptr, int n) 
{ 
    for (int i = 0; i < n; i++) 
    { 
     int j = i + 1; 
     if (ptr[i] > ptr[j]) 
      ptr[i] = ptr[j]; 
    } 
} 

int main(void) 
{ 
    MakeRandArray(myArray, 100); 
    SortArray(myArray, 100); 
} 

請注意,即使它應該編譯,它也不會對數組進行排序。當然,你沒有顯示任何打印代碼,所以你不能證明數組是否被排序。你需要這樣做。你可以寫一個函數來檢查數組是否被排序。

你的排序函數將需要第二個循環,迭代j。您將需要交換元素,而不是簡單地覆蓋它們。

你的n定義是:

int n = sizeof(myArray); 

這可能將n至400。如果你想要一個數組的大小,你需要int n = sizeof(myArray)/sizeof(myArray[0]);這使得在這種情況下正確的答案。你應該可以在沒有這個變量的情況下,以及全球的iptr。根本不使用SortedArraymyArray可能是main()的本地 - 這意味着你根本不需要全局變量。儘量避免全局變量;他們通常不是一個好主意。