您正在使用舊式(預標準,K & R風格)函數定義。你應該使用微弱的現代C90和後來的原型風格函數定義。
您寫道:
int MakeRandArray(ptr, i)
{
for (i = 0; i < n; i++) {
(ptr + i) = rand()
}
}
在這個函數如圖所示,ptr
類型是int
,因爲是i
類型 - 它們被隱式類型,以int
,因爲你沒有指定類型。 (請注意,這些變量與全局變量ptr
和i
無關 - 它們只是隱藏全局變量,他們做的是而不是繼承了與全局變量相同的類型)。您應該將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]);
這使得在這種情況下正確的答案。你應該可以在沒有這個變量的情況下,以及全球的i
,ptr
。根本不使用SortedArray
。 myArray
可能是main()
的本地 - 這意味着你根本不需要全局變量。儘量避免全局變量;他們通常不是一個好主意。
'*(PTR + 1)'取消引用的計算指針。但是在你的代碼中還有很多東西需要修復。 – Yunnosch
沒有說功能定義中缺少'ptr'的類型... –
分號也不會傷害太多。 – SHG