mgrD Temat założony przez niniejszego użytkownika |
Obiekt przekazywany przez referencje do funkcji i zapis do pliku. » 2014-01-21 10:57:54 Witam, poniżej przedstawię kod mojego programiku, który działa poprawnie tylko wtedy, gdy z funkcji "sprawdź" pozbędę się wersu "std::getline( heh, str )". W innym wypadku program nie zapisuje danych do pliku(losowanie odbywa się sprawnie). Sądzę, że być może być to przez referencje, ponieważ pierwszy raz jej użyłem właśnie - no ale niestety nie znam się, aż tak dobrze, by móc sobie rozwiązać problem samodzielnie. Proszę o pomoc : ) #include <iostream> #include <ctime> #include <string> #include <fstream>
char tab[] = "987ABC"; std::string tekscik[ 10 ]; std::string str; int found; bool x;
void los( int index ); bool sprawdz( int in, std::fstream & heh );
int main() { std::fstream plik( "liczby.txt", std::ios::out | std::ios::in | std::ios::app ); srand( time( NULL ) ); for( int j = 1; j < 10; j++ ) { los( j ); x = sprawdz( j, plik ); while( x == true ) { tekscik[ j ].clear(); los( j ); x = sprawdz( j, plik ); } plik << j << ": " << tekscik[ j ] << "\n"; std::cout << j << ": los: " << tekscik[ j ] << std::endl; } plik.close(); return 0; }
bool sprawdz( int in, std::fstream & heh ) { for( int p = 0; p < in; p++ ) if( tekscik[ p ] == tekscik[ in ] ) return 1; while( std::getline( heh, str ) ) { found = str.find( tekscik[ in ] ); if( found == std::string::npos ) { return 1; break; } } return 0; }
void los( int index ) { for( int i = 1; i < 4; i++ ) tekscik[ index ] += tab[ rand() %( sizeof( tab ) - 1 ) ]; }
|
|
alixir |
» 2014-01-21 12:55:42 Twoim problemem jest ogólnie fakt, iż próbujesz odczytywać i zapisywać w tym samym pliku. W ten sposób się raczej nie da. Musiałbyś wczytać plik, zamknąć go i dopiero otworzyć ponownie do zapisu. Odnośnie przekazywania przez referencję to nie widzę błędu. Co innego reszta programu . Usuń z deklaracji funkcji nazwy parametrów pozostawiając tylko typy, unikaj jak ognia zmiennych globalnych – przekazuj je przez parametry.
|
|
mgrD Temat założony przez niniejszego użytkownika |
» 2014-01-21 13:06:39 Skoro da się otworzyć plik do odczytu i zapisu jednocześnie myślałem, że tak się uda - no ale nic, szkoda. Co do Twojego ostatniego zdania... zaraz poprawię program i wrzucę kod to zobaczymy, czy dobrze zrozumiałem :) Ogólnie dziękuję za rady. @: #include <iostream> #include <ctime> #include <string> #include <fstream>
char tab[] = "987ABC"; std::string tekscik[ 10 ];
void los( int ); int sprawdz( int );
int main() { int x; srand( time( NULL ) ); for( int j = 1; j < 10; j++ ) { los( j ); x = sprawdz( j ); while( x == 1 || x == 2 ) { tekscik[ j ].clear(); los( j ); x = sprawdz( j ); } std::cout << j << ": los: " << tekscik[ j ] << std::endl; } return 0; }
int sprawdz( int in ) { int found; std::string str; for( int p = 0; p < in; p++ ) if( tekscik[ p ] == tekscik[ in ] ) return 1; std::fstream plik( "liczby.txt", std::ios::out | std::ios::in | std::ios::app ); while( std::getline( plik, str ) ) { found = str.find( tekscik[ in ] ); if( found != std::string::npos ) { str.clear(); plik.close(); return 2; break; } str.clear(); plik.close(); } std::fstream plik2( "liczby.txt", std::ios::out | std::ios::in | std::ios::app ); plik2 << in << ": " << tekscik[ in ] << "\n"; plik2.close(); return 0; }
void los( int index ) { for( int i = 1; i < 4; i++ ) tekscik[ index ] += tab[ rand() %( sizeof( tab ) - 1 ) ]; }
Trochę zastosowałem się do wskazówek lecz nie moge poradzić sobie z referencją klasy string ;/ PS: zapis do pliku już działa. |
|
alixir |
» 2014-01-21 13:30:54 Dobrze zrozumiałeś. A co do dwóch pozostałych to np: void los( int, std::string *, char * ); bool sprawdz( int, std::fstream &, std::string * );
I potem wywołanie w programie los( j, tekscik, tab ); |
|
mgrD Temat założony przez niniejszego użytkownika |
» 2014-01-21 13:32:39 Poprawiłem kod w poście powyżej, zaraz wrzucę z tymi referencjami : ) @: Hmm... int sprawdz( int, std::string * );
int sprawdz( int in, std::string * ) { int found; std::string str; for( int p = 0; p < in; p++ ) if( tekscik[ p ] == tekscik[ in ] ) return 1;
Daje mi: \main.cpp|39|error: 'tekscik' was not declared in this scope|
|
|
alixir |
» 2014-01-21 13:41:13 Zjadłeś nazwę zmiennej: int sprawdz( int in, std::string * tekscik ) { ..
|
|
mgrD Temat założony przez niniejszego użytkownika |
» 2014-01-21 13:46:54 #include <iostream> #include <ctime> #include <string> #include <fstream>
void los( int, std::string *, char * ); int sprawdz( int, std::string * );
int main() { int x; char tab[] = "987ABC"; std::string tekscik[ 10 ]; srand( time( NULL ) ); for( int j = 1; j < 10; j++ ) { los( j, tekscik, tab ); x = sprawdz( j, tekscik ); while( x == 1 || x == 2 ) { tekscik[ j ].clear(); los( j, tekscik, tab ); x = sprawdz( j, tekscik ); } std::cout << j << ": los: " << tekscik[ j ] << std::endl; } return 0; }
int sprawdz( int in, std::string * tekscik ) { int found; std::string str; for( int p = 0; p < in; p++ ) if( tekscik[ p ] == tekscik[ in ] ) return 1; std::fstream plik( "liczby.txt", std::ios::out | std::ios::in | std::ios::app ); while( std::getline( plik, str ) ) { found = str.find( tekscik[ in ] ); if( found != std::string::npos ) { str.clear(); plik.close(); return 2; break; } str.clear(); plik.close(); } std::fstream plik2( "liczby.txt", std::ios::out | std::ios::in | std::ios::app ); plik2 << in << ": " << tekscik[ in ] << "\n"; plik2.close(); return 0; }
void los( int index, std::string * tekscik, char * t ) { for( int i = 1; i < 4; i++ ) tekscik[ index ] += t[ rand() %( sizeof( t ) - 1 ) ]; }
Po dodaniu tych wskaźników na tablice i obiekt string program coś "wariuje" bo nie losuje 3 znaków: http://iv.pl/images/96329990892534565140.jpg && http://iv.pl/images/31656301697298244731.jpg |
|
alixir |
» 2014-01-21 14:00:56 Problemem jest zapis ( sizeof( t ) - 1 ) w funkcji los. Zamiast rozmiaru tablicy obecnie otrzymujesz rozmiar wskaźnika. Zamień to do testów na liczbę, lub przekaż rozmiar kolejnym parametrem. Choć w sumie to raczej powodowało by losowanie z zawężonego zakresu. Ogólnie unikaj powielania nazw parametrów używanych w funkcjach z nazwami zmiennych z funkcji main (chodzi mi tu o tab i tekscik) |
|
« 1 » 2 |