Ininicjalizacja tablicy

0

w skrócie

class klasa{
private int rozmiar;

/*...*/

klasa::klasa(int rozmiar){
	this->rozmiar=rozmiar;
};

void klasa::metoda(){
	int tab[this->rozmiar]; //taka inicjalizacja działa
	int tab[666]=0; //taka inicjalizacja działa
	int tab[this->rozmiar]={0}; //taka inicjalizacja działa

/* Tablica musi być statyczna gdyż wymaga tego rekurencjyność tej metody */
	static int tab[this->rozmiar]={0}; // coś takiego chciałbym osiągnąć - bez deklaracji "={0}" działa pod niektórymi kompilatorami gdzie jest domyślnie wyzerowana.
}
0

Tak jak Ty to przedstawiasz w każdym przypadku nie robi się tablic dynamicznych - jest to niezgodne ze standardem.

0

Niezgodne ze standardem... moglbym prosić o link do zmian i definicji najnowszego standardu?:)

Na razie ustawiłem tę tablicę 10000 elementów ale tę wartość jest osiągana niezwykle rzadko i nie zgrzytu jąder od tego dostaje - jak to poprawić/powinno wyglądać?

0

A czemu nie użyć std::vector?

0

nie robi się tablic dynamicznych
to nie są tablice dynamiczne! to są zwykłe tablice, tylko że o rozmiarze określonym przez zmienną (jest więc złagodzony warunek że przy deklaracji tablicy jej rozmiar musi być określany stałą). Takiej tablicy raz stworzonej nie da się zmienić rozmiaru, bo jest statyczna.

jest to niezgodne ze standardem
no i? niezgodne ze „standardem” jest wszystko, co wykracza poza aplikację konsolową na poziomie hello worlda.
I jest to, powtarzam po raz n-ty, zgodne ze standardem języka C. standard C++ co prawda tego (przynajmniej jeszcze) nie przewiduje, ale niektóre kompilatory obsługujące taką deklarację tablic w C dopuszczają też tę konstrukcję w C++ (nie ma wielkiego powodu, aby nie dopuszczać).

// coś takiego chciałbym osiągnąć
czyli wyzerować tablicę lokalną? użyj for.

for (int i=0;i<rozmiar;i++) tab[i]=0;

ale wracając do twojego kodu...

private int rozmiar;

to się nawet nie skompiluje! podawaj działające przykłady, a nie z toną literówek…

int tab[666]=0; //taka inicjalizacja działa

a figa. jakiego kompilatora używasz?

int tab1[this->rozmiar];  // OK
int tab2[666]=0;          // a.cpp:13:23: error: array must be initialized with a brace-enclosed initializer
int tab3[this->rozmiar]={0};       // a.cpp:14:35: error: variable-sized object 'tab3' may not be initialized
static int tab[this->rozmiar]={0}; // a.cpp:17:41: error: variable-sized object 'tab' may not be initialized
                                   // a.cpp:17:41: error: storage size of 'tab' isn't constant

wygląda na to, że GCC 4.5.0 nie lubi inicjalizacji takiej tablicy razem z deklaracją (dlatego użyj for) ani nie przejdzie to jako static – bo jest konflikt interesów: static oznacza że zmienna jest tak naprawdę globalna tylko ograniczona zasięgiem do danej funkcji, variable-sized oznacza że rozmiar określany jest na nowo przez zmienną podczas każdego wejścia do funkcji według aktualnej wartości tej zmiennej, a że jest to tablica zwykła (nie przydzielana dynamicznie) to podczas jej istnienia rozmiar nie może ulegać zmianie. Są to warunki niemożliwe do spełnienia jednocześnie.

0
Azrael_Valedhel napisał(a)

A czemu nie użyć std::vector?

Ta sama sytuacja:

 static vector<int> tab (this->rozmiar)

Wypróbuje konteneru "map" - jeżeli działa tak jak mi się wydaje to chyba będzie to najlepsze rozwiązanie.

0

Rozwiązaniem problemu mogło by być coś takiego tylko że działa tak tylko dla konstruktora
<code=c++>
void konstruktor():zmienna(rozmiar_tablicy){
}

Powiedzcie mi jak taki zabieg się nazywa to sobie doszukam reszty informacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1