2

私はちょうどCで関数を勉強し始めました、そしてこれは私を止めました。要素のベクトルから要素を検索する関数を作成したいと思いSIZEます。コードは次のとおりです。

#include <stdio.h>
#define SIZE 10

int find(int vet[], int SIZE, int elem);

int main()
{
    int vett[SIZE] = {1, 59, 16, 0, 7, 32, 78, 90, 83, 14};
    int elem;

    printf ("Imput the element to find: ");
    scanf  ("%d", &elem);

    find(vett[SIZE], SIZE, elem);

    if (find == 1)
        printf ("\nI find the element!");
    else if (find == 2)
        printf ("\nI did not find the element!");

    return 0;
}

int find(int vett[], int SIZE, int elem)
{
    int i;
    int flag = 0;

    for (i = 0; i < SIZE; i++)
        if (vett[i] == elem)
            flag = 1;

    if (flag == 1)
        return 1;
    else
        return 2;
}

Code :: Blocksが私に言うのはなぜですか:

|4|error: expected ';', ',' or ')' before numeric constant| 
||In function 'main':| |8|error: expected ']' before ';' token| 
|14|error: 'vett' undeclared (first use in this function)| 
|14|error: (Each undeclared identifier is reported only once| 
|14|error: for each function it appears in.)| 
|14|error: expected ']' before ';' token|
|14|error: expected ')' before ';' token| 
|16|warning: comparison between pointer and integer|

|18|warning: comparison between pointer and integer|
|24|error: expected ';', ',' or ')' before numeric constant|
||=== Build finished: 8 errors, 2 warnings ===|

私は何を間違えましたか?

4

3 に答える 3

6

使用すべきでない場所でプリプロセッサを使用しています。説明させてください。

あなたのライン

#define SIZE 10

4文字の「 SIZE 」のすべての出現箇所を「 10 」に置き換えることをコンパイラーに通知します。

コード内のどれが次のようになりますか:

int find(int vet[], int SIZE, int elem); // before preprocessor
int find(int vet[], int 10, int elem);   // after preprocessor -> syntax error

2行目はCでは無効です。

あなたがすべきことは、プリプロセッサ定義を変数名として使用しないようにすることです。たとえば、私がしていることは次のとおりです。プリプロセッサマクロにCAPS(あなたが行った)で名前を付け、常に関数変数にCamelCaseまたはsmalllettersだけで名前を付けます。

編集:私の提案:

int find(int vett[], int size, int elem);

int find(int vett[], int size, int elem)
{
    int i;
    int flag = 0;

    for (i = 0; i < size; i++)
        if (vett[i] == elem)
            flag = 1;

    if (flag == 1)
        return 1;
    else
        return 2;
}
于 2012-05-29T06:19:31.633 に答える
3

SIZEを定数として使用していて、それを関数に渡す必要がない場合:

int find(int vet[], int elem);

関数を汎用にしたい場合は、次のようにプロトタイプを定義します。

int find(int vet[], int size, int elem);

そしてそれをこのように呼びます:

find(vett, SIZE, elem);

次のように記述します。

int find(int vett[], int size, int elem)
{
    int i;
    int flag = 0;

    for (i = 0; i < size; i++)
        if (vett[i] == elem)
            flag = 1;

    if (flag == 1)
        return 1;
    else
        return 2;
}

==編集==コメントからの質問に関して:
find関数へのポインタであり、戻り値を保持していません。次のいずれかの方法で使用できます。-1-

int answer = find(vett[size], size, elem);

if (answer == 1)
    printf ("\nI find the element!");
else if (find == 2)
    printf ("\nI did not find the element!");

-2-

if (find(vett[size], size, elem) == 1)
    printf ("\nI find the element!");
else if (find == 2)
    printf ("\nI did not find the element!");
于 2012-05-29T06:07:47.973 に答える
2

ベクトルvett全体ではなく、そのSIZE番目の要素を関数find()に渡します。

于 2012-05-29T06:07:24.023 に答える