Visual C ++ говорит, что функция void должна возвращать значение

Visual C ++ говорит, что моей функции void требуется возвращаемое значение

Я скомпилировал это на своем Mac, и он отлично работал, но теперь я пытаюсь скомпилировать это с помощью Visual C ++ (используя Windows 7)

Вот журнал сборки:

Командные строки Создание временного файла "c: \ Users \ Jonathan \ Documents \ Visual Studio 2008 \ Projects \ magicsquare \ Debug \ RSP00000822923000.rsp" с содержимым [/ Od / D "WIN32" / D "_DEBUG" / 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: 'check': должно возвращать значение

Результаты Журнал сборки был сохранен в "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


person Raptrex    schedule 10.11.2009    source источник


Ответы (5)


Ваша функция возвращает (void **), который является указателем на указатель void. Чтобы сделать функцию void, просто объявите ее как:

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

Ваш исходный код будет компилироваться с предупреждением на C, но не на C ++. Попробуйте это в Visual Studio 2008. Измените расширение файла на .c вместо .cpp, чтобы принудительно выполнять компиляцию C вместо компиляции C ++. Он будет скомпилирован с предупреждением. Но будьте осторожны, если вы когда-нибудь использовали возвращаемое значение проверки, это было бы мусором.

Эта ссылка содержит дополнительные сведения: http://pdhut.50megs.com/vczone/articles/diffc/diffc.htm

person m-sharp    schedule 10.11.2009
comment
Другой вопрос: у меня есть функция, которая должна возвращать ptr. Это не так, и мой компилятор не жалуется. Почему? - person Bill Forster; 10.11.2009
comment
@Raptrex: Ни компиляторы C, ни C ++ не обязаны обнаруживать отсутствующие операторы return. Отсутствие возврата не является ошибкой в ​​C / C ++. (Кстати, приведенный выше ответ неверен, чтобы утверждать, что он не будет компилироваться на C ++). Это означает, что это проблема качества реализации. Некоторые компиляторы делают все возможное, чтобы обнаружить недостающие возвраты, некоторые - нет. Компилятор Mac, по-видимому, из ленивых, поэтому он не обнаружил его. Кроме того, возможно, что в вашем компиляторе Mac есть переключатель, который заставляет его обнаруживать такую ​​проблему, вы просто забыли его включить. - person AnT; 10.11.2009

Это не void функция, это void ** функция. Это означает, что вам необходимо вернуть указатель на указатель void.

person Adam Maras    schedule 10.11.2009

Эта функция не недействительна, не действует **. Это означает, что он должен возвращать указатель на указатель void.

person Remus Rusanu    schedule 10.11.2009

Как уже указали все, ваш возвращаемый тип неверен. Вы ничего не возвращаете в своей функции, поэтому просто удалите **, и все будет хорошо.

Из любопытства, вы получали какие-либо предупреждения при компиляции на Mac? g ++ (на моем Linux) выдает предупреждение только с -Wall.

person Stephen Newell    schedule 10.11.2009
comment
См. Мою аннотацию к еще одному ответу: G ++ 4.0.1 в MacOS X 10.5.8 выдает предупреждение только с «-Wall». - person Jonathan Leffler; 10.11.2009
comment
@Jonathan Leffler: то же самое, что я заметил в Linux (g ++ 4.3.4) - person Stephen Newell; 10.11.2009

Выньте ** на возврате. т.е. подпись должна быть:

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

Глядя на ваш образец кода pastie.org, я предполагаю, что вы скопировали и вставили другие функции, но забыли удалить **.

person Phillip Ngan    schedule 10.11.2009