Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[ Code::Block ] Nie wykrywa klas przy kompilacji programu.

Ostatnio zmodyfikowano 2013-06-16 13:11
Autor Wiadomość
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:
C/C++
#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 // PRZYRZAD_H

ekran_numeryczny
C/C++
#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 // EKRAN_NUMERYCZNY_H
przyrzad.cpp
C/C++
#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
C/C++
#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 );
   
   
    //symulacja
    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 );
   
}
P-85635
unimator
» 2013-06-15 19:26:36
Literówka:
C/C++
#include "ekran_numeryczny" //Zamien na #include "ekran_numeryczny.h"
I nie jest to błąd edytora a kompilatora (jak zresztą każdy błąd kompilacji), taki szczegół.
P-85636
Rafi
Temat założony przez niniejszego użytkownika
» 2013-06-15 19:53:49
Niestety, po poprawieniu też nie chce się kompilować.
P-85637
unimator
» 2013-06-15 20:05:00
Daje ten sam błąd czy inny? I daj pełny log kompilacji jak możesz.
P-85639
zpiotr11
» 2013-06-15 20:54:12
Ja mam małe pytanie: czy można dodawać ten sam #include "ekran_alfanumeryczny.h" dwa razy?
P-85645
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)
 
P-85648
MrPoxipol
» 2013-06-15 21:12:26
Sprawdź, czy "ekran_numeryczny.h" jest widziany z tego pliku, w którym go załączasz.
P-85649
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":
C/C++
#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:
C/C++
#include "nazwa_katalogu\(...)\plik.h" //gdzie (...) to inne ewentualne katalogi
Jeśli natomiast pliki nagłówkowe znajdują się w zupełnie innym miejscu na komputerze to podajesz ich pełną ścieżkę:
C/C++
#include "C:\katalogA\katalogB\(...)\plik.h" //Zamiast backslashy możliwe, że trzeba użyć slashy

@Pefkos
Tak to jest jak edytor mnie wyręcza :P
P-85650
« 1 » 2
  Strona 1 z 2 Następna strona