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

[C++] Dlaczego nie moge odwłać się do tablicy float w innej metodzie?

Ostatnio zmodyfikowano 2015-01-12 21:25
Autor Wiadomość
kojot123
Temat założony przez niniejszego użytkownika
[C++] Dlaczego nie moge odwłać się do tablicy float w innej metodzie?
» 2015-01-12 20:50:01
Witam, zastanawia mnie dlaczego nie mogę odwołać się do tablicy " float tabSred " w innej metodzie, nie ma natomiast problemu z odwołaniem się do tablic typu int. Od czego to zależy? Będę wdzięczny za wszelką pomoc. Poniżej kod



 
C/C++
#include <math.h>
#include <iostream>  
#include <cstdlib>
#include <ctime>

using namespace std;

class Tablica
{
public:
   
   
    Tablica( int r_wier, int r_kol )
    {
        wier = r_wier;
        kol = r_kol;
    }
   
   
   
    void StworzTab();
   
    // metody obslugi
    void WpiszLosowo();
    void WpiszRecznie();
    void ZmienKomorke();
    void Wyswietl();
   
    //metody obliczen
    void ZnajdzMax();
    void ZnajdzMin();
    void LiczSumy();
    void LiczSrednie();
    void LiczOdchylenia();
   
   
   
   
   
   
   
private:
   
    int wier;
    int kol;
    int wpiszDoTab;
    int * tabSum;
    float * tabSred;
    int ** tab;
    int * tabMax;
    int * tabMin;
    float * tabOdch;
};


void Tablica::StworzTab()
{
   
    tab = new int *[ wier ];
   
    for( int i = 0; i < wier; i++ )
    {
        tab[ i ] = new int[ kol ];
    }
}

void Tablica::WpiszLosowo()
{
    srand( time( NULL ) );
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
           
            tab[ i ][ j ] =( rand() % 99 ) + 0;
           
        }
       
    }
   
   
}

void Tablica::WpiszRecznie()
{
   
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
            cout << "Wpisz element do kolumny:[" << i << "] wiersza:[" << j << "]";
            cin >> wpiszDoTab;
            tab[ i ][ j ] = wpiszDoTab;
           
        }
       
    }
   
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
            cout << "Element" << i << " " << j << ": " << tab[ i ][ j ] << endl;
           
        }
       
    }
}


void Tablica::Wyswietl()
{
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
           
            cout << tab[ i ][ j ] << " ";
        }
        cout << endl;
    }
}


void Tablica::LiczSumy()
{
    tabSum = new int[ kol + wier + 1 ];
    int licz = 1;
   
   
   
   
   
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
            tabSum[ 0 ] = tabSum[ 0 ] + tab[ i ][ j ];
        }
    }
   
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
            tabSum[ licz ] = tabSum[ licz ] + tab[ i ][ j ];
        }
        licz++;
    }
   
    for( int i = 0; i < kol; i++ )
    {
        for( int j = 0; j < wier; j++ )
        {
            tabSum[ licz ] = tabSum[ licz ] + tab[ j ][ i ];
        }
        licz++;
    }
   
   
   
}

void Tablica::LiczSrednie()
{
    float * tabSred = new float[ kol + wier + 2 ];
   
   
   
    tabSred[ 0 ] = float( tabSum[ 0 ] ) / float(( kol * wier ) );
   
    for( int i = 1; i < wier + 1; i++ )
    {
        tabSred[ i ] = float( tabSum[ i ] ) /( float ) kol;
    }
   
    for( int i = wier + 1; i < 1 + kol + wier; i++ )
    {
        tabSred[ i ] = float( tabSum[ i ] ) /( float ) wier;
    }
   
   
}

void Tablica::ZnajdzMax()
{
   
   
    tabMax = new int[ kol + wier + 1 ];
    int licz1 = 1;
   
   
   
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
            if( tab[ i ][ j ] > tabMax[ 0 ] )
                 tabMax[ 0 ] = tab[ i ][ j ];
           
        }
    }
   
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
            if( tab[ i ][ j ] > tabMax[ licz1 ] )
                 tabMax[ licz1 ] = tab[ i ][ j ];
           
        }
        licz1++;
    }
   
    for( int i = 0; i < kol; i++ )
    {
        for( int j = 0; j < wier; j++ )
        {
            if( tab[ j ][ i ] > tabMax[ licz1 ] )
                 tabMax[ licz1 ] = tab[ j ][ i ];
           
        }
        licz1++;
    }
   
   
   
   
}

void Tablica::ZnajdzMin()
{
   
    tabMin = new int[ kol + wier + 1 ];
    int licz = 1;
   
    for( int i = 0; i < kol + wier + 1; i++ )
    {
        tabMin[ i ] = 99;
    }
   
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
            if( tab[ i ][ j ] < tabMin[ 0 ] )
                 tabMin[ 0 ] = tab[ i ][ j ];
           
        }
    }
   
    for( int i = 0; i < wier; i++ )
    for( int j = 0; j < kol; j++ )
    {
        if( tab[ i ][ j ] < tabMin[ licz ] )
             tabMin[ licz ] = tab[ i ][ j ];
       
    }
    licz++;
}

for( int i = 0; i < kol; i++ )
{
    for( int j = 0; j < wier; j++ )
    {
        if( tab[ j ][ i ] < tabMin[ licz ] )
             tabMin[ licz ] = tab[ j ][ i ];
       
    }
    licz++;
}


}

void Tablica::LiczOdchylenia()
{
tabOdch = new float[ kol + wier + 1 ];



for( int i = 0; i < wier; i++ )
{
    for( int j = 0; j < kol; j++ )
    {
        tabOdch[ 0 ] = tabOdch[ 0 ] +(( float( tab[ i ][ j ] ) - tabSred[ 0 ] ) *( float( tab[ i ][ j ] ) - tabSred[ 0 ] ) );
       
    }
   
   
}

tabOdch[ 0 ] = sqrt( tabOdch[ 0 ] /( wier * kol ) );


cout << "Srednia calej tablicy: " << tabSred[ 0 ] << endl;

}



int main()
{
//zmienne
char wybor;
int r_kol, r_wier;
int pomocnik;


// menu startowe
cout << endl;
cout << " Obliczenia statystyczne dla tablicy dwuwymiarowej \n\n";
cout << " Zadeklaruj rozmiar tablicy: " << endl;
cout << " Liczba kolumn:  ";
cin >> r_kol;

cout << " Liczba wierszy: ";
cin >> r_wier;
cout << endl;

Tablica Statystyczna( r_wier, r_kol );
cout << endl;

Statystyczna.StworzTab();

cout << "Wypelnij Losowo  lub Recznie " << endl;
cin >> wybor;
if( wybor == 'l' )
{
   
    Statystyczna.WpiszLosowo();
}
else
{
    cout << " Wybrales recznie";
    Statystyczna.WpiszRecznie();
}

cout << endl;
Statystyczna.Wyswietl();
cout << endl;
Statystyczna.LiczSumy();

Statystyczna.LiczSrednie();

Statystyczna.ZnajdzMax();
Statystyczna.ZnajdzMin();
Statystyczna.LiczOdchylenia();



return 0;
}
P-124761
killjoy
» 2015-01-12 20:52:46
Tworzysz tu lokalną tablicę i operujesz na niej, a nie na polu klasy:
C/C++
void Tablica::LiczSrednie()
{
    float * tabSred = new float[ kol + wier + 2 ]; //dokładnie w tym miejscu
   
   
   
    tabSred[ 0 ] = float( tabSum[ 0 ] ) / float(( kol * wier ) );
   
    for( int i = 1; i < wier + 1; i++ )
    {
        tabSred[ i ] = float( tabSum[ i ] ) /( float ) kol;
    }
   
    for( int i = wier + 1; i < 1 + kol + wier; i++ )
    {
        tabSred[ i ] = float( tabSum[ i ] ) /( float ) wier;
    }
   
   
}
P-124762
kojot123
Temat założony przez niniejszego użytkownika
» 2015-01-12 21:02:57
Faktycznie, dzięki. Ale gdy tworzę tablicę w ciele klasy to wyskakuje:

[Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]

Czyli nie mogę deklarować wielkości tablicy w definicji klasy.

W jaki sposób mógłbym to zrobić, żeby było poprawnie?
P-124765
killjoy
» 2015-01-12 21:10:51
Czy Ty, czasem nie próbujesz inicjalizować tablicy w ciele klasy? Jeżeli tak, to wartości domyślne dla pól tablicy powinieneś nadawać w konstruktorze. Z logu natomiast wynika, że c++11 dopuszcza takie zachowanie(?). Zresztą pokaż linijkę, w której kompilator się pluje, to powiem Ci dokładniej o co biega.
P-124768
kojot123
Temat założony przez niniejszego użytkownika
» 2015-01-12 21:25:21
Program mi normalnie zadziałał wyrzucając tylko
[Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default],
ale już problem rozwiązałem usuwając lokalną deklaracje tablicy a w ciele klasy zostawiłem bez zmian czyli:

C/C++
class Tablica
{
public:
   
   
    Tablica( int r_wier, int r_kol )
    {
        wier = r_wier;
        kol = r_kol;
    }
   
   
   
    void StworzTab();
   
    // metody obslugi
    void WpiszLosowo();
    void WpiszRecznie();
    void ZmienKomorke();
    void Wyswietl();
   
    //metody obliczen
    void ZnajdzMax();
    void ZnajdzMin();
    void LiczSumy();
    void LiczSrednie();
    void LiczOdchylenia();
   
   
private:
   
    int wier;
    int kol;
    int wpiszDoTab;
    int * tabSum;
    float * tabSred;
    int ** tab;
    int * tabMax;
    int * tabMin;
    float * tabOdch;
};
...
C/C++
void Tablica::LiczSrednie()
{
    //float *  tabSred = new float[kol+wier+2];
   
    for( int i = 0; i < kol + wier + 2; i++ )
    {
        tabSred[ i ] = 0;
    }
   
    tabSred[ 0 ] = float( tabSum[ 0 ] ) / float(( kol * wier ) );
   
    for( int i = 1; i < wier + 1; i++ )
    {
        tabSred[ i ] = float( tabSum[ i ] ) /( float ) kol;
    }
   
    for( int i = wier + 1; i < 1 + kol + wier; i++ )
    {
        tabSred[ i ] = float( tabSum[ i ] ) /( float ) wier;
    }
}
P-124772
« 1 »
  Strona 1 z 1