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

brak widzialnosci zmiennych

Ostatnio zmodyfikowano 2010-08-17 10:01
Autor Wiadomość
ricardo83
Temat założony przez niniejszego użytkownika
brak widzialnosci zmiennych
» 2010-08-16 17:34:21
witam
pisze program ktorego zadaniem jest ladowanie danych z pliku a nastepnie zapis danych do innego pliku. z ladowaniem danych z pliku sobie poradzilem (m.in. dzieki VND) ale problem pojawia sie przy zapisie tych danych do pliku, a mianowicie pewne zmienne jak gdyby tracily swoja widzialnosc i nie mozna sie do nich odwolac.
taki komentarz w kodzie pokazuje czego czepia sie kompilator
//<------------------------
C/C++
#include <iostream>
#include <fstream>
#include <ctime>

using namespace std;

int main()
{
    //obiekt ladowanie klasy fstream
    fstream ladowanie;
   
    //tymczasowa zmienna gdzie bedzie zapisywana liczba z charow z pliku
    char bufor[ 10 ];
   
    //deklaracja tablicy do ktorej beda zapisywane wymiary nowej tablicy
    int tablica[ 3 ];
   
    int i = 0, k = 0;
   
   
    //ladowanie danych z pliku
    ladowanie.open( "satimage.txt", ios::in | ios::binary );
   
    if( ladowanie.is_open() )
    {
        cout << "Poprawnie zaladowano plik :)\n";
        //ta petla laduje tylko pierwszy wiersz
        //ktory zawiera wymiar tablicy
        while( k < 3 )
        {
            //zapisz do bufora jeden znak
            bufor[ i ] = ladowanie.get();
            //jesli znak jest cyfra lub jest kropka
            if( isdigit( bufor[ i ] ) || bufor[ i ] == '.' )
            {
                //to zwieksz indeks aby kolejny znak(cyfra,kropka)
                //byl zapisany do nastepnego elementu tablicy bufor
                i++;
            }
            //jesli znak nie jest cyfra albo kropka
            else
            {
                //zabezpieczenie gdyby liczby byly oddzielane np. dwiema spacjami
                if( i > 0 )
                {
                    bufor[ i ] = '\0';
                    //przekonwertuj char na int-a
                    sscanf( bufor, "%d", & tablica[ k ] );
                    cout << tablica[ k ] << " ";
                    k++;
                    i = 0;
                }
            }
           
        }
       
        //liczba kolumn
        int g = tablica[ 2 ];
        //liczba wierszy
        int s = tablica[ 1 ] + 1;
       
        //deklaracja nowej tablicy gdzie beda zapisywane pozostale elementy
        int tablica_wlasciwa[ g ][ s ];
       
        //deklaracja zmiennych ktore powinny byc widzialne
        int w = 0, x = 0, i = 0; //<------------------------
       
       
        //druga petla wczytuje wlasciwe dane gdyz pierwsza zaczytywala tylko
        //wymiar nowo tworzonej tablicy
       
        //dopoki nie napotkasz konca pliku
        while( !ladowanie.eof() )
        {
           
            bufor[ i ] = ladowanie.get();
            if( isdigit( bufor[ i ] ) || bufor[ i ] == '.' )
            {
                i++;
            }
            else
            {
                if( i > 0 )
                {
                    bufor[ i ] = '\0';
                    sscanf( bufor, "%d", & tablica_wlasciwa[ w ][ x ] );
                   
                    i = 0;
                    if( x < s - 1 )
                    {
                        x++;
                    }
                    else
                    {
                        if( w < g )
                        {
                            w++;
                            x = 0;
                        }
                    }
                }
            }
        }
        ladowanie.close();
       
       
    }
    else
    {
        cout << "ERROR\n";
    }
   
    //zapis do pliku
    ofstream zapis;
   
    zapis.open( "zapisywanie.txt", ios::out );
    if( zapis.is_open() )
    {
        cout << "Udalo sie zaladowac plik do zapisywania danych\n";
       
        zapis << endl;
        w = 0, x = 0; //<------------------------
        while( w < g ) //<------------------------
        {
            while( x < s ) //<------------------------
            {
                zapis << tablica_wlasciwa[ w ][ x ] << " "; //<------------------------
                x++;
            }
            zapis << endl;
            w++;
        }
        zapis.close();
    }
    else
    {
        cout << "ERROR\n";
    }
    return 0;
}
wynik proby kompilacji
C: \Documents and Settings\Jacek\Moje dokumenty\c++\obsluga_pilkow_2\main.cpp||In function 'int main()': |
C: \Documents and Settings\Jacek\Moje dokumenty\c++\obsluga_pilkow_2\main.cpp|129|error: 'w' was not declared in this scope|
C: \Documents and Settings\Jacek\Moje dokumenty\c++\obsluga_pilkow_2\main.cpp|129|error: 'x' was not declared in this scope|
C: \Documents and Settings\Jacek\Moje dokumenty\c++\obsluga_pilkow_2\main.cpp|130|error: 'g' was not declared in this scope|
C: \Documents and Settings\Jacek\Moje dokumenty\c++\obsluga_pilkow_2\main.cpp|132|error: 's' was not declared in this scope|
C: \Documents and Settings\Jacek\Moje dokumenty\c++\obsluga_pilkow_2\main.cpp|134|error: 'tablica_wlasciwa' was not declared in this scope|
||=== Build finished: 5 errors, 0 warnings ===|

Pozdrawiam
P-20889
ison
» 2010-08-16 17:40:28
dlaczego uważasz że powinny być widzialne?
przykładowo:
C/C++
int main()
{
    {
        int a;
    }
    a = 5; //ta zmienna nie została zadeklarowana
}

jeśli chcesz aby była 'widzialna' wszędzie to zadeklaruj ją globalnie albo chociaż poza wszelkimi pętlami
i postaraj się robić większe wcięcia bo sam się potem pogubisz w tym wszystkim
P-20890
pekfos
» 2010-08-16 17:41:59
one chyba nawet nie są w tym samym bloku w którym ich używasz. zrób je jako globalne. W tym małym programie to raczej nie zaszkodzi.
P-20891
ricardo83
Temat założony przez niniejszego użytkownika
» 2010-08-16 18:14:45
no rzeczywiscie stworzylem te zmienna dopiero w bloku if i nie powinna byc widzialna. hmm ale jak ja zadeklarowac? to jaki powinna miec wymiar dowiaduje sie po wczytaniu dopiero 1 wiersza pliku(gdzie wlasnie zapisany jest wymiar). jedno rozwiazanie jakie mi przychodzi do zadeklarowac tez zmienna z odpowiednio wiekszym wymiarem ale wtedy bedzie to marnotrawstwo pamieci:(
moze macie jakis inny pomysl ?

Pozdrawiam
P-20892
pekfos
» 2010-08-16 18:22:25
int tablica_wlasciwa[ g ][ s ];
jakim cudem to nie błąd?
nie musisz deklarować zmiennych jak tylko pojawi się możliwość ich inicializacji.
Zrób je globalne.
P-20893
ricardo83
Temat założony przez niniejszego użytkownika
» 2010-08-17 09:27:51

int tablica_wlasciwa[g][s];
jakim cudem to nie błąd?wiem ze deklaracja wymiarow tablicy powinna nastapic jeszcze przed kompilacja ale akurat w tym programie ktory napisalem wymiar tablicy jest podany w pierwszej linii pliku, ktory bedzie dopiero ladowany:(

ale jak zadeklarowac tablice nie znajac jej wymiaru?


Pozdrawiam
P-20900
pekfos
» 2010-08-17 10:01:57
np tak:
C/C++
int ** tab; //wskaźnik na wskaźnik na int
//tablica dwuwymiarowa
Wskaźniki i dynamiczna alokacja się kłaniają
P-20901
« 1 »
  Strona 1 z 1