2016-03-28 7 views
0

Ich hinter meinem ganzen Tag, um Code Blocks zu beheben, hatte ich eine Menge Probleme damit. Scheint behoben zu sein, ich entscheide mich für Code und ich versuche ein Tablett (zweidimensionale Arrays) als Parameter einer Funktion anzuzeigen. Ich folge einer Antwort auf dieser Website, um es richtig zu machen. Aber jetzt habe ich einen Fehler, wenn ich kompiliere. Hier sind meine Dateien.Probleme mit C & Code Blocks: Fehler mit Debug genannt 'Fehler: ld zurückgegeben 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]); 
      } 
    } 
} 

Am Anfang dachte ich, dieser Fehler kam von Codeblocks, aber ich versuche zu machen wieder ohne ein Projekt zu erstellen und es hat nicht funktioniert. Und meine anderen Programme scheinen zu funktionieren. Also, was ist los mit meinem Code? Ich habe meinen Parameter überprüft, aber es scheint in Ordnung, vielleicht ist es meine Art, ein zweidimensionales Array als Parameter zu verwenden? Der Fehler ist:

||=== 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)) ===|

Ich habe dies im Buildprotokoll:

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

Es ist ein Linker-Fehler ist. Sie vermissen irgendwo eine Datei ... – Shark

+0

Wie kann ich das beheben? Warum erscheint es nur mit diesem Projekt und diesen Dateien und nicht anderen? – KIToRe

+0

@Shark: "* Eine Datei * fehlt"? "* Mehrfachdefinition von' numCols '* "! – alk

Antwort

0

der folgende Code:

  1. hat keine ‚magischen‘ Zahlen
  2. in der display() Funktion legt die Anzeige der ‚header‘ Linie
  3. drastisch die Anzahl der Parameter auf die display() Funktion reduziert
  4. sauber kompiliert
  5. verwendet vorzeichenlose Variablen bei der Behandlung von Zahlen, die nur> = 0
  6. sind
  7. stopfte alles in einer Datei, der Kürze halber
  8. nicht Variable Instanzen in der Datei-Header definieren
  9. nicht # include Header-Dateien, die nicht verwendet werden
  10. richtig die tray[][] Array
  11. korrigiert die display() Funktion initialisiert zu Ausgangsleitungen durch eine neue Zeile getrennt

und jetzt der Code

#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"); 
    } 
} 

die Ausgabe wie folgt aussieht:

|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

Vielen Dank, Alter! Ich werde es morgen versuchen – KIToRe

1

Diese Header-Datei

#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 

Definitionen von Objekten enthält numRows und numCols. Daher werden diese Objekte so viele Teile definiert, wie der Header in den Kompilierungseinheiten enthalten ist.

So Objekte mit dem gleichen Namen und externe Verknüpfung werden mehrmals definiert.

Um den Fehler zu umgehen, können Sie die Objekte mit interner Verknüpfung deklarieren. Zum Beispiel

#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 

Auch sollten Sie aus dem Header ausschließen die Definition

int i,j; 

obwohl es posiible ist eine vorläufige Definition zu haben.

+0

Verdammt, es funktioniert perfekt! Vielen Dank, Alter! – KIToRe

+0

@KIToRe Überhaupt nicht. Gern geschehen. :) –