Visual C ++ говорит, что функция void должна возвращать значение - PullRequest
1 голос
/ 10 ноября 2009

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

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

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

Командные строки Создание временного файла «C: \ Users \ Джонатан \ Documents \ Визуальное студия 2008 \ Projects \ Магический Квадрат \ 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 \ Джонатан \ Documents \ Визуальное студия 2008 \ Projects \ Магический Квадрат \ Debug \ RSP00000822923000.rsp» / nologo / errorReport: подсказка "

Компиляция окна вывода ... magicsquare.cpp C: \ Users \ Ионафан \ документы \ визуальный студия 2008 \ Projects \ Магический Квадрат \ magicsquare.cpp (224) : ошибка C4716: 'проверка': должна вернуть Значение

Результаты Журнал сборки был сохранен в «Файл: // C: \ Users \ Джонатан \ Documents \ Визуальное студия 2008 \ Projects \ Магический Квадрат \ 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

Ответы [ 5 ]

14 голосов
/ 10 ноября 2009

Ваша функция возвращает (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

2 голосов
/ 10 ноября 2009

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

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

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

2 голосов
/ 10 ноября 2009

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

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

2 голосов
/ 10 ноября 2009

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

2 голосов
/ 10 ноября 2009

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

...