1

Visual C++ は、void 関数には戻り値が必要だと言っています

これを自分の mac でコンパイルしたところ、完全に機能しましたが、今はこれを Visual c++ (windows 7 を使用) でコンパイルしようとしています。

ビルドログは次のとおりです。

コマンド ライン 一時ファイル "c:\Users\Jonathan\Documents\Visual Studio 2008\Projects\magicsquare\Debug\RSP00000822923000.rsp" の作成 [ /Od /D "WIN32" /D "_D​​EBUG" /D "_CONSOLE" / D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\" /Fd"Debug\vc90.pdb" /W3 /c /ZI /TP ".\magicsquare.cpp" ] コマンドの作成行 "cl.exe @"c:\Users\Jonathan\Documents\Visual Studio 2008\Projects\magicsquare\Debug\RSP00000822923000.rsp" /nologo /errorReport:prompt"

出力ウィンドウのコンパイル... magicsquare.cpp c:\users\jonathan\documents\visual studio 2008\projects\magicsquare\magicsquare.cpp(224): エラー C4716: 'チェック': 値を返す必要があります

結果 ビルド ログは "file://c:\Users\Jonathan\Documents\Visual Studio 2008\Projects\magicsquare\Debug\BuildLog.htm" magicsquare に保存されました - 1 エラー、0 警告

私の関数ヘッダーと関数

void **check (int **, int);

void **check(int **matrix, int size)
{   
    //check if first row and last row are the same
    int rsum = 0, rsum2 = 0;
    bool rowflag = false;
    for(int i = 0; i < size; i++)
    {
        rsum += *(*(matrix + 0) +i);
        rsum2 += *(*(matrix + size - 1) +i);
    }

    //check if first column and last column are the same    
    int csum = 0, csum2= 0;
    bool columnflag = false;
    for(int i = 0; i < size; i++)
    {
            csum += *(*(matrix + i) + 0);
            csum2 += *(*(matrix + i) + size - 1);
    }   

    //check if diagonals are the same
    int diagonal = 0, diagonal2 = 0;
    bool diagonalflag = false;
    for(int i = 0; i < size; i++)
        diagonal += *(*(matrix + i) + i);

    int m = 0;
    int n = size - 1;   
    while (m <= size - 1)
    {
        diagonal2 += *(*(matrix + m) + n);
        m++;
        n--;
    }

    //if row, column, diagonal are the same
    if (rsum == rsum2 && rsum2 == csum && csum == csum2 && csum2 == diagonal && diagonal == diagonal2)
        cout << "This is a Magic Square\n" << endl;
    else 
        cout << "This is not a Magic Square\n" << endl;
}

必要に応じてコード全体を参照してください http://pastie.org/691402

4

5 に答える 5

14

関数は、void ポインターへのポインターである (void **) を返しています。void 関数を作成するには、単純に次のように宣言します。

void check(int** matrix, int size);

元のコードは、C では警告付きでコンパイルされますが、C++ ではコンパイルされません。これを Visual Studio 2008 で試してください。ファイル拡張子の名前を .cpp ではなく .c に変更して、C++ コンパイルではなく C コンパイルを強制します。警告付きでコンパイルされます。ただし、チェックの戻り値を使用したことがある場合は、ガベージになることに注意してください。

このリンクには詳細があります: http://pdhut.50megs.com/vczone/articles/diffc/diffc.htm

于 2009-11-10T04:29:38.630 に答える
2

他のみんなが指摘したように、戻り値の型が正しくありません。関数で何も返さないので、** を削除するだけで準備完了です。

好奇心から、Mac でコンパイルしたときに警告が表示されましたか? g++ (私の Linux ボックス上) は -Wall でのみ警告を出します。

于 2009-11-10T04:34:09.900 に答える
2

リターンで**を取り出します。つまり、署名は次のようになります。

void check(int **matrix, int size);

あなたの pastie.org のコード サンプルを見ると、他の関数をコピーして貼り付けたものの、** を削除するのを忘れていたと思います。

于 2009-11-10T04:34:11.737 に答える
2

それはvoid関数ではなく、void **関数です。つまり、ポインターをポインターに返す必要がありvoidます。

于 2009-11-10T04:29:31.797 に答える
2

その関数は void ではなく、void** です。つまり、void ポインターへのポインターを返す必要があります。

于 2009-11-10T04:29:55.743 に答える