2016-01-30 83 views
-2

我想使用函數lowest()找到數組中最低的元素。但是這個程序不起作用。它顯示了錯誤的一元一元'*'的無效類型參數(有'int')數組中的最低元素

無效的類型參數 '*'(有 '詮釋')

下面是代碼:

#include <stdio.h> 

int lowest(int *j, int n) { //For finding the lowest element 
    int i, temp, tempAdd; 
    for (i = 0; i < n; i++) { 
     if (temp > *(j + i)) 
      temp = *(j + i); 
      tempAdd = j + i; 
    } 
    return tempAdd; //Sends the address of the lowest element 
} 

int main() { 
    int n; 
    printf("Enter the number of inputs: "); 
    scanf("%d", &n); 

    int arr[n], i; 

    for (i = 0; i < n; i++) { 
     printf("\nEnter element no. %d: ", i + 1); 
     scanf("%d", &arr[i]); 
    } 

    for (i = 0; i < n; i++) { 
     printf("Element no. %d is %d with the address %d.\n", i + 1, *(arr + i), arr + i); 
    } 

    int low = lowest(arr, n); //Saves the address of the lowest element. 
    printf("\nThe Lowest element in the list is %d with address %d.", *low, low); //Error occurs 
    return 0; 
} 
+0

如果你想返回的最小地址元素,你的「最低」函數應該有返回類型''int *''。但它有''int''。 – BitTickler

+0

1)'tempAdd = j + i;'你正在嘗試給整數分配一個地址。 2)你還沒有給temp賦值,所以我們不能預測第一個if的值是多少? – Karthick

+0

現在還不清楚這是C還是C++的問題。不要用兩個標籤標記你的問題,因爲它們是不同的語言。 – Archimaredes

回答

0
  • 對於打印地址,您可以如下所示使用%p

    printf("\nThe Lowest element in the list is %d with address %p.", low, low); 
    
0

這裏固定功能的第一次迭代。它仍然不是100%,因爲我會寫它,但僅限於解決問題的問題。

當你想要返回的地址,我調整了返回類型以及可變tempAdd

int* lowest(int *j, int n) { //For finding the lowest element 
    int i, temp; 
    int *tempAdd; 
    for(i = 0; i < n; i++) { 
     if(temp > *(j + i)) { 
      temp = *(j + i); 
      tempAdd = j + i; 
     } 
    } 

    return tempAdd; //Sends the address of the lowest element 
} 

EG的類型,參數n = 0你的函數的返回值會如果沒有進一步的變化是不確定的到功能製作。

由於變量temp也未初始化初始化,所以如果數組中沒有成員小於變量temp的(隨機)值,返回的地址也是未定義的。

這裏,稍微更強大的版本:

int* lowest(int *j, int n) { //For finding the lowest element 
    if(0 == n) return NULL; // empty arrays have no smallest element! 
    int i; 
    int temp = j[0]; // instead of using pointer arithmetic you can also use this syntax. 
    int *tempAdd = j; // initially the first element is allegedly the smallest... 
    for(i = 1; i < n; i++) // loop starts at index 1 now! 
    { 
     if(temp > *(j + i)) { 
      temp = *(j + i); 
      tempAdd = j + i; 
     } 
    } 

    return tempAdd; //Sends the address of the lowest element 
} 

你的功能main()也有它的問題。你不能創建一個動態大小的自動(堆棧位置)數組,這是你的嘗試。相反,如果你想查詢用戶數組的大小,你將不得不求助於一個基於堆的數組。或者你會查詢一個大小,它是小於或等於你的基於棧的數組的任意選擇的固定大小。

int main() { 
    int n = 0; 
    printf("Enter the number of inputs (1..500): "); 
    scanf("%d", &n); 

    if(n < 1 || n > 500) { 
     puts("Invalid input."); 
     return -1; 
    } 

    int arr[500]; // 500 was chosen because most likely no one is crazy enough to manually type in more values by hand ;) 
    int i; 

    for(i = 0; i < n; i++) { 
     printf("\nEnter element no. %d: ", i + 1); 
     scanf("%d", &arr[i]); 
    } 

    for(i = 0; i < n; i++) { 
     printf("Element no. %d is %d with the address %d.\n", i + 1, *(arr + i), arr + i); 
    } 

    int * low = lowest(arr, n); //Saves the address of the lowest element. 
    printf("\nThe Lowest element in the list is %d with address %p.", *low, low); //Error occurs 
    return 0; 
} 

還將指針的格式更改爲「%p」。 也將low的類型從int更改爲int *

最後重要的是,如果您允許0數組大小,您將不得不進一步更改main()。爲什麼?因爲在你的printf中你寫了...,*low,...。由於最低()在n = 0的情況下將返回NULL,所以您將取消引用NULL指針,這會導致令人討厭的運行時錯誤。從設計的角度來看,最終,返回最低位()中的地址似乎打破了抽象層次,這與你傳遞數組長度有關。基本上,你混合了兩種風格。

  1. STL-風格將是:int * lowest(int *begin, int * end)
  2. Vintage-風格將是:int lowestIndex(int *arr, int n)

第二個版本,雖然會有,你不能表達「沒有結果」的結果的問題。例如,數組大小爲0或其他無效參數正在傳遞給函數。因此,人們往往會做這種方式來代替:

  • bool lowestIndex(int * arr, int n, int *result)
  • ...這裏的返回值表示成功,結果內容僅如果返回有效值是true

    0
    #include<stdio.h> 
    
    int *lowest(int *j, int n) { //For finding the lowest element 
        int i, temp; 
        int *tempAdd; 
        temp=*j; 
        tempAdd=j; 
        for(i = 0; i < n; i++) { 
        if(temp > *(j + i)){ 
         temp = *(j + i); 
         tempAdd = j + i; 
        } 
        } 
        return tempAdd; //Sends the address of the lowest element 
    } 
    

    隨着這一正確的下面一行 int low = lowest(arr, n);int *low = lowest(arr, n);

    0

    lowest功能應該是:

    int *lowest(int *j, int n) { //For finding the lowest element 
        int i, temp = *j; 
        int *tempAdd = NULL; 
        for(i = 0; i < n; i++) { 
         if(temp > *(j + i)) 
          temp = *(j + i); 
          tempAdd = j + i; 
        } 
    
        return tempAdd; //Sends the address of the lowest element 
    } 
    

    ,並在您main功能:使用int *low代替int low和使用%p來顯示變量地址。

    +1

    對未初始化的''temp'留下未定義的行爲。變量不是默認初始化爲0或其他值。 – BitTickler

    +0

    哎呀,我的錯!我在g ++下運行代碼,它不會顯示任何警告。我認爲在這種情況下'temp'應該是'* j'。 – ktran

    1

    你的功能lowest有問題:

    int lowest(int *j, int n) { //For finding the lowest element 
        int i, temp, tempAdd; 
        for(i = 0; i < n; i++) { 
         if(temp > *(j + i)) 
          temp = *(j + i); 
          tempAdd = j + i; 
        } 
    
        return tempAdd; //Sends the address of the lowest element 
    } 
    
    • 你忘了周圍的if塊大括號。縮進不確定C中的塊結構。
    • 語義不一致:您將索引返回到最低元素,但將tempAdd設置爲j + i這是指向最低元素的指針。
    • 你沒有初始化temp,也沒有tempAdd。行爲是未定義的。
    • 命名指針是令人困惑的j,j通常指定一個整數索引。使用p

    下面是一個簡單的版本:

    int lowest(int *p, int n) { //For finding the lowest element 
        int i, tempAdd = 0; 
        for (i = 1; i < n; i++) { 
         if (p[i] < p[tempAdd]) { 
          tempAdd = i; 
         } 
        } 
        //Return the index of the lowest element 
        return tempAdd; 
    } 
    

    在主,您應該修改代碼,因爲low不是指針:

    printf("\nThe Lowest element in the list is %d with address %d.", 
         arr[low], &arr[low]); 
    
    +0

    開始時無法注意到丟失的大括號。我是一個「前線」,並且不能真正閱讀「很好的背後」風格。 – BitTickler

    +0

    @BitTickler:*在他們自己的行上加上*大括號*往往會產生更多的代碼行,這在StackOverflow上並不令人愉快,因爲它經常會導致代碼窗格滾動。 *指揮聲明結尾處的大括號*是由K&R以其原有風格(功能體除外)首次設計的,以及間距規則。 – chqrlie

    +0

    主要原因是我在20年前採用了前面的曲線,並堅持到現在爲止,因此沒有評論餘地。如果條件語句的註釋突然出現在塊內部,並且最後使用了括號,那麼它會讓我感到困惑。 'if(x <0)//測試有效參數\ n {...}''看起來像是if(x <0){//測試有效參數\ n ...}'和它會出現的評論描述了什麼塊,而不是聲明。 – BitTickler

    相關問題