2009-11-10 4 views
1

Visual C++ говорит моя пустота функция должна возвращаемое значениеVisual C++ говоря недействительным функция должна возвращать значение

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

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

командных строк Создание временного файла «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 /с/ZI/TP] Создание командной строки "cl.exe @" C "\ magicsquare.cpp.": \ Users \ Джонатан \ Documents \ Визуальная Студия 2008 \ проекты \ Магический Квадрат \ Debug \ RSP00000822923000.rsp " /NOLOGO/errorReport: подсказка"

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

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

ответ

14

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

+0

как это правильно скомпилировалось на моем mac тогда? – Raptrex

+6

@ Raptrex, это не так. На Mac ничего не работает. – strager

+0

ouch, любые другие причины? – Raptrex

2

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

2

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

2

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

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

+0

Я использовал g ++ -o magicsquare magicsquare.cpp – Raptrex

+0

См. Мою аннотацию к одному другому ответу: G ++ 4.0.1 на MacOS X 10.5.8 дает предупреждение только с '-Wall'. –

+0

@ Джонатан Леффлер: То же самое я заметил в Linux (g ++ 4.3.4) –

2

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

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

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