There is only one definition of the name 'codes' in all of my files, although I still get an error. I tried using pragma once and ifndef, but to no avail.
Here is the error I'm getting:
marcin@marcin-VirtualBox:~/Pulpit/INA/Wstęp/Laby/Lista 4/zadanie 2$ make
gcc -g checkCode.o getDigitBase10.o main.o populateCodeList.o getNextGuess.o -o solve -lm
/usr/bin/ld: getDigitBase10.o:/home/marcin/Pulpit/INA/Wstęp/Laby/Lista 4/zadanie 2/funkcje.h:10: multiple definition of `codes'; checkCode.o:/home/marcin/Pulpit/INA/Wstęp/Laby/Lista 4/zadanie 2/funkcje.h:10: first defined here
/usr/bin/ld: main.o:/home/marcin/Pulpit/INA/Wstęp/Laby/Lista 4/zadanie 2/funkcje.h:8: multiple definition of `codes'; checkCode.o:/home/marcin/Pulpit/INA/Wstęp/Laby/Lista 4/zadanie 2/funkcje.h:10: first defined here
/usr/bin/ld: populateCodeList.o:/home/marcin/Pulpit/INA/Wstęp/Laby/Lista 4/zadanie 2/funkcje.h:8: multiple definition of `codes'; checkCode.o:/home/marcin/Pulpit/INA/Wstęp/Laby/Lista 4/zadanie 2/funkcje.h:10: first defined here
/usr/bin/ld: getNextGuess.o:/home/marcin/Pulpit/INA/Wstęp/Laby/Lista 4/zadanie 2/funkcje.h:8: multiple definition of `codes'; checkCode.o:/home/marcin/Pulpit/INA/Wstęp/Laby/Lista 4/zadanie 2/funkcje.h:10: first defined here
collect2: error: ld returned 1 exit status
make: *** [Makefile:10: all] Błąd 1
And here are all of my files:
//funkcje.h
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#include <stdlib.h>
#pragma once
#define SIZE 1296
#ifndef codes
int codes[SIZE];
#endif
void populateCodeList(int codes[]);
int getDigitBase10(int n, int digit);
struct results checkCode(int trueCode,int guessCode);
int getNextGuess(int codes[]);
struct results{
int white;
int red;
};
//checkCode.c
#include "funkcje.h"
struct results checkCode(int trueCode,int guessCode){
struct results feedback;
feedback.red = 0;
feedback.white = 0;
if(getDigitBase10(trueCode, 1) == getDigitBase10(guessCode, 1)){
feedback.red++;
} else if(getDigitBase10(trueCode, 1) == getDigitBase10(guessCode, 2)){
feedback.white++;
} else if(getDigitBase10(trueCode, 1) == getDigitBase10(guessCode, 3)){
feedback.white++;
} else if(getDigitBase10(trueCode, 1) == getDigitBase10(guessCode, 4)){
feedback.white++;
}
if(getDigitBase10(trueCode, 2) == getDigitBase10(guessCode, 2)){
feedback.red++;
} else if(getDigitBase10(trueCode, 2) == getDigitBase10(guessCode, 1)){
feedback.white++;
} else if(getDigitBase10(trueCode, 2) == getDigitBase10(guessCode, 3)){
feedback.white++;
} else if(getDigitBase10(trueCode, 2) == getDigitBase10(guessCode, 4)){
feedback.white++;
}
if(getDigitBase10(trueCode, 3) == getDigitBase10(guessCode, 3)){
feedback.red++;
} else if(getDigitBase10(trueCode, 3) == getDigitBase10(guessCode, 1)){
feedback.white++;
} else if(getDigitBase10(trueCode, 3) == getDigitBase10(guessCode, 2)){
feedback.white++;
} else if(getDigitBase10(trueCode, 3) == getDigitBase10(guessCode, 4)){
feedback.white++;
}
if(getDigitBase10(trueCode, 4) == getDigitBase10(guessCode, 4)){
feedback.red++;
} else if(getDigitBase10(trueCode, 4) == getDigitBase10(guessCode, 1)){
feedback.white++;
} else if(getDigitBase10(trueCode, 4) == getDigitBase10(guessCode, 2)){
feedback.white++;
} else if(getDigitBase10(trueCode, 4) == getDigitBase10(guessCode, 3)){
feedback.white++;
}
return feedback;
}
//getDigitBase10.c
#include "funkcje.h"
int getDigitBase10(int n, int digit){
for(int i=1; i< digit; i++){
n = n/10;
}
return n%10;
}
//getNextGuess.c
#include "funkcje.h"
int getNextGuess(int codes[]){
while(1){
int i = 0;
if(codes[i] != 9999){
return codes[i];
}
}
}
//populateCodeList.c
#include "funkcje.h"
void populateCodeList(int codes[])
{
int i = 0;
for(int a=1; a<=6; a++){
for(int b=1; b<=6; b++){
for(int c=1; c<=6; c++){
for(int d=1; d<=6; d++){
codes[i++] = a*1000 + b*100 + c*10 + d;
}
}
}
}
}
//main.c
#include "funkcje.h"
int main(void){
int turn = 1;
bool won = false;
int code = 1234; //Zmienić tę linijkę aby zmienić kod
int currentGuess = 1122;
populateCodeList(codes);
while(!won){
struct results currentResults = checkCode(code,currentGuess); // Trzymaj wyniki tury w currentResults
printf("Ze strzałem %d, wyniki są następujące:\nRed: %d\nWhite: %d\n",currentGuess, currentResults.red, currentResults.white); // Powiedz jakie są wyniki tej tury
if(currentResults.red == 4){ // Jeśli są 4 czerwone, to znaczy że komputer wygrał.
printf("Wygrałem! Twój kod to %d",currentGuess);
break;
}
for(int i=0;i<SIZE;i++){ // Usuń wszystkie kody, których wyniki nie równają się wynikom z tej tury
if(checkCode(currentGuess,codes[i]).red != checkCode(code,currentGuess).red &&
checkCode(currentGuess,codes[i]).white != checkCode(code,currentGuess).white){
codes[i] = 9999;
}
}
currentGuess = getNextGuess(codes); //Weź najmniejszy nie-usunięty kod jako następny strzał
turn++;
if(turn>8){
printf("Czas mi się skończył i nie odgadłem twojego kodu.");
break;
}
}
return 0;
}
I tried to use pragma once to avoid the linker error and tried to surround the codes definition in the ifndef order but it still produces the same error as before. While copying and pasting everything to the same file, no errors are thrown.