Gå til innhold

Linke problemer i c++.


Anbefalte innlegg

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
Videoannonse
Annonse

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 av lnostdal
Lenke til kommentar

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 av Thibadeaux
Lenke til kommentar
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

Her kommer det.

 

Er litt rotete kode, jeg vet det, men det har du sikkert sett før :p

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 av Thibadeaux
Lenke til kommentar

...
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...