EOF整数(この場合は999999)が入力されるまで入力を受け取るコードを書いた後、数値をソートして私たちの針を検索します。。このプログラムで「すべての制御パスが値を返すわけではない」
「検索」:整数)干し草の山と呼ばれる整数の配列()でそれをコンパイルしている間今、私は私の検索アルゴリズムでの問題に直面していますが、私に警告を示し、すべてのコントロールパスが値を返さないの
私は、関数が何らかのケースで何も返さないかもしれないと思いますが、問題はそのようなケースを考えることができないということです。私のプログラムには多くの価値があり、いつも正しい出力が得られました。問題がどこにあるのか誰でも分かりやすくすることができます。私はいくつかWindowsネイティブツールのコンパイラこれを使用していた。誰もがCS50のpset3はこれに関連している問題を見つけ見ている場合も
は、私もそこに同じ検索機能を使用しますがCS50 IDEでコードをコンパイル中のプログラムは、それが中に針を見つけたかどうかを示したことはありませんヘイスタック。それは、順番にそれらを整理し、その後に停止した。
#include <stdio.h>
#include "cs50.h"
#include <stdlib.h>
bool search(int value, int values[], int n);
void sort(int values[], int n);
// maximum amount of hay
#define MAX 65536
int main(int argc, string argv[])
{
// ensure proper usage
if (argc != 2)
{
printf("Usage: ./find needle\n");
return -1;
}
// remember needle
int needle = atoi(argv[1]);
// fill haystack
int size;
int haystack[MAX];
for (size = 0; size < MAX; size++)
{
// wait for hay until EOF
printf("\nhaystack[%i] = ", size);
int straw = GetInt();
if (straw == 999999)
{
break;
}
// add hay to stack
haystack[size] = straw;
}
printf("\n");
// sort the haystack
sort(haystack, size);
// try to find needle in haystack
if (search(needle, haystack, size))
{
printf("\nFound needle in haystack!\n\n");
return 0;
}
else
{
printf("\nDidn't find needle in haystack.\n\n");
return 1;
}
}
/**
* Returns true if value is in array of n values, else false.
*/
bool search(int value, int values[], int n)
{
/* TODO: implement a searching algorithm */
int first = 0;
int last = n;
int middle = (first + last)/2;
while (first + 1 < last)
{
if (value == values[middle])
{
return true;
break;
}
if (value == values[first])
{
return true;
break;
}
if (value == values[last])
{
return true;
break;
}
if (value < values[middle])
{
last = middle;
middle = (first + last)/2;
}
if (value > values[middle])
{
first = middle;
middle = (first + last)/2;
}
}
if (first + 1 >= last)
{
return false;
}
}
/**
* Sorts array of n values.
*/
void sort(int values[], int n)
{
// TODO: implement an O(n^2) sorting algorithm
for (int j = 1; j < n; j++)
{
for (int i = 0; i < (n - 1); i++)
{
if(values[i + 1] < values[i])
{
int b = values[i + 1];
values[i + 1] = values[i];
values[i] = b;
}
}
}
for (int k = 0; k < n; k++)
{
printf("haystack[%d] = %d ", k, values[k]);
}
}
これは、boolなどの特定の型の値を返すことを約束した関数があり、戻り値が返されない関数内でコードが取り得るパスがあることを意味します。 –
'if(first + 1> = last)'は無意味です。これで上記のwhileループを終了しました。 – WhozCraig
BTW 'int last = n;' - > 'int last = n-1;' – BLUEPIXY