Rafi Temat założony przez niniejszego użytkownika |
[ Code::Block ] Nie wykrywa klas przy kompilacji programu. » 2013-06-15 18:23:22 Witam! Ucząc się z Symfonii C++ Standard trafiłem na przykład programu tworzącego wyświetlacze na ekranie alfanumerycznym. Przepisałem go, ale nie chce sie uruchomić, bo nie wykrywa nagłówków("No such file or directory", ale w drzewku projektowym te pliki są). Oto kod: przyrzad.h: #ifndef PRZYRZAD_H #define PRZYRZAD_H
class przyrzad { public: przyrzad( void ); przyrzad( int, int, string, string, int = 0 ); void zmien_wskazanie( int w ); void narysuj; private: string nazwa; string jednostki; int pokazuje; int x, y; static int ile_nieznanych };
#endif
ekran_numeryczny #ifndef EKRAN_NUMERYCZNY_H #define EKRAN_NUMERYCZNY_H
#include <string> #include <iostream> #include <cmath> #include <ctime>
using namespace std;
class ekran_numeryczny { public: enum { szerokosc_ekranu = 80, wysokosc_ekranu = 25 }; ekran_numeryczny( char znak = ' ' ) : znak_tla( znak ); { wyczysc(); } void wyczysc(); void wyswietl() { cout << tresc << flush; } void napisz( int kolumna, int rzad, string tekst ) { tresc.replace(( szerokosc_ekranu * rzad ) + kolumna, tresc.length(), tekst ); } void wyczysc() { int ile_znakow = wysokosc_ekranu * szerokosc_ekranu; tresz.assign( ile_znakow, znak_tla ); } private: string tresc; char znak_tla; };
#endif
przyrzad.cpp #include "przyrzad.h" #include "ekran_numeryczny" #include <sstream>
ekran_numeryczny ekran;
string liczba_na_napis( int wartosc );
przyrzad::przyrzad( int xx, int yy, string nn, string jedn, int w ) : nazwa( nn ) , jednostki( jedn ) , pokazuje( w ) , x( xx ) , y( yy ) { narysuj(); }
przyrzad::przyrzad( void ) { ++ile_nieznanych; jednostki = " "; nazwa + "Wskaznik nr "; nazwa += liczba_na_napis( ile_nieznanych ); x = 33 y = 1 +( ile_nieznanych - 1 ) * 4; pokazuje = 0; narysuj(); }
void przyrzad::zmien_wskazanie( int w ) : pokazuje( w ) { narysuj(); }
void przyrzad::narysuj() { ekran.napisz( x, y, "_________________" ); ekran.napisz( x, y + 1, "| |" ); ekran.napisz( x, y + 2, "| |" ); ekran.napisz( x, y + 3, "|_________________|" ) ekran.napisz( x + 4, y + 1, nazwa ); ekran.napisz( x + 7, y + 2, liczba_na_napis( pokazuje ) ); ekran.napisz( x + 14, y + 2, jednostki ); ekran.wyswietl(); }
int przyrzad::ile_nieznanych;
string liczba_na_napis( int wartosc ) { if( wartosc == 0 ) return "0"; string rezultat; if( wartosc < 0 ) { rezultat += "_"; wartosc = - wartosc; } int reszta = wartosc; int pulap_dolny =( int ) pow( 10.0,( int log10(( double ) wartosc ) ); for(; pulap_dolny > 0; pulap_dolny /= 10 ) { int cyfra = reszta / pulap_dolny; reszta = reszta % pulap_dolny; rezultat += char( '0' + cyfra ); } return rezultat; }
main #include "ekran_numeryczny" #include "przyrzad.h"
extern ekran_numeryczny ekran;
int zwloka();
using namespace std;
int main() { ekran.wyczysc(); przyrzad Pred( 2, 1, "Predkosc", "wezwlow", 110 ); przyrzad Vari( 2, 7, "Wzoszenie", "stopy/sec" ); przyrzad A; przyrzad B; volatile przyrzad C; const przyrzad Udzw( 2, 11, "Udzwig maksymalny", "ton", 15000 ); for( inti = 0; i < 30; i++ ) { Vari.zmien_wskazanie( i ) Pred.zmien_wskazanie( 110 + 1 ); A.zmien_wskazanie( - i ); B.zmien_wskazanie( i % 4 ); zwloka( 1 ); } }
void zwloka( int sekund ) { time_t poczatkowy_czas = time( NULL ); while( time( NULL ) - poczatkowy_czas < sekund ); }
|
|
unimator |
» 2013-06-15 19:26:36 Literówka: #include "ekran_numeryczny"
I nie jest to błąd edytora a kompilatora (jak zresztą każdy błąd kompilacji), taki szczegół. |
|
Rafi Temat założony przez niniejszego użytkownika |
» 2013-06-15 19:53:49 Niestety, po poprawieniu też nie chce się kompilować. |
|
unimator |
» 2013-06-15 20:05:00 Daje ten sam błąd czy inny? I daj pełny log kompilacji jak możesz. |
|
zpiotr11 |
» 2013-06-15 20:54:12 Ja mam małe pytanie: czy można dodawać ten sam #include "ekran_alfanumeryczny.h" dwa razy? |
|
Rafi Temat założony przez niniejszego użytkownika |
» 2013-06-15 21:08:51 @up Można, bo w nagłówki jest strażnik. @2up Ten sam, oto log -------------- Build: Release in wadsa (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -Wall -fexceptions -O2 -c "C:\Users\Kamil\Documents\C++\Nowy folder\wadsa\main.cpp" -o obj\Release\main.o C:\Users\Kamil\Documents\C++\Nowy folder\wadsa\main.cpp:1:30: fatal error: ekran_numeryczny.h: No such file or directory compilation terminated. Process terminated with status 1 (0 minutes, 0 seconds) 1 errors, 0 warnings (0 minutes, 0 seconds)
|
|
MrPoxipol |
» 2013-06-15 21:12:26 Sprawdź, czy "ekran_numeryczny.h" jest widziany z tego pliku, w którym go załączasz. |
|
unimator |
» 2013-06-15 21:13:03 @zpiotr11 To zależy, chociaż zapewne masz na myśli sytuację plik1.cpp i plik2.cpp (dwa pliki modułowe w tym samym projekcie). W takim przypadku można dołączyć ten sam plik nagłówkowy (.h) do tych dwóch plików modułowych (raz, chociaż zależnie od tego co w pliku modułowym się znajduje można i wiele razy - nie ma to jednak sensu). Poza tym tak długo jak korzystasz z takiego "triku": #ifndef NAZWA_PLIKU_H #define NAZWA_PLIKU_H ... #endif
nie musisz się martwić, że dołączyłeś coś o jeden raz za dużo. @Rafi Jeśli pliki modułowe (.cpp) masz w folderze "files", to pliki nagłówkowe (.h) (przy obecnych dyrektywach preprocesora) również muszą znajdować się w tym samym folderze (bezpośrednio). Jeśli znajdują się w podfolderze to używasz takiej konstrukcji: #include "nazwa_katalogu\(...)\plik.h"
Jeśli natomiast pliki nagłówkowe znajdują się w zupełnie innym miejscu na komputerze to podajesz ich pełną ścieżkę: #include "C:\katalogA\katalogB\(...)\plik.h"
@Pefkos Tak to jest jak edytor mnie wyręcza :P |
|
« 1 » 2 |