Skocz do zawartości

Problem Kompilacji - Getch()


matombo

Rekomendowane odpowiedzi

Witam!

 

Pewnego pieknego dnia stwierdzilem, ze warto nauczyc sie wspolczesnego jezyka programowania (mam tam jakies przygody z basic'iem i pascale'em). Moj wybor padl na C++ poniewaz podobno jest to najlepszy obecnie jezyk programowania - chociaz trudny.

 

Podeszlem do sprawy organicznie od podstaw i aby nie rzucac sie od razu na zbyt gleboka wode i sie nie zrazic zakupilem sobie ksiazke "Wstep do programowania w jezyku C++" Radoslawa Sokola wydawnictwa Helion. Ksiazka lopatologicznie napisana pozwalajaca na wejscie do hermetycznego jezyka informatycznego amatorom takim jak ja. Swoje zabawy z programowaniem uskuteczniam pod Linuksem chociarz ksiazka jest napisana do zabawy z kompilatorem MinGW pod winda. Spodziewalem sie roznic systemowych. Jednak korzystajac z dokumentacji dostepnej pod Linuxem bylem wstanie znalesc odpowiednie analogi np: stricmp() [Winda] - strcasecmp() [Linux] lub analogicznie strnicmp() - strncasecmp() - (itd, itp). Do czasu. Ponizej jest oryginalny kod programu z ksiazki:

 

#include <stdio.h>
#include <conio.h>

enum NKolorKarty {
   Trefl, Pik,
   Kier, Karo
};

NKolorKarty WczytajKolorKarty ()
{
   for(;;) {
      switch (getch()) {
         case 't': case 'T':
            return Trefl;
         case 'p': case 'P':
            return Pik;
         case 'k': case 'K':
            return Kier;
         case 'r': case 'R':
            return Karo;
         }
      }
}

int main()
{
   printf("\nWybierz kolor karty:\n"
          "[T] Trefle\n"
          "[P] Piki\n"
          "[K] Tiery\n"
          "[R] Karo\n"
          "Twój wybór: ");
   NKolorKarty Kolor = WczytajKolorKarty();
   switch(Kolor) {
   case Trefl:
      printf("\n\nWybrałeś trefle! \n\n");
      break;
   case Pik:
      printf("\n\nWybrałeś piki! \n\n");
      break;
   case Kier:
      printf("\n\nWybrałeś kiery! \n\n");
      break;
   case Karo:
      printf("\n\nWybrałeś karo! \n\n");
      break;
   }
   return 0;
}

 

Proba kompilacji daje wynik na ekranie.

 

[matombo@matombo cpp]$ g++ 7-05_.cpp -o 7-05_.o -Wall -s
7-05_.cpp: In function ‘NKolorKarty WczytajKolorKarty()’:
7-05_.cpp:12: error: ‘getch’ was not declared in this scope
[matombo@matombo cpp]$

 

Ok. Trafilem wiec na problem zgodnosci systemowych definicji funkcji bibiotecznych. Jest to zwiazane z funkcja getch(). Okazuje sie ze ta funkcja w linuksie istnieje i nalezy do <cureses.h>. Uwzdledniajac ten fakt w listingu programu i ponownie kompilujac dostaje komunikat:

 

[matombo@matombo cpp]$ g++ 7-05_.cpp -o 7-05_.o -Wall -s
/tmp/ccB7TtcD.o: In function `WczytajKolorKarty()':
7-05_.cpp:(.text+0x9): undefined reference to `stdscr'
7-05_.cpp:(.text+0x11): undefined reference to `wgetch'
collect2: ld returned 1 exit status
[matombo@matombo cpp]$

 

Czyli gucio.

Rozumiem ze zastosowanie funkcji getch() ma za zadanie pobrac znak z klawiatury niejako w tle tzn: bez pojawienia sie znaku na ekranie i bez nacisniecia enter. Zastosowanie funkcji getchar() z <stdio.h> powoduje ze program kompiluje sie bez problemow lecz funkcja ta realizuje calkiem inne zadanie i w tym kontekscie jest bez sensu.

 

Gdzie jest blad? Brakuje czegos w kodzie programu? Opcje kompilatora?

 

Czytajac manual do gcc poprostu poleglem - rozumiem poszczegolne slowa ale calych zdan juz nie. Manuale bibiotek tez sa dosc "smysnym" jezykiem napisane.

Pogooglalem wczoraj pare godzin ale niestety nie znalazlem odpowiedzi. Za to tyle chlamu znalazlem, ze glowa mala.

 

Wedrujac przez C++ nie chce zostawiac problemow, ktorych nie rozumiem bo utone jak siekiera

 

A przy okazji mam pytanie o linki do "wartych ogladniecia" stron, forow dotyczacych programowania.

Oraz literature, ktora warto a nawet trzeba przyswoic zeby napisac uzyteczny program pod linuksem. No bo coz - googlanie jakos sie nie sprawdza.

Oczywiscie jestem gotowy zainwestowac w to pieniadze.

 

Pozdrawiam.

Matombo

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

[matombo@matombo cpp]$ g++ 7-05_.cpp -o 7-05_.o -Wall -s
/tmp/ccB7TtcD.o: In function `WczytajKolorKarty()':
7-05_.cpp:(.text+0x9): undefined reference to `stdscr'
7-05_.cpp:(.text+0x11): undefined reference to `wgetch'
collect2: ld returned 1 exit status
[matombo@matombo cpp]$

 

Skoro korzystasz z jakiejś biblioteki, to chyba wypadałoby z nią zlinkowac wynikowy program, nie? Dodaj opcję -lcurses. Poza tym po co stripujesz program? Nie będziesz mógł go potem dobrze debugowac...

Odnośnik do komentarza
Udostępnij na innych stronach

Gdzie jest blad? Brakuje czegos w kodzie programu? Opcje kompilatora?

 

1.) wywal <conio.h> a wstaw #include <iostream> (opcjonalnie- ja lubie te biblioteke wiec na niej pracuje).

2.) wstaw po includach:

 

using namespace std;

 

a takze zamien to:

 

NKolorKarty WczytajKolorKarty ()
{
   for(;;) {
      switch (getch()) {
         case 't': case 'T':
            return Trefl;

 

na to:

 

NKolorKarty WczytajKolorKarty ()
{
   for(;;) {
   char karta;
    cin >> karta;
      switch (karta) {
         case 't': case 'T':
            return Trefl;

 

i bedzie dzialac :P

 

Poza tym radze zmienic zródlo wiedzy na inne. "Wstep do programowania w jezyku C++" jest beznadziejne, uczy fatalnych nawyków.

 

o jakich nawykach mówisz sorror ? bo ja tez uzywalem tej ksiazki i czasami jeszcze do niej zagladam.

 

Pozdro

Odnośnik do komentarza
Udostępnij na innych stronach

Dzieki serdeczne za wszystkie odpowiedzi.

 

A teraz pare komentarzy.

 

Skoro korzystasz z jakiejs biblioteki, to chyba wypadaloby z nia zlinkowac wynikowy program, nie? Dodaj opcje -lcurses. Poza tym po co stripujesz program? Nie bedziesz mógl go potem dobrze debugowac...

O ja mlotek, ze tez wczesniej na to nie wpadlem!!!.

 

A serio. Jak juz wspomnialem w poscie, korzystam z ksiazki napisanej generalnie pod Winde. Opisuje najbardziej postawowe elementy jezyka i odnosze wrazenie ze jest wiecej elementow samego C niz C++. Nie ma opisu funkcji, bibiotek, opcji kompilatora itd,itp. Dlatego tez uzywam anglojezycznej dokumentracji podrecznej z Linuksa w sytuacjach problemowych. Nie zawsze to dziala. OJ niekiedy to mam ekstremalnie k**ewski problem zakumac o co biega - rozumiem slowa ale calych zdan juz nie. Ale sie nie poddaje i walcze dalej.

 

Poza tym radze zmienic zródlo wiedzy na inne. "Wstep do programowania w jezyku C++" jest beznadziejne, uczy fatalnych nawyków.

1. Jestem poczatkujacym, nawet trudno powiedziec ze "programista". Nauczylem sie Linuksa sam w domu - przed komuterem z ksiazka na kolanach. I wciaz daleka droga przede mna. Tak samo uskuteczniam C++. Wobec czego nie mnie jest oceniac przydatnosc takiej czy innej literatuty. Przeciez nie jestem ekspertem. Dlatego w koncowce swojego posta jest zapytanie o literature i fora. Dlaczego?? Bo poczatkujacy nie wie nawet jakich slow kluczowych powinien uzyc w wyszukiwarce szukajac rozwiazania swojego czesto "banalnego" problemu. Odpowiedzi dostaje sie tysiace - a smieci w tym co niemiara. Wiem to po sobie.

 

2. Jak sie spojrzy w ksiegarni na polke z ksiazkami dotyczacymi C++ to czacha w poprzek staje. Dostepne jest mnostwo literatury. No i jak tu wybrac? Na moim etapie nauki jezyka literatura napisana jak ksiazka telefoniczna tj. w stylu: komenda, skladnia, zdanie opisu - lub podobnie, bez glebszego wyjasnienia danych aspektow jest praktycznie bezuzyteczna. Juz sie naciolem pare razy. A ksiazki informatyczne sa drogie (niewiedziec czemu - na dodatek wiekszosc z nich sie szybko dezaktualizuje). Na pozniejszych etapach a i owszem jak najbardziej.

 

3. Literatura z tej dziedziny dotyczy generalnie Windy. Jezeli w tresci ksiazki zaznaczone sa roznice miedzysystemowe to uwazam ze jest wysmienicie. Ale najczesciej tak nie jest. Ksiazek dedykowantych do programowania tylko i wylacznie pod Linuksa jest malo, powiedzialbym nawet - tylko kilka - i to w wersjach HARD tzn: kierowane do osob juz znajacych C++. Ponadto bardzo czesto naklad jest wyczerpany i nie ma wznowien.

 

Na marginesie - wiekszosc literatury do Linuksa jest napisane w wersji HARD - wyglada tak jakby pisane przez maniakow dla maniakow. I to jest jedna z przyczyn braku popularnosci Linuksa na jaka -uwazam- zasluguje. A zdanie to pisze na postawie opinii moich znajomych.

 

4. Dolaczenie tytulow dobrych ksiazek, linkow do stron, komentarzy podanych przez "starszych braci w C++" pozwoli osobom takim jak ja na dotarcie do konkretnej informacji. Nie bedzie potrzeby klikania na strony o programach wykladow z C++ na Politchnice w Bzdzinie Dolnej albo podobnie.

Odnośnik do komentarza
Udostępnij na innych stronach

Na początek najnowsze wydanie Symfonii C++ - generalnie nie ma problemów w kwestii OS-u. Na lekturze troszkę Ci zejdzie, potem chętnie podeślę Ci trochę wartościowej literatury już na wyższym poziomie ;-)

 

o jakich nawykach mówisz sorror ?

 

Nie zgłębiając się w szczegóły: potem ktoś korzysta z printf i myśli, że pisze w C++ ;-)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...