2016-03-28 5 views
0

Прошел весь мой день, чтобы исправить блоки кода, у меня было много проблем с ним. Кажется, что я исправлен, я решаю код, и я пытаюсь отобразить лоток (двухмерные массивы) в качестве параметра функции. Я следую ответу на этом веб-сайте, чтобы сделать все правильно. Но теперь у меня ошибка при компиляции. Вот мои файлы.Проблема с C & Code Blocks: ошибка с отладки под названием «ошибка: ld возвращен 1 статус выхода»

main.c

#include <stdio.h> 
#include <stdlib.h> 
#include "SudokuH.h" 

int main(void) 
{ 
    int tray[9][9]={}; 
    displayTray(numRows, numCols, tray); 
    return 0; 
} 

SudokuH.h

#ifndef SUDOKUH_H_INCLUDED 
#define SUDOKUH_H_INCLUDED 

int numRows = 9; 
int numCols = 9; 
int i,j; 

void displayTray (int numRows, int numCols, int pt[][numCols]); 

#endif // SUDOKUH_H_INCLUDED 

SudokuS.c

#include <stdio.h> 
#include <stdlib.h> 
#include "SudokuH.h" 

void displayTray(int numRows, int numCols, int pt[][numCols]){ 
    printf("A|B|C|D|E|F|G|H|I\n"); 
    for (i=0; i<numRows;i++){ 
      printf("%d|",i); 
      for (j=0; j<numCols;j++){ 
       printf("%i|",pt[i][j]); 
      } 
    } 
} 

В начале, я думал, что это ошибка пришла из CodeBlocks, но я пытаюсь сделать снова без создания проекта, и это не сработало. И мои другие программы, похоже, работают. Так что случилось с моим кодом? Я проверил свой параметр, но он выглядит нормально, поэтому, возможно, это мой способ использовать двухмерный массив в качестве параметра? Ошибка:

||=== Build: Debug in Sudoku (compiler: GNU GCC Compiler) ===| ||error: ld returned 1 exit status| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

У меня есть это в журнале сборки:

файл

obj\Debug\main.o:main.c:(.data+0x0): first defined here obj\Debug\SudokuS.o:SudokuS.c:(.data+0x4): multiple definition of `numCols' obj\Debug\main.o:main.c:(.data+0x4): first defined here collect2.exe: error: ld returned 1 exit status

+1

Это ошибка линкера. Вам где-то не хватает файла ... – Shark

+0

Как я могу это исправить? Почему он появляется только с этим проектом и этими файлами, а не с другим? – KIToRe

+0

@Shark: "* отсутствует файл *"? "* множественное определение' numCols '* "! – alk

ответ

0

следующий код:

  1. не имеет «магические» числа
  2. в функции display(), фиксирует отображение строки «заголовка»
  3. резко уменьшает количество параметров функции display()
  4. :
  5. использует неподписанные переменные при обработке чисел, которые будут только> = 0
  6. чучела все в одном файле, для краткости
  7. не определяет переменную экземпляра в файле заголовка
  8. не #include заголовочные файлы, которые не используются
  9. правильно инициализирует массив tray[][]
  10. корректирует функцию display() в выходные линии отделены друг от друга символом новой строки

и теперь код

#include <stdio.h> 

//SudokuH.h 

#ifndef SUDOKUH_H_INCLUDED 
#define SUDOKUH_H_INCLUDED 

#define NUM_ROWS (9) 
#define NUM_COLS (9) 

void displayTray (int pt[][ NUM_COLS ]); 

#endif // SUDOKUH_H_INCLUDED 
//#include "SudokuH.h" 

int main(void) 
{ 
    int tray[ NUM_ROWS ][ NUM_COLS ]={{ 0 }}; 
    displayTray(tray); 
    return 0; 
} 



//SudokuS.c 

#include <stdio.h> 
//#include "SudokuH.h" 

void displayTray(int pt[][ NUM_COLS ]) 
{ 
    printf(" |A|B|C|D|E|F|G|H|I|\n"); 

    for (size_t i=0; i<NUM_ROWS; i++) 
    { 
     printf("%lu|",i); 
     for (size_t j=0; j<NUM_COLS; j++) 
     { 
      printf("%i|", pt[i][j]); 
     } 
     printf("\n"); 
    } 
} 

выглядит результат:

|A|B|C|D|E|F|G|H|I| 
0|0|0|0|0|0|0|0|0|0| 
1|0|0|0|0|0|0|0|0|0| 
2|0|0|0|0|0|0|0|0|0| 
3|0|0|0|0|0|0|0|0|0| 
4|0|0|0|0|0|0|0|0|0| 
5|0|0|0|0|0|0|0|0|0| 
6|0|0|0|0|0|0|0|0|0| 
7|0|0|0|0|0|0|0|0|0| 
8|0|0|0|0|0|0|0|0|0| 
+0

Спасибо большое чувак! Я постараюсь завтра – KIToRe

1

Этот заголовок

#ifndef SUDOKUH_H_INCLUDED 
#define SUDOKUH_H_INCLUDED 

int numRows = 9; 
int numCols = 9; 
int i,j; 

void displayTray (int numRows, int numCols, int pt[][numCols]); 

#endif // SUDOKUH_H_INCLUDED 

содержит определения объектов numRows и numCols. Таким образом, эти объекты будут определены как многие тианы, так как заголовок включен в единицы компиляции.

Таким образом, объекты с одинаковым именем и внешней связью будут определены несколько раз.

Чтобы избежать ошибки, вы можете объявить объекты с внутренней связью. Например

#ifndef SUDOKUH_H_INCLUDED 
#define SUDOKUH_H_INCLUDED 

static const int numRows = 9; 
static const int numCols = 9; 

void displayTray (int numRows, int numCols, int pt[][numCols]); 

#endif // SUDOKUH_H_INCLUDED 

Также следует исключить из заголовка определение

int i,j; 

хотя posiible иметь предварительное определение.

+0

Черт, отлично работает! Спасибо большое чувак! – KIToRe

+0

@KIToRe Нет вообще. Добро пожаловать. :) –

Смежные вопросы