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

Obiekt przekazywany przez referencje do funkcji i zapis do pliku.

Ostatnio zmodyfikowano 2014-01-21 14:08
Autor Wiadomość
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 : )

C/C++
#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 ) ];
   
}
P-102695
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.
P-102701
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.

@:
C/C++
#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.
P-102704
alixir
» 2014-01-21 13:30:54
Dobrze zrozumiałeś.
A co do dwóch pozostałych to np:

C/C++
void los( int, std::string *, char * );
bool sprawdz( int, std::fstream &, std::string * );

I potem wywołanie w programie
los( j, tekscik, tab );
P-102708
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...
C/C++
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;
    //itp
Daje mi:

\main.cpp|39|error: 'tekscik' was not declared in this scope|

P-102709
alixir
» 2014-01-21 13:41:13
Zjadłeś nazwę zmiennej:


C/C++
int sprawdz( int in, std::string * tekscik )
{
    ..
P-102711
mgrD
Temat założony przez niniejszego użytkownika
» 2014-01-21 13:46:54
C/C++
#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
P-102713
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)
P-102715
« 1 » 2
  Strona 1 z 2 Następna strona