Gå til innhold

Problemer med djgpp


Anbefalte innlegg

jeg har installert en dos-kompilator for c++ som heter djgpp.

dessverre får jeg en feilmelding når jeg skal kompilere filene mine.

 

Jeg lagde et enkelt "hello, world!" program:

  #include <iostream>
 int main()
   {
   cout << "Hello, World\n";
   return -1;
   }

feilmeldingen blir slik:

C:\DJGPP\PROGS>gpp hello.cc

hello.cc: In function 'int main()':

hello.cc:4: error: 'cout' was not declared in this scope

Hvorfor får jeg denne meldingen?

Lenke til kommentar
Videoannonse
Annonse
[...] men feilen var visst at jeg hadde skrevet <iostream> istedenfor <iostream.h>

Nei, <iostream> er riktig. Problemet var at du ikke hadde fortalt kompilatoren at cout ligger i namespace std.

 

Riktig måte er slik:

 

 

#include <iostream>

int main()
{
    using std::cout;
    cout << "Hello world!\n";
    return 0;
}

 

Eller slik:

 

#include <iostream>

int main()
{
    using namespace std;
    cout << "Hello world!\n";
    return 0;
}

Lenke til kommentar
[...] men feilen var visst at jeg hadde skrevet <iostream> istedenfor <iostream.h>

 

Nei, <iostream> er riktig. Problemet var at du ikke hadde fortalt kompilatoren at cout ligger i namespace std.

 

Riktig måte er slik:

 

#include <iostream>

int main()
{
   using std::cout;
   cout << "Hello world!\n";
   return 0;
}

Hmm.. :hmm: har da brukt visual c++ før uten namespace std linjen.. merkelig

hva betyr egentlig den linjen? Må jeg skrive noe mer for å bruke cin og andre commandoer?

 

 

Jobber forresten med et lite program nå:

#include <iostream>

int main()

{
 using namespace std;
 int hemmeligTall = 1 + (rand()%10);
 int gjettetTall = 111;

 while (hemmeligTall != gjettetTall)
 {
   cout << "Hvilket tall tenker jeg paa?";
   cin >> gjettetTall;
   cout << "\n";

   if (gjettetTall == hemmeligTall)
   {
     cout << "Riktig!!";
   }
   else if (gjettetTall > hemmeligTall)
   {
     cout << "For stort!!";
   }
   else 
   {
     cout << "For lavt!!";
   }

   cout << "\n\n\n";
 
 }

return 0;

}

Det er to problemer:

1. hemmeligTall blir alltid 3

2. Får en feilmelding som sier

One or more CON code pages invalid for given keyboard code
når jeg kjører programmet. Endret av nahoy
Lenke til kommentar
while (1)
{
  cout << "Hvilket tall tenker jeg paa?";
  cin >> gjettetTall;
  cout << "\n";

  if (gjettetTall == hemmeligTall)
  {
    cout << "Riktig!!";
    break;      
  }

  else if (gjettetTall > hemmeligTall)
  {
    cout << "For stort!!";
  }
  else
  {
    cout << "For lavt!!";
  }

  cout << "\n\n\n";

}

return 0;

}

Skjønte helt hva du mente med det andre, men er ikke dette en såkalt infinity-loop?

1 vil alltid være 1 og dermed alltid være true.

Lenke til kommentar

rand() % 10 er "riktig" måte å gjøre det på, i alle fall i et enkelt eksempel som dette. rand() % 10 gir et pseudo-tilfeldig tall mellom 0 og 9, inklusivt.

 

Du vil nok få et bedre resultat om du bruker srand(time(0)); i programmet ditt:

 

#include <iostream>
#include <ctime>

int main()
{
    using namespace std;
    srand(time(0));
    cout << "Random number: " << rand();
    cout << "\nBetween 0 and 9: " << rand() % 10 << endl;
 return 0;
}

Lenke til kommentar
Hmm.. :hmm: har da brukt visual c++ før uten namespace std linjen.. merkelig

Sikker på at det ikke var <iostream.h> du inkluderte da, i stedet for <iostream>?

<iostream.h> er utdatert, og i alle fall med gcc får man advarsel om man bruker den.

Poenget med å pakke ting inn i namespaces er å unngå kollisjoner mellom navn.

Si at to biblioteker har funksjonen cleanup(), for å rydde opp. Da må de gis navn som foo_cleanup() og bar_cleanup().

Hvis de i stedet bruker namespaces så har du f.eks Foo::cleanup() og Bar::cleanup().

Om du bare bruker et av de, så er det ingenting i veien for å bruke using namespace Foo;, og da kan du bare bruke cleanup().

Lenke til kommentar

Du må seede random generatoren din, ellers vil du få samme random verdier hver ang. Prøv:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
 int i;

 if((argc > 1) && !strcmp(argv[1], "-seed")) 
   {
     printf("seeding...\n");
     srand(time(0) + getpid());
   }

 printf("10 random numbers: ");
 for(i = 0; i < 10; i++ )
   printf("%3d%c", rand() % 100, (i == 9) ? '\n' : ' ');

 return 0;
}

 

 

kjør denne med og uten -seed opsjonen noen ganger ;)

Lenke til kommentar
Med all respekt, kattemat, han skriver C++ under Windows. Er det ikke da litt skivebom å servere C for Linux(/Unix)?

Tja...mulig jeg burde lest tråden fra toppen, men om vi fjerner getpiden(og unistd?) så bør det vel kompilere på win32 også? Har ikke noe windows boks å teste på dog.

 

Uansett, var bare for å illustrere et poeng men litt praktisk testing... om det da er C eller C++ en bruker så gjør det strengt tatt ikke så mye så lenge det er C bibliotek funksjoner en snakker om?

men for all del la meg prøve å spytte sammen et c++ eksempel:

#include <iostream>
#include <iomanip>
#include <ctime>
#include <string>

using namespace std;

int 
main(int argc, char *argv[])
{
 int i;
 
 if(argc > 1)
   {
     string s(argv[1]);

     if(!s.compare("-seed"))
     {
         cout << "seeding..." << endl;
         srand(time(0));
     }
   }
 
 cout << "10 random numbers: ";

 for(i = 0; i < 10; i++ )
   cout << setw(4) << rand() % 100;

 cout << endl;
 
return 0;
}

 

La oss virkelig håpe dette fungerer på win32 da... :whistle:

 

(EDIT: ble litt stygg formatering)

Endret av kattemat
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...