Trouble with C & Code Blocks : Error with debug called 'error: ld returned 1 exit status'

Trouble with C & Code Blocks : Error with debug called '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]);
            }
    }
}

一开始,我以为这个错误来自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

这个header文件

#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

包含 objects numRowsnumCols 的定义。因此,这些 objects 将定义与编译单元中包含的 header 一样多的时间。

因此objects具有相同名称和外部链接的将被定义多次

要避免错误,您可以使用内部链接声明 objects。例如

#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

您还应该从 header 定义中排除

int i,j;

尽管有一个暂定的定义是可能的。

以下代码:

  1. 没有 'magic' 个号码
  2. display()函数中,修复了'header'行的显示
  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|