[C++] Dlaczego nie moge odwłać się do tablicy float w innej metodzie?
Ostatnio zmodyfikowano 2015-01-12 21:25
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 #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(); void WpiszLosowo(); void WpiszRecznie(); void ZmienKomorke(); void Wyswietl(); 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() {
char wybor; int r_kol, r_wier; int pomocnik;
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; }
|
|
killjoy |
» 2015-01-12 20:52:46 Tworzysz tu lokalną tablicę i operujesz na niej, a nie na polu klasy: 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; } }
|
|
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? |
|
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. |
|
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: class Tablica { public: Tablica( int r_wier, int r_kol ) { wier = r_wier; kol = r_kol; } void StworzTab(); void WpiszLosowo(); void WpiszRecznie(); void ZmienKomorke(); void Wyswietl(); 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::LiczSrednie() { 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; } }
|
|
« 1 » |