Micah Temat założony przez niniejszego użytkownika |
[Kurs C++, XX.] Ćw. 2 » 2009-08-26 19:27:43 Program DEV-C++ podczas kompilacji wyrzuca mi pewne błędy. Nie znam się jeszcze na C++ zbyt dobrze, więc nie wiem, o co chodzi z tymi błędami. Oto log kompilacji (niestety, zapomniałem, jak się daje tekst w cytacie, więc z góry przepraszam za "prostotę"): Kompilator: Default compiler Building Makefile: "D:\Moje dokumenty\Folder roboczy\Projekty\C++\Makefile.win" Wykonywanie make... make.exe -f "D:\Moje dokumenty\Folder roboczy\Projekty\C++\Makefile.win" all g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"
main.cpp: In function `int main()': main.cpp:17: error: `struct std::ios::base' has not been declared
main.cpp:30: error: `struct std::ios::base' has not been declared main.cpp:30: error: `out' undeclared (first use this function) main.cpp:30: error: (Each undeclared identifier is reported only once for each function it appears in.) main.cpp:34: error: `linia' undeclared (first use this function)
main.cpp: In function `int Odczyt(const std::string&, std::string)': main.cpp:46: error: `struct std::ios::base' has not been declared main.cpp:49: error: expected init-declarator before '-' token main.cpp:49: error: expected `,' or `;' before '-' token main.cpp:51: error: declaration of 'std::string linia' shadows a parameter
main.cpp:65: error: invalid use of member (did you forget the `&' ?)
main.cpp:76: error: expected `(' before "linia" main.cpp:85: error: expected `(' before "linia" main.cpp:91: error: `linial' undeclared (first use this function) main.cpp:92: error: `ostatni' undeclared (first use this function) main.cpp:97: error: `non' undeclared (first use this function) main.cpp:97: error: `cookie' undeclared (first use this function) main.cpp:101: error: expected `(' before "linia" main.cpp:107: error: expected primary-expression before "else" main.cpp:107: error: expected `;' before "else" main.cpp:114: error: a function-definition is not allowed here before '{' token
main.cpp:114: error: expected `,' or `;' before '{' token main.cpp:124: error: a function-definition is not allowed here before '{' token main.cpp:124: error: expected `,' or `;' before '{' token main.cpp:152: error: expected `}' at end of input main.cpp:152: error: expected `}' at end of input make.exe: *** [main.o] Error 1 Wykonanie zakończone A to kod programu: #include <iostream> #include <conio.h> #include <sstream> #include <fstream>
using namespace std;
int Odczyt( const string & nazwa ); int Przerobka( int zalogowani, int zarejestrowani, int wszyscy ); void Zapis( const string & nazwa );
int main() { using std::ios::base; using std::string; const string nazwa = "dane.txt"; Odczyt( nazwa ); int zal, zar, wsz; Przerobka( zal, zar, wsz ); Zapis( nazwa ); fstream plik; plik.open( nazwa.c_str(), ios::base::out ); while( !plik.eof() ) { getline( plik, linia ); cout << linia << endl; } getch(); return( 0 ); }
int Odczyt( const string & nazwa, string linia ) { using std::ios::base; using std::string; string aktywni, ostatnie, non - cookie; string linia; bool good(); fstream plik; plik.open( nazwa.c_str(), ios_base::in ); while( !plik.eof() ) { getline( plik, linia ); if( plik.open = good() ) { while( !plik.eof() ) { getline( plik, linia ); aktywni = linia; getline( plik, linia ); if linia.find( digit ) if linia.find( digit ) { sscanf( linia.c_str(), "%d", & zalogowani ); } getline( plik, linia ); if linia.find( digit ) { sscanf( linia.c_str(), "%d", & zarejestrowani ); } getline( plik, linial ); ostatni = linia; getline( plik, linial ); non - cookie = linia; getline( plik, linial ); if linia.find( digit ) { sscanf( linia.c_str(), "%d", & wszyscy ); } } else cout << "Nie udalo sie otworzyc pliku!"; return( 0 ); } int Przerobka( int zalogowani, int zarejestrowani, int wszyscy ) { zarejestrowani = zarejestrowani + 2; wszyscy = wszyscy - zalogowani; plik.close(); return( 0 ); } void Zapis( const string & nazwa ) { using std::iosbase; using std::string; std::stringstream IntToStr; int pozycja; string bufor; IntToStr >> zalogowani; IntToStr >> zarejestrowani; IntToStr >> wszyscy; fstream plik.open( nazwa.c_str(), ios_base::out ); getline( plik, bufor ); plik << "Obecnie aktywnych: " <<& aktywni << endl << "Zalogowanych: " << zalogowani << endl << "Zarejestrowanych: " << zarejestrowani << endl << "Ostatnie 24h: " << ostatnie << endl << "Non-cookie 24h: " << non - cookie << endl << "Wszystkich: " << wszyscy; plik.close(); return( 0 ); } Bardzo chciałbym prosić Was o pomoc w znalezieniu źródła tych błędów. Z góry dziękuję. P.S.: Tylko się zagłębić w trudniejsze sprawy i już głowa odpada. A nie chciałem przerabiać żywcem skopiowanego kodu z lekcji, bo wolałem napisać program od podstaw. Proszę o usunięcie tej kopii tematu. |
|
malan |
» 2009-08-26 20:30:50 No trochę tych błędów narobiłeś: 1. Jeśli zastosowałeś zapis using namespace std przed mainem to w dalszej części programu nie musisz już używać std::. 2. using std::ios::base; using std::string; Co tu robi using ? Moim zdanie on tu być nie powinien. Przecież w nagłówku masz już using namespace std. //1 Tego zapisu używa się np. w funkcji, która otwiera plik. To tu raczej nie potrzebne. Poza tym jest on błędny. 3. plik.open( nazwa.c_str(), ios::base::out ); ios::base::out ? hmm... ios::out chyba :). 4. int Odczyt( const string & nazwa ); void Zapis( const string & nazwa ); Skoro przed zmienną dodałeś const to ona i tak się nie zmieni, więc nie wiem po co referencja (&). No to mniej więcej wszystko. Podsumowując- przeczytaj kurs raz jeszcze :). |
|
GoldWolf |
» 2009-08-26 20:38:29 Jeśli zastosowałeś zapis using namespace std przed mainem to w dalszej części programu nie musisz już używać std::.Nie jest to dobra technika, ale na razie w kursie nie ma nic jak sobie z tym poradzić. |
|
malan |
» 2009-08-26 23:28:40 ten_zuy jak zaczynałeś programować to wszystko od razu wiedziałeś ? ;>. Nie wiedziałem, że to kopiowanie zajmuje aż tyle czasu... No, ale człowiek uczy się całe życie :). |
|
Micah Temat założony przez niniejszego użytkownika |
» 2009-08-27 10:22:42 Uprościłem trochę metodę działania programu, aby lepiej zrozumieć kod. Poza tym udało mi się naprawić parę błędów. Oto nowy kod : #include <iostream> #include <conio.h> #include <sstream> #include <fstream>
using namespace std;
int Odczyt( const string nazwa ); int Przerobka( int zalogowani, int zarejestrowani, int wszyscy ); void Zapis( const string nazwa );
int main() { const string nazwa = "dane.txt"; string linia; string aktywni; string noncookie; string ostatnie; int zalogowani, zarejestrowani, wszyscy; Odczyt( nazwa ); int zal, zar, wsz; Przerobka( zal, zar, wsz ); Zapis( nazwa ); cout << "Obecnie aktywnych: " << aktywni << endl << "Zalogowanych: " << zalogowani << endl << "Zarejestrowanych: " << zarejestrowani << endl << "Ostatnie 24h: " << ostatnie << endl << "Non-cookie 24h: " << noncookie << endl << "Wszystkich: " << wszyscy; getch(); return( 0 ); }
int Odczyt( const string & nazwa ) { string linial; string aktywni; string ostatnie; string noncookie; int & zalogowani, & zarejestrowani, & wszyscy; bool good(); fstream plik; plik.open( nazwa.c_str(), ios::in ); while( !plik.eof() ) { getline( plik, linial ); & aktywni = linial; getline( plik, linial ); sscanf( linial.c_str(), "%d", & zalogowani ); getline( plik, linial ); sscanf( linial.c_str(), "%d", & zarejestrowani ); getline( plik, linial ); & ostatnie = linial; getline( plik, linial ); & noncookie = linial; getline( plik, linial ); sscanf( linial.c_str(), "%d", & wszyscy ); return( 0 ); } int Przerobka( int zalogowani, int zarejestrowani, int wszyscy ); { zarejestrowani = zarejestrowani + 2; wszyscy = wszyscy - zalogowani; plik.close(); return( 0 ); } void Zapis( const string nazwa ); { using std::iosbase; std::stringstream IntToStr; int pozycja; string bufor; IntToStr >> zalogowani; IntToStr >> zarejestrowani; IntToStr >> wszyscy; fstream plik; plik.open( nazwa.c_str(), ios::out ); getline( plik, bufor ); plik <<& aktywni << endl <<& zalogowani << endl <<& zarejestrowani << endl <<& ostatnie << endl <<& noncookie << endl <<& wszyscy; plik.close(); return( 0 ); } } Ale wyskoczyły mi nowe błędy, np. że nie zainicjowałem pewnych zmiennych. Tylko jak to zrobić? Oto log kompilacji : Kompilator: Default compiler Building Makefile: "D:\Moje dokumenty\Folder roboczy\Projekty\C++\Makefile.win" Wykonywanie make... make.exe -f "D:\Moje dokumenty\Folder roboczy\Projekty\C++\Makefile.win" all g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"
main.cpp: In function `int Odczyt(const std::string&)': main.cpp:56: error: `zalogowani' declared as reference but not initialized main.cpp:56: error: `zarejestrowani' declared as reference but not initialized main.cpp:56: error: `wszyscy' declared as reference but not initialized main.cpp:71: error: non-lvalue in assignment main.cpp:86: error: non-lvalue in assignment main.cpp:91: error: non-lvalue in assignment main.cpp:115: error: `std::iosbase' has not been declared
make.exe: *** [main.o] Error 1
Wykonanie zakończone Nie wiem, jak to naprawić. |
|
Micah Temat założony przez niniejszego użytkownika |
» 2009-08-27 16:48:00 Zacząłem program od nowa, tyle że najpierw rozpisałem sobie wszystko w głównej funkcji, a dopiero potem poprzenosiłem do funkcji. Na razie jednak nie brałem się za ".find()". Niestety parę razy zadeklarowałem zmienną plikową, co pewnie przeciążyło nieco program. Oto nowy kod: #include <iostream> #include <conio.h> #include <fstream> #include <sstream>
using namespace std;
void Odczyt( const string & nazwa, string linia ); int Zmiana( int & zalogowani, int & zarejestrowani, int & wszyscy ); void Zapis( const string & nazwa, string & bufor, int & zarejestrowani, int & wszyscy );
int main() { using std::ios_base; const string nazwa = "dane.txt"; string linio; Odczyt( nazwa, linio ); int zal, zar, wsz; Zmiana( zal, zar, wsz ); string bufek; Zapis( nazwa, bufek, zar, wsz ); fstream plikus; plikus.open( nazwa.c_str(), ios::in ); while( !plikus.eof() ) { getline( plikus, linio ); cout << linio; } getch(); return( 0 ); }
void Odczyt( const string & nazwa, string linia ) { fstream plik; plik.open( nazwa.c_str(), ios::in ); string bufor[ 6 ]; for( short i = 1; i <= 2; i++ ) { getline( plik, linia ); bufor[ i ] = linia; } int zalogowani; sscanf( linia.c_str(), "%d", zalogowani ); getline( plik, linia ); bufor[ 3 ] = linia; int zarejestrowani; sscanf( linia.c_str(), "%d", zarejestrowani ); for( short i = 1; i <= 3; i++ ) { getline( plik, linia ); bufor[ i + 3 ] = linia; } int wszyscy; sscanf( linia.c_str(), "%d", wszyscy ); return( plik.close() ); }
int Zmiana( int & zalogowani, int & zarejestrowani, int & wszyscy ) { zarejestrowani += 2; wszyscy -= zalogowani; return( 0 ); }
void Zapis( const string & nazwa, string & bufor, int & zarejestrowani, int & wszyscy ) { stringstream IntToStr; IntToStr >> zarejestrowani; IntToStr >> wszyscy; bufor[ 3 ] = zarejestrowani; bufor[ 6 ] = wszyscy; fstream plik; plik.open( nazwa.c_str(), ios::out ); for( short i = 1; i <= 6; i++ ) plik << bufor[ i ] << endl; return( plik.close() ); } Jednak kiedy uruchamiam ten program, to pokazuje mi się raport o błędzie i zamyka program, a w pliku *.txt nic się nie zmienia. Screenshot (z góry przepraszam, jeżeli naruszę jakąś zasadę co do miniatur): http://img216.imageshack.us/img216/7355/zrzuto.jpgTu jest plik "dane.txt" potrzebny do działania programu : http://www.space-nation.eu/?d=19F22E111 . Czy u Was również są takie dziwne sytuacje po skompilowaniu tego programu ? Znowu kiedy kompiluję przykład z wyżej wymienionej lekcji, to program uruchamia się na sekundę, a potem się zamyka i również nie ma żadnych zmian w pliku "mojplik.txt". Jeszcze wcześniej po skompilowaniu tego przykładu równiez pojawiał się raport o błędzie. Jak myślicie, skąd te raporty o błędach i brak jakiegokolwiek widocznego działania ze strony programu ? Pytam się o to, bo może kompilator DEV-C++ nie kompiluje prawidłowo pewnych operacji, przez co "psuje" program. A może wina jest w czymś innym... P.S.: Program napisany jest trochę na szybko, więc nie ma wypisania tekstów z "Panelu Logowania", takich jak "Obecnie aktywnych: ", itd. Może dopiszę je jeszcze później. //:: Popraw adres do screen'a, bo wyskakuje 404. Edit: W moim programie dodałem w głównej funkcji przed "getch();" polecenie "plikus.close();" (zapomniałem, że przecież trzeba zamknąć plik po skończeniu operacji). Miałem po drodze jeszcze jeden bład, ale go naprawiłem, usuwając kompresję in'ów string'i, ale pprzedni błąd znów się pojawił. Oto nowy kod : #include <iostream> #include <conio.h> #include <fstream> #include <sstream>
using namespace std;
void Odczyt( const string & nazwa, string linia ); int Zmiana( int & zalogowani, int & zarejestrowani, int & wszyscy ); void Zapis( const string & nazwa, string & bufor, int & zarejestrowani, int & wszyscy );
int main() { using std::ios_base; const string nazwa = "dane.txt"; string linio; Odczyt( nazwa, linio ); int zal, zar, wsz; Zmiana( zal, zar, wsz ); string bufek; Zapis( nazwa, bufek, zar, wsz ); fstream plikus; plikus.open( nazwa.c_str(), ios::in ); getline( plikus, linio ); cout << "Obecnie aktywnych: " << linio << endl; getline( plikus, linio ); cout << "Zalogowanych: " << linio << endl; getline( plikus, linio ); cout << "Zarejestrowanych: " << linio << endl; getline( plikus, linio ); cout << "Ostatnie 24h: " << linio << endl; getline( plikus, linio ); cout << "Non-cookie 24h: " << linio << endl; getline( plikus, linio ); cout << "Wszystkich: " << linio << endl; plikus.close(); getch(); return( 0 ); }
void Odczyt( const string & nazwa, string linia ) { fstream plik; plik.open( nazwa.c_str(), ios::in ); string bufor[ 6 ]; for( short i = 1; i <= 2; i++ ) { getline( plik, linia ); bufor[ i ] = linia; } int zalogowani; sscanf( linia.c_str(), "%d", zalogowani ); getline( plik, linia ); bufor[ 3 ] = linia; int zarejestrowani; sscanf( linia.c_str(), "%d", zarejestrowani ); for( short i = 1; i <= 3; i++ ) { getline( plik, linia ); bufor[ i + 3 ] = linia; } int wszyscy; sscanf( linia.c_str(), "%d", wszyscy ); return( plik.close() ); }
int Zmiana( int & zalogowani, int & zarejestrowani, int & wszyscy ) { zarejestrowani += 2; wszyscy -= zalogowani; return( 0 ); }
void Zapis( const string & nazwa, string & bufor, int & zarejestrowani, int & wszyscy ) { bufor[ 3 ] = zarejestrowani; bufor[ 6 ] = wszyscy; fstream plik; plik.open( nazwa.c_str(), ios::out ); for( short i = 1; i <= 6; i++ ) { if(( i != 3 ) &( i != 6 ) ) plik << bufor[ i ] << endl; else if( i = 3 ) plik << zarejestrowani << endl; else if( i = 6 ) plik << wszyscy << endl; } return( plik.close() ); } Będę wdzięczny za wszelkie uwagi. |
|
GoldWolf |
» 2009-08-28 22:11:10 Przede wszystkim program, nadal nie działa, pojawiają się błędy.
Po drugie powinieneś już sam starać sobie tworzyć własne zabezpieczenia. Jeżeli nie ma pliku dane.txt to warto by było napisać, że go nie ma i zakończyć działanie programu. Inaczej mówiąc brak mechanizmów bezpieczeństwa.
To Ty powinieneś wskazać gdzie jest błąd, to ćwiczenia bardzo łatwo pokazuje gdzie masz braki. Napisałeś program ale to za mało. Nie wystarczy skalkować rozwiązania.
Źle napisane jest funkcja -> void Odczyt(const string &nazwa,string linia);.
Uważam, że nie opanowałeś dobrze tematu. Funkcje nie zając nie uciekną. Spróbuj spokojnie napisać jeszcze raz zadanie lub cofnąć się o kilka kursów i przerobić ponownie.
|
|
DejaVu |
» 2009-08-28 23:04:23 Dante wie co mówi - on pisał do tych lekcji kursy i aktualizował ich treść. |
|
« 1 » 2 |