Gdzie zapisać deklaracje tablicy jednowymiarowej?

0

Witam! Mam pytanie do Was. W jaki sposób mogę rozwiązać problem tablicy jednowymiarowej w tym programie. Okazuje się, ze w ze w else deklaracja tablicy nie może być zawarta w ifie, bo wtedy wyskakuje brak deklaracji tab. Jednocześnie, każda nowa deklaracja tablicy powoduje, ze zapisuje mi się tylko ostatni elementy, a reszta wykracza, pokazuje nie oczekiwany wynik. Naprzykład, gdy wpisuje 3 elementy
1: 1, 2: 2, 3: 3 wynik w tablicach jest: 1: -842150451, 2: -842150451, 3: 3

 private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
 if(licznik==0) 
                                {
					 //Pobieranie liczby elementów 
					 n=System::Convert::ToInt32(this->textBox1->Text);
					 this->textBox1->Text="";
					 licznik++;
					 //Zakonczenie pobierania liczby elementów
				 }
				 else
				 { 
						int *tab = new int [n];
						/*
						
						if (licznik==1)
						{
						// Komunikat  Błędu : identifier "tab" is undefined

							int *tab = new int [n];
						}*/

				//Pobieranie elementów
				
					tab[licznik-1]=System::Convert::ToInt32(this->textBox1->Text);
			         this->textBox1->Text="";
					licznik++;
                //Zakonczenie Pobierania elementów // 
					
					if(licznik==4 )
					{

                                               //Wynik w tablicach
						this->textBox3->Text=System::Convert::ToString(tab[0]);  
						this->textBox4->Text=System::Convert::ToString(tab[1]);
						this->textBox5->Text=System::Convert::ToString(tab[2]);
					}
....

Przydatne info:
a) licznik w konstruktorze ma już od górnie wartość 0
b) Program pisany jest w Visual Studio 2012 Ultimate
c) Jest to fragment aplikacji okienkowej

2

każde new int [n]; tworzy ci nową tablicę, starą zawartość (jeśli coś było) tracisz, i jeśli nie zrobiłeś delete na poprzedniej tablicy to masz wyciek pamięci.
poza tym przecież nie musisz robić new w tej samej linijce:

int *tab;
... milion linii kodu
tab = new int [n];

a tak w ogóle, jeśli ta tablica ma być zachowywana pomiędzy wywołaniami button1_Click, daj pole klasy:

private: cli::array<int> ^tab;

alokacja takiej tablicy wygląda tak:

tab = gcnew cli::array<int>(n);

i nie musisz jej zwalniać, zajmie się nią garbage collector.

1

Zawsze zadeklarować możesz jako składową klasy. Zwalniasz oczywiście w destruktorze, lub jak pokazał wyżej @Azarien zdać się na GC.

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