-2

なぜこのエラーが発生するのか、誰かが私に何が悪いのか説明してください:

error: control may reach end of non-void function

linearsearch()キーを取得する関数と、要素が見つかった場合にインデックスを返すテーブルを作成しようとしています。ややこしい; 私は初心者で、cs50 オンライン コースを受講しています。以前にこのエラーが発生したことはありません。

#include <stdio.h>
#include <string.h>
#include <cs50.h>

int linearsearch(int key, int array[]);

int main(int argc , string argv[])
{ 
    int key = 0;
    int table[]={2,4,5,1,3};

    printf("%i is found in index %i\n",key,linearsearch(1,table));
}

int linearsearch(int key, int array[])
{
    for(int i = 0;i<5;i++){
        if(array[i] == key)
        {
             return i;
        }    
        else{
            return -1;
        }
    }
}
4

1 に答える 1

2

最後の for ループでは、どちらの方法でも関数から何かを返しているため、問題はないはずです (アルゴリズムが間違っていることを除いて: 見つからない場合はすぐには返されません)。

問題は、コンパイラは、データが何であれ、返されていることを必ずしも認識していないことです。何かを返すことでルーチンを終了しないことがわかります。

ほとんどのコンパイラは、次のような単純なケースを把握できます。

   if (x) return 0; else return 1;
  // not returning anything in the main branch but ok as it's seen as unreachable
}

しかし、あなたの場合、forリターン命令をラップするループがあります。コンパイラは制御フロー アナライザではありません。彼らは基本的なことを行いますが、正式な実行ではありません。そのため、あなたの観点からは「OK」であるという警告が表示されることがあります。

とにかく、前述のようにアルゴリズムが正しくありません。何も見つからずにループが終了した場合にのみ -1 を返すように修正してください。

その場合、バグと警告を修正します。したがって、警告がコード内の怪しいものを正しく検出していることがわかります。

固定コード:

for (int i = 0; i < 5; i++)
{
    if (array[i] == key)
    {
         // found return & exit loop
         return i;
    }    
}
// not found, end of loop: return -1
return -1;
于 2016-10-01T19:39:05.583 に答える