2016-03-28 171 views
0

我過去一整天都在修復Code Blocks,我有很多麻煩。 似乎是固定的,我決定編碼,我試圖顯示一個托盤(二維數組)作爲一個函數的參數。 我遵循本網站上的答案,使其正確。但是現在,我編譯時出錯了。 這是我的文件。C&Code Blocks的問題:調試時出現錯誤,名爲'error:ld returned 1 exit status'

的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]); 
      } 
    } 
} 

在開始的時候,我想從代碼塊來了這個錯誤,但我儘量讓再次沒有創建一個項目,它沒有工作。而我的其他程序似乎工作。 那麼我的代碼有什麼問題?我檢查了我的參數,但它似乎確定,所以也許這是我的方式來使用二維數組作爲參數? 錯誤是:

||=== 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. 沒有「魔力」號碼在display()功能
  2. ,固定所述「標頭」行的顯示
  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 

包含對象numRowsnumCols的定義。因此,這些對象將被定義爲包含在編譯單元中的頭文件。

因此,具有相同名稱和外部鏈接的對象將被定義多次。

爲了避免錯誤,您可以使用內部鏈接聲明對象。例如

#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根本沒有。歡迎您。:) –

相關問題