Problem z uruchomieniem quizu

0

Mam problem z uruchomieniem całego projektu. Pojawia mi się taki błąd. Używam visual studio code.
collect2.exe: error: ld returned 1 exit status
.\a.exe : The term '.\a.exe' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1

  • .\a.exe
  •   + CategoryInfo          : ObjectNotFound: (.\a.exe:String) [], CommandNotFoundException
      + FullyQualifiedErrorId : CommandNotFoundException
    
    

Kod:

#include <iostream>
#include "pytanie.h"
#include <fstream>
#include <cstdlib>

using namespace std;

void Pytanie::wczytaj()
{
   fstream plik;
   plik.open("quiz.txt",ios::in);

   if(plik.good()==false)
   {
      cout<<"Nie udalo sie otworzyc pliku!";
      exit(0);
   }

   int nr_linii=(nr_pytania-1)*6+1;
   int aktualny_nr=1;
   string linia;

   while(getline(plik,linia))
   {
      if(aktualny_nr==nr_linii) tresc=linia;
      if(aktualny_nr==nr_linii+1) a=linia;
      if(aktualny_nr==nr_linii+2) b=linia;
      if(aktualny_nr==nr_linii+3) c=linia;
      if(aktualny_nr==nr_linii+4) d=linia;
      if(aktualny_nr==nr_linii+5) poprawna=linia;
      aktualny_nr++;
   }

   plik.close();

}

void Pytanie::zadaj()
{
   cout<<endl<<tresc<<endl;
   cout<<a<<endl;
   cout<<b<<endl;
   cout<<c<<endl;
   cout<<d<<endl;
   cout<<"------------------------"<<endl;
   cout<<endl<<"Odpowiedz: ";
   cin>>odpowiedz;
}

void Pytanie::sprawdz()
{
   if(odpowiedz==poprawna)
   {
      punkt=1;
   }
   else punkt=0;
}

#include <iostream>

using namespace std;

class Pytanie
{
   public:

   string tresc;
   string a,b,c,d;
   int nr_pytania;
   string poprawna;
   string odpowiedz;
   int punkt;

   void wczytaj(); //wczytuje pytania z pliku
   void zadaj(); //pokazuje pytanie, czyta odpowiedz
   void sprawdz(); //sprawdza poprawnosc odpowiedzi
};
#include <iostream>
#include "pytanie.h"

using namespace std;

int main()
{

   Pytanie p[5];
   int suma=0;
   for(int i=0; i<=4; i++)
   {
      p[i].nr_pytania=i+1;
      p[i].wczytaj();
      p[i].zadaj();
      p[i].sprawdz();
      suma+=p[i].punkt;
   }

   cout<<"KONIEC QUIZU! PUNKTY = "<<suma;

   return 0;
}
2

Ciekawa sprawa, dawno nie pisałem w C++, jeśli się zamieni #include "pytanie.h" na #include "pytanie.cpp" w pliku z main'em to wszystko zaczyna działać, ale to raczej nie powinno tak być, więc to raczej obejście problemu niż rozwiązanie go.

2

collect2.exe: error: ld returned 1 exit status - to mówi, że masz błąd linkera. Najpewniej nie kompilujesz wszystkich plików. W jakim środowisku piszesz?

2

Podejście całkiem niepoprawne.
Zobacz o ile prościej można zrobić:

#include <algorithm> // random_shuffle
#include <iostream> // cin, cout
//#include <fstream> // jeżeli czytamy z pliku
#include <sstream> // jeżeli czytamy ze string strumenia
#include <iomanip> // dla >>ws
#include <cctype> // toupper()
#include <cstdlib> // srand()
#include <ctime> // time()
using namespace std;

const char AnswerMin='A';
const char AnswerMax='D';
const int AnswerCount=(AnswerMax-AnswerMin+1);

class Question
{
   public:
   string question;
   string answers[AnswerCount];
   int points;
   bool read(istream &sin) // zakładamy że pierwsze poprawne, przy pytaniu 
   {
      getline(sin>>ws,question);
      for(int i=0;i<AnswerCount;++i) getline(sin>>ws,answers[i]);
      return (sin>>points); // zapomniałeś wczytać ilość punktów, zwróći prawdę jeżeli udąło się wczytać razem z punktami
   }
   int ask() //pokazuje pytanie, czyta odpowiedz, sprawdza
   {
      int order[AnswerCount];
      for(int &v:order) v=(&i-order); //order[0]=0; order[1]=1;
      random_shuffle(order,order+AnswerCount); // #include <algorithm>
      cout<<question<<endl;
      for(int i=0;i<AnswerCount;++i) cout<<(char)(AnswerMin+i)<<". "<<answers[order[i]]<<endl;
      for(char answer;;)
      {
         cout<<endl<<"Odpowiedz: ";
         cin>>answer;
         answer=toupper(answer); // #include <cctype>
         if((AnswerMin<=answer)&&(answer<=AnswerMax))
         {
         	return (order[answer-AnswerMin]?0:points); // jeżeli jest to odpowiedz o numerze 0 to naliczamy
		 }
		 else cout<<"Nie ma takiej opcji";
	  }
   }
};

int main()
{
	srand(time(0)); // #include <cstdlib> #include <ctime> dla random_shuffle
	Question q;
	int sum=0;
	istringstream sin
	(
		 "\
			 2*2=?\n\
				 4\n\
				 5\n\
				 3\n\
				 22\n\
			 10\n\
			 \
			 Kto ma kota?\n\
				 Ala\n\
				 Ewa\n\
				 Kasia\n\
				 Marta\n\
			 3\
		 "
	);
	//ifstream fin("Q.txt");
	while(q.read(sin)) // można zamiast sin czytać z fin
	{
		int add=q.ask();
		sum+=add;
		if(add) cout<<"Poprawnie, dodano punkty "<<add<<" razem "<<sum<<endl;
		else cout<<"Niepoprawnie"<<endl;
	}	
	return 0;
}
2

To jeszcze tylko wyjaśnię do końca na czym polegał problem, przy kompilacji trzeba podać wszystkie plik cpp np.: "g++ -g main.cpp pytanie.cpp"
W Visual Studio Code by działo się to automagicznie można zmienić sobie tasks.json tak by dla zadania kompilacji zamiast aktywnego pliku, kompilowały się wszystkie w folderze:
"${fileDirname}\*.cpp"

0

Dziękuje za wszystkie odpowiedzi. Kompilacja wszystkich plików pomogła ("g++ -g main.cpp pytanie.cpp").

1 użytkowników online, w tym zalogowanych: 0, gości: 1