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) : error C4716: 'check' : must return a value

结果 构建日志保存在“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 中尝试此操作。将文件扩展名重命名为 .c 而不是 .cpp 以强制 C 编译而不是 C++ 编译。它将编译并发出警告。但是请注意,如果您曾经使用过 check 的返回值,那将是垃圾。

此链接有更多详细信息:http: //pdhut.50megs.com/vczone/articles/diffc/diffc.htm

于 2009-11-10T04:29:38.630 回答
2

那不是void函数,是void **函数。这意味着您需要返回指向指针的void指针。

于 2009-11-10T04:29:31.797 回答
2

该功能不是无效的,是无效的**。这意味着它必须返回一个指向 void 指针的指针。

于 2009-11-10T04:29:55.743 回答
2

就像其他人指出的那样,您的返回类型不正确。您没有在函数中返回任何内容,因此只需删除 ** 就可以了。

出于好奇,您在 Mac 上编译时是否收到任何警告?g++(在我的 Linux 机器上)只使用 -Wall 给出警告。

于 2009-11-10T04:34:09.900 回答
2

取出返回的**。即签名应该是:

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

查看您的 paste.org 代码示例,我猜您复制并粘贴了其他函数,但忘记删除 **.

于 2009-11-10T04:34:11.737 回答