Thibadeaux Skrevet 6. oktober 2006 Del Skrevet 6. oktober 2006 Hei. Jeg er rimelig ny på C++, og har ett lite problem med en linker. Jeg har en enum definert i en header fil, og så vidt jeg skjønner linking, så er det kanskje her problemet ligger. Legger ved headerfilen og feilmeldingen. #include <string> #include <iostream> using namespace std; enum playstatus{X_WON, O_WON, TIE, NO_ONE_YET}; void instructions(); char askYesNo(string question); int askNumber(string question, int min, int max); char askForPiece(); char opponent(char marker); void displayBoard(char board[7][7]); playstatus winner(char board); bool isLegal(char board[7][7], char move[2]); char chooseMove(char board[7][7], char marker); void announceWinner(int win, char m_player1, char m_player2); char makeBoard(); inline void Clear(); Error 1 error LNK2019: unresolved external symbol "enum playstatus __cdecl winner(char)" (?winner@@YA?AW4playstatus@@D@Z) referenced in function _main TrePaaRad.obj er litt usikker på hvorvidt selve .cpp filen er nødvendig i denne sammenheng, så jeg venter med å poste den inntil noen smarte sjeler her inne ber om å få se den Takk på forhånd for hjelp. -Thibadeaux Lenke til kommentar
lnostdal Skrevet 6. oktober 2006 Del Skrevet 6. oktober 2006 (endret) sånn ca. oversatt: "når jeg forsøkte å finne funksjonen (symbolet) `winner' som du refererer til i funksjonen main i TrePaaRad.obj så var ikke den å finne i noen av objekt- eller bibliotek-filene du har angitt for meg" altså du har fortalt den at `playstatus winner(char board)' eksisterer (er deklarert) v.h.a. headerfiler, men du har ikke definert hvordan den ser ut - eller så har du ikke angitt hvor den eksisterer (er definert); og den blir dermed ikke linket inn ta et tilsvarende eksempel: void hello(); (man bør ta med include-guards over, men jeg driter i det nå) #include "hello.hpp"#include <iostream> using namespace std; void hello() { cout << "hello world" << endl; } #include <iostream>#include "hello.hpp" using namespace std; int main() { hello(); return 0; } ..og du kompilerer: g++ -g -Wall -c main.cpp g++ -g -Wall -c hello.cpp ..noe som gir deg main.o og hello.o når du i neste skritt linker: g++ -g -Wall main.o -o main så vil du få "unresolved external `hello' from `main' in `main.o" ellernoesånnt; løsningen er å ta med hvor `hello' er definert hen: g++ -g -Wall main.o hello.o -o main ..da fungerer det.. Endret 6. oktober 2006 av lnostdal Lenke til kommentar
Thibadeaux Skrevet 6. oktober 2006 Forfatter Del Skrevet 6. oktober 2006 (endret) Hei igjen. Dette ser fremdeles ikke ut til å fungere. La inn en Libpath til location for begge filene i prosjektet, men den vil fremdeles ikke linke. Som sag vet jeg ikke hvordan jeg kan linke i CMD prompt, så jeg gjorde dette i VS05. Men jeg skjønner fremdeles ikke hvorfor den ikke skal klare å linke filene, det er jo egentlig bare 2 filer i hele prosjektet. Det er TrePaaRad.cpp og TPR.h, og jeg bruker #include "TPR.h", hvor TPR.h definerer enum playstatus og playstatus winner. Jeg føler meg litt lost nå. Vil det hjelpe noe hvis jeg legger ut koden i TrePaaRad.cpp? -Thibadeaux Endret 6. oktober 2006 av Thibadeaux Lenke til kommentar
lnostdal Skrevet 6. oktober 2006 Del Skrevet 6. oktober 2006 Hei igjen. Dette ser fremdeles ikke ut til å fungere. La inn en Libpath til location for begge filene i prosjektet, men den vil fremdeles ikke linke. Som sag vet jeg ikke hvordan jeg kan linke i CMD prompt, så jeg gjorde dette i VS05. Men jeg skjønner fremdeles ikke hvorfor den ikke skal klare å linke filene, det er jo egentlig bare 2 filer i hele prosjektet. Det er TrePaaRad.cpp og TPR.h, og jeg bruker #include "TPR.h", hvor TPR.h definerer enum playstatus og playstatus winner. Jeg føler meg litt lost nå. Vil det hjelpe noe hvis jeg legger ut koden i TrePaaRad.cpp? -Thibadeaux 7014375[/snapback] okei, ja - legg ut begge filene Lenke til kommentar
Thibadeaux Skrevet 6. oktober 2006 Forfatter Del Skrevet 6. oktober 2006 (endret) Her kommer det. Er litt rotete kode, jeg vet det, men det har du sikkert sett før Til info så er playstatus winner den siste metoden i fila. //TrePaaRad.cpp #include <iostream> #include <cstdlib> #include <ctime> #include <string> #include "TPR.h" using namespace std; int main() { char board[7][7], board2[7][7]; int teller = 1; for(int i=0; i<7; i++) { for(int j=0; j<7; j++) { if(j%2==1 && i%2==1) { board[i][j] = ' '; board2[i][j] = ' '; teller++; } else if(j==6) { board[i][j] = '*'; board2[i][j] = '*'; } else { board[i][j] = '*'; board2[i][j] = '*'; } } } board2[1][1] = '1'; board2[1][3] = '2'; board2[1][5] = '3'; board2[3][1] = '4'; board2[3][3] = '5'; board2[3][5] = '6'; board2[5][1] = '7'; board2[5][3] = '8'; board2[5][5] = '9'; cout << "Welcome to Tic-Tac-Toe" << endl << endl; instructions(); displayBoard(board2); cout << "Press Enter to start the game" << endl; cin.ignore(cin.rdbuf()->in_avail()+1); char PlayMore = 'n'; char move[2]; do { cout<<"Player 1: \n"; char Player1 = askForPiece(); char Player2 = opponent(Player1); char turn = 'X'; displayBoard(board); while(winner(board[7][7])==NO_ONE_YET){ if(turn==Player1){ move[2] = chooseMove(board, Player1); board[move[0]][move[1]]=Player1; } else{ move[2] = chooseMove(board, Player2); board[move[0]][move[1]]=Player1; } displayBoard(board); turn = opponent(turn); } playstatus win = winner(board[7][7]); announceWinner(win, Player1, Player2); cout << "Do you want to play one more time?(y/n)" << endl << endl; cin >> PlayMore; } while(PlayMore == 'y' || PlayMore == 'Y'); return 0; } void instructions() { cout << "The object of the game is to get 3 of your markers in a row, vertically, horisontally or diagonally." << endl; cout << "The player that starts, will get the marker X, the other player will get the marker O." << endl; cout << "The spots you can place your marker in, are numbered, see the illustration below." << endl; cout << "The game will now start, enjoy" << endl; } /*char makeBoard() { char board[7][7]; for(int i=0; i<7; i++) { for(int j=0; j<7; j++) { if(j%2==1 && i%2==1) board[i][j] = ' '; else if(j==6) { board[i][j] = '*'; } else board[i][j] = '*'; } } return board[7][7]; //displayBoard(board); }*/ void displayBoard(char board[7][7]) { for(int k=0; k<7; k++) { for(int d=0;d<7;d++) { cout << board[k][d]; if(d==6) cout << "\n"; } } } char askYesNo(string question) { char answer; do { cout << question << "(y/n)" << endl; cin >> answer; } while(answer != 'y' && answer != 'Y' && answer != 'n' && answer != 'N'); return answer; } int askNumber(string question,int low, int high) { int number=0; do { cout << question << ", " << low << " - " << high << endl; cin >> number; } while(number < low || number > high); return number; } char askForPiece() { char marker; char answer; cout << "Player 1, do you want to start the game?" << endl << endl; cin >> answer; if(answer == 'y' || answer == 'Y') { marker = 'X'; cout << "Player 1 starts the game, and gets the marker \"X\"" << endl; cout << "Player 2 gets the marker \"O\"" << endl; } else { marker = 'O' ; cout << "Player 2 starts the game, and gets the marker \"X\"" << endl; cout << "Player 1 gets the marker \"O\"" << endl; } return marker; } char opponent(char marker) { char m_opponent; if(marker == 'X') m_opponent = 'O'; else m_opponent = 'X'; return m_opponent; } playstatus winner(char board[7][7]) { playstatus status; for(int i=1; i<7; i+=2) { if(board[i][1] == 'X' && board[i][3] == 'X' && board[i][5] == 'X') status = X_WON; else if(board[1][i] == 'X' && board[3][i] == 'X' && board[5][i] == 'X') status = X_WON; else if((board[1][1] == 'X' && board[3][3] == 'X' && board[5][5] == 'X') || ((board[1][3] == 'X' && board[3][3] == 'X' && board[5][1] == 'X'))) status = X_WON; else if(board[i][1] == 'O' && board[i][3] == 'O' && board[i][5] == 'O') status = O_WON; else if(board[1][i] == 'O' && board[3][i] == 'O' && board[5][i] == 'O') status = O_WON; else if((board[1][1] == 'O' && board[3][3] == 'O' && board[5][5] == 'O') || ((board[1][3] == 'O' && board[3][3] == 'O' && board[5][1] == 'O'))) status = O_WON; else status = TIE; } return status; } bool isLegal(char board[7][7], char move[2]) { bool legal = false; if(board[move[0]][move[1]] == ' ') legal = true; else legal = false; return legal; } char chooseMove(char board[7][7], char marker) { cout << "Player: " << marker; int movenumb = askNumber("Where would you like to place your next piece?", 1,9); char move[2]; while(!isLegal(board, move)) { cout << "That spot is allready taken, please choose another spot." << endl; movenumb = askNumber("Where would you like to place your next piece?", 1,9); } if(movenumb == 1) { move[0] = '1'; move[1] = '1'; } else if(movenumb == 2) { move[0] = '1'; move[1] = '3'; } else if(movenumb == 3) { move[0] = '1'; move[1] = '5'; } else if(movenumb == 4) { move[0] = '3'; move[1] = '1'; } else if(movenumb == 5) { move[0] = '3'; move[1] = '3'; } else if(movenumb == 6) { move[0] = '3'; move[1] = '5'; } else if(movenumb == 7) { move[0] = '5'; move[1] = '1'; } else if(movenumb == 8) { move[0] = '5'; move[1] = '3'; } else if(movenumb == 9) { move[0] = '5'; move[1] = '5'; } Clear(); return move[2]; } void announceWinner(int win, char m_player1, char m_player2) { cout << "And the winner is..." << endl << endl; cout << "Player 1" << endl << endl; } inline void Clear() { system("cls"); } Det er koden i den eneste .cpp fila i prosjektet. Her kommer header filen. //TPR.h #include <string> #include <iostream> using namespace std; enum playstatus{X_WON, O_WON, TIE, NO_ONE_YET}; void instructions(); char askYesNo(string question); int askNumber(string question, int min, int max); char askForPiece(); char opponent(char marker); void displayBoard(char board[7][7]); playstatus winner(char board); bool isLegal(char board[7][7], char move[2]); char chooseMove(char board[7][7], char marker); void announceWinner(int win, char m_player1, char m_player2); char makeBoard(); inline void Clear(); Håper dette hjelper deg litt med å hjelpe meg -Thibadeaux Endret 6. oktober 2006 av Thibadeaux Lenke til kommentar
lnostdal Skrevet 6. oktober 2006 Del Skrevet 6. oktober 2006 ... playstatus winner(char board) //[7][7]) { ... ..men det er endel annet som ser rart ut her; du bør kompilere med full warning-generering (-Wall) slik at du får noen tips av kompileren .. her er et utdrag av det som dukker opp her: blah.cpp:143: error: invalid types ‘char[int]’ for array subscript ... ... blah.cpp: In function ‘bool isLegal(char (*)[7], char*)’: blah.cpp:167: warning: array subscript has type ‘char’ ... blah.cpp: In function ‘int main()’: blah.cpp:310: warning: array subscript has type ‘char’ blah.cpp:310: warning: array subscript has type ‘char’ ... blah.cpp:314: warning: array subscript has type ‘char’ Lenke til kommentar
Thibadeaux Skrevet 6. oktober 2006 Forfatter Del Skrevet 6. oktober 2006 Okay Så det var rett og slett fordi det ikke var deklarert riktig ja...jaja =) takk for hjelpen. Skall se på det med å putte inn wall som parameter =) Tusen takk for hjelpa -Thibadeaux Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå