W1ll_3ty Temat założony przez niniejszego użytkownika |
Poziom 4 Rozdział 34 Zadanie domowe nr 1 - Błąd przy kompilacji » 2018-08-18 12:47:07 Witam, rozwiązuję właśnie 1. zadanie domowe z podanego wyżej rozdziału i podczas kompilacji programu (według mnie skończonego) CodeBlocks przenosi mnie do innego "projektu" dokładniej o nazwie "ios_base.h" i pokazuje kilka nie zrozumiałych mi błędów ale w tym drugim kodzie(ios_base.h) W trakcie tworzenie tego tematu zauważyłem, że dwa błędy(które wpisałem na dole(dwa ostatnie)) odnoszą się do mojego programu. Sprawdziłem to w takim razie i z pomocą kursu doszedłem do tego, że przekazują uchwyt do pliku, podczas tworzenia argumentów funkcji nie tworzyłem tego uchwytu jako referencji. Nie rozumiem dlaczego trzeba tak robić, ale po poprawieniu tego (ifstream plik na ifstream & plik) program się kompiluje ale pojawia się okienko ale jest puste. Dodałem tu kod źródłowy ale w razie czego ten z błędami. Nowy różni się tylko dodaniem referencji w argumentach funkcji podczas tworzenia uchwytu do pliku. Proszę o pomoc :) #include <iostream> #include <string> #include <fstream> using namespace std;
int przekazywanie( int & a, ifstream plik ) { plik >> a; if( plik.fail() ) return false; return true; }
int plikBlad( ifstream plik ) { char l; plik.clear(); plik >> l; }
int sumowanie( int a, int & suma, ifstream plik ) { cout << a << " "; suma += a; }
int wczytywaniePliku() { ifstream plik; int a; int suma = 0; plik.open( "nieprawidlowosci.txt" ); if( !plik.good() ) return false; while( true ) { if( !plik.good() ) break; else { while( !przekazywanie( a, plik ) ) plikBlad( plik ); sumowanie( a, suma, plik ); } } plik.close(); cout << endl << suma; }
int main() { if( wczytywaniePliku == false ) cout << "Nie udalo sie wczytac pliku."; return 0; }
||=== Build file: "no target" in "no project" (compiler: unknown) ===| C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\ios_base.h|849|error: 'std::ios_base::ios_base(const std::ios_base&)' is private| C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\basic_ios.h|67|error: within this context| C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\fstream|455|note: synthesized method 'std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)' first required here | C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\streambuf|804|error: 'std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]' is private| C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\fstream|72|error: within this context| C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\fstream|455|note: synthesized method 'std::basic_filebuf<char>::basic_filebuf(const std::basic_filebuf<char>&)' first required here | C:\Users\Maciek\Desktop\C++\18.zaddom.cpp||In function 'int wczytywaniePliku()':| C:\Users\Maciek\Desktop\C++\18.zaddom.cpp|41|note: synthesized method 'std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)' first required here | C:\Users\Maciek\Desktop\C++\18.zaddom.cpp|6|note: initializing argument 2 of 'int przekazywanie(int&, std::ifstream)'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
|
|
pekfos |
» 2018-08-18 12:49:57 Nie możesz przekazać pliku przez wartość, bo jest niekopiowalny. if( wczytywaniePliku == false )
|
To nie jest wywołanie funkcji. Połowa twoich funkcji nie zwraca wartości, a określiłeś typ zwracany na int. |
|
W1ll_3ty Temat założony przez niniejszego użytkownika |
» 2018-08-18 12:54:16 A jeśli zmieniłbym to na if( bool spr = wczytywaniePliku == false )
Bo widziałem raz chyba w kursie że tak gdzieś było. A 2, że zawsze tworzę funkcje przez int, ponieważ mimo że nie zwracają zawsze wartości to zawsze mi działają. |
|
W1ll_3ty Temat założony przez niniejszego użytkownika |
» 2018-08-18 12:57:47 Ale nawet w kursie jest tak: int main() { if( odczytajPlik( "cpp0x.txt" ) ) std::cout << "Plik zostal wczytany!" << std::endl; return 0; }
|
|
pekfos |
» 2018-08-18 13:04:06 To nie jest wywołanie funkcji. Funkcje - pierwsze starcieTu znajdziesz, jak wygląda wywołanie funkcji. A 2, że zawsze tworzę funkcje przez int, ponieważ mimo że nie zwracają zawsze wartości to zawsze mi działają. |
"Nigdy nie rozglądam się przed przejściem przez ulicę i jakoś nigdy nie przejechał mnie samochód!" Niezwracanie wartości z funkcji ma niezdefiniowane zachowanie. Funkcje - pierwsze starcieTu znajdziesz, jak wygląda funkcja, która nic nie zwraca. Pisanie zawsze int, to celowe pisanie błędnego kodu. |
|
W1ll_3ty Temat założony przez niniejszego użytkownika |
» 2018-08-18 13:04:35 Chciałem jeszcze tylko dopowiedzieć, że zawsze tworzę funkcję przez int, ponieważ nie jestem też pewien, czy jeśli w argumentach jest referencja, to czy ma być int, czy void. |
|
pekfos |
» 2018-08-18 13:05:29 zawsze tworzę funkcję przez int, ponieważ nie jestem też pewien, czy jeśli w argumentach jest referencja, to czy ma być int, czy void. |
Skąd pomysł, że jest jakikolwiek związek między jednym i drugim? |
|
W1ll_3ty Temat założony przez niniejszego użytkownika |
» 2018-08-18 13:07:14 Bo wydawało mi się, że skoro jest referencja i zmienię wartość tej zmiennej w jakiejś funkcji, to tak jakby ta funkcja zwracała wartość. |
|
« 1 » 2 |