Witam, ostatnio na forum znalazł się temat mojego autorstwa, w którym to miałem problemy z dynamiczną tablicą dwuwymiarową, po czym temat został zamknięty, ponieważ błąd został znaleziony.
Teraz chciałbym zadać pytanie, ponieważ naprawdę nie mogę zrozumieć pewnej kwestii.
string **modyfikuj(string **test, int *rozmiar)
{
int stary_rozmiar = *rozmiar;
*rozmiar = *rozmiar * 2;
string **nowa_tablica;
nowa_tablica = new string *[*rozmiar];
for(int i = 0; i < *rozmiar; i++)
{
nowa_tablica[i] = new string[*rozmiar];
}
int pomoc1 = -1;
int pomoc2 = -1;
bool pomoc_stop_liczenie;
for(int z = 0; z < *rozmiar; z++)
{
//pomoc_stop_liczenie = true;
//pomoc1 = 0;
for(int o = 0; o < *rozmiar; o++)
{
pomoc1++;
if(pomoc1 < stary_rozmiar)
{
nowa_tablica[z][o] = test[z][o]; //W tym miejscu powinien nadpisywaæ wartoœciami ze starej tablicy
}
cout << " POMOC1 = " << pomoc1 << "\n";
cout << "STARY_R = " << stary_rozmiar << " na " << stary_rozmiar << "\n";
cout << "AKTUALNY ROZMIAR: " << *rozmiar << " na " << *rozmiar << "\n";
cout << "\n\n";
//else
// {
//nowa_tablica[z][o] = "0"; //Z kolei w tym miejscu powinien przypisaæ zera wszystkiemu wzwy¿
//}
}
// if(!(pomoc1 < stary_rozmiar)) //to nadpiszemy w przysz³oœci (jak rozwinê kod)
// {
// pomoc1 = 0;
// }
//break;
}
return nowa_tablica;
for(int pomoc_usun = 0; pomoc_usun < stary_rozmiar; pomoc_usun++) //W tym miejscu usuwam tablicê dwuwymiarow¹,
{ //Nie jestem pewny "poprawnoœci" tej metody :/
delete[] test[pomoc_usun];
}
delete[] test;
}
To jest fragment kodu odpowiedzialny za powiększanie tablicy, w której zapisywane będą dane (tak wiem, nie jest to dobre rozwiązanie ponadto, że tablica alokuje mnóstwo pamięci niepotrzebnie, ale teraz nie zależy mi na czymś lepszym, bo chciałbym skończyć najpierw to).
W momencie, w którym odpalam program i zapisuję dane w tablicy, po czym następuje jej powiększenie i nadpisanie, dzieje się taka o to rzecz:
Wartości wyżej wpisuje użytkownik; w trakcie wpisywanie następuje powiększenie tablicy (zaczynamy od 3, potem staje się coraz większa o zmienna * 2 [w tym wypadku zmienna ma na początku wartość 3 i tak jest zwiększana]), ale w momencie, w którym chcę wyświetlić wartości zapisane w tablicy, dzieje się coś takiego, że rzuca mi danymi w różne strony i nie wyświetla tak, jak powinien.
Zmienna pomoc1, która jest zwiększana ma ogromne wartości, a odpowiada za ważny warunek - dzięki niej przypisywane są między innymi wartości (próbowałem również innymi sposobami, ale za chwilę przejdę do sedna)
Cout'y są dla mnie, na nie proszę nie zwracać uwagi. Tak tylko się upewniłem, że ze zmienną pomoc1 jest coś nie tak.
Ta zmienna pomoc1 ma ogromne wartości, bo nie mogę jej w żaden sposób zatrzymać.. Nie ważne w którym miejscu wymuszę jej wartość 0, aby liczyła mi od początku.
Przypisanie wymuszone, warunki na liczbach i boolach i czymkolwiek nie dały rady, po prostu w momencie, w którym wymuszam zero, program się zawiesza. Nie wiem w którym miejscu następuje nieprawidłowa alokacja i chciałbym prosić o radę dlaczego tak, a nie inaczej się dzieje. Dlaczego nie mogę wymusić tego zera? Nie mogę tego zrozumieć :/
Jeżeli znalazłaby się osoba, która chciałaby to odpalić, to proszę cały fragment kodu odpowiedzialny za to wszystko.
#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;
string **modyfikuj(string **test, int *rozmiar);
int main()
{
int rozmiar_p = 3;
string **test_tablica;
test_tablica = new string *[rozmiar_p];
for(int i = 0; i < 3; i++)
{
test_tablica[i] = new string[rozmiar_p];
}
string przypsz;
bool test_STOP = false;
int licz = 0;
while(true)
{
cout << "Przypisz wartosci!\n\n";
for(int u = 0; u < rozmiar_p; u++)
{
for(int h = 0; h < rozmiar_p; h++)
{
licz++;
cout << "test_tablica[" << u << "][" << h << "] = ";
cin >> przypsz;
if(przypsz == "1234") //Warunki odgrywają tu rolę testową.
{ //W przyszłości zostanie to napisane lepiej.
test_STOP = true;
}
if(test_STOP)
{
break;
}
if(przypsz == "1973")
{
cout << "\n\n\n";
break; //NOWY UZYTKOWNIK
}
if(licz == (rozmiar_p))
{
test_tablica = modyfikuj(test_tablica, &rozmiar_p);
}
test_tablica[u][h] = przypsz;
}
if(test_STOP)
{
break;
}
cout << "\n"; //Aby na ten moment wyglądało trochę ładniej
}
cout << "\nWartosc tablicy to:\n\n";
for(int y = 0; y < rozmiar_p; y++)
{
for(int e = 0; e < rozmiar_p; e++)
{
cout << "WARTOSC test_tablica[" << y << "][" << e << "] => " << test_tablica[y][e];
cout << "\n";
}
cout << "\n"; //Aby na ten moment wyglądało trochę ładniej
//Sleep(100000);
}
Sleep(100000); // TU MA SIE ZATRZYMAC! W innym przypadku będzie ciągle nam wyświetlać, tym nie ma co się przejmować
}
}
string **modyfikuj(string **test, int *rozmiar)
{
int stary_rozmiar = *rozmiar;
*rozmiar = *rozmiar * 2;
string **nowa_tablica;
nowa_tablica = new string *[*rozmiar];
for(int i = 0; i < *rozmiar; i++)
{
nowa_tablica[i] = new string[*rozmiar];
}
int pomoc1 = -1; //Aby było łatwiej zdefiniować warunki, zmienne ta
//ma wartość -1
bool pomoc_stop_liczenie;
for(int z = 0; z < *rozmiar; z++)
{
//pomoc_stop_liczenie = true;
//pomoc1 = 0;
for(int o = 0; o < *rozmiar; o++)
{
pomoc1++;
if(pomoc1 < stary_rozmiar)
{
nowa_tablica[z][o] = test[z][o]; //W tym miejscu powinien nadpisywaæ wartoœciami ze starej tablicy
}
//cout << " POMOC1 = " << pomoc1 << "\n";
//cout << "STARY_R = " << stary_rozmiar << " na " << stary_rozmiar << "\n";
//cout << "AKTUALNY ROZMIAR: " << *rozmiar << " na " << *rozmiar << "\n";
//cout << "\n\n";
//else
// {
//nowa_tablica[z][o] = "0"; //Z kolei w tym miejscu powinien przypisać zera wszystkiemu wzwy¿
//}
}
// if(!(pomoc1 < stary_rozmiar))
// { //Ten fragment kodu zawiesza program
// pomoc1 = 0;
// }
//break;
}
return nowa_tablica;
for(int pomoc_usun = 0; pomoc_usun < stary_rozmiar; pomoc_usun++) //W tym miejscu usuwam tablicê dwuwymiarow¹,
{ //Nie jestem pewny "poprawności" tej metody :/
delete[] test[pomoc_usun];
}
delete[] test;
}
Pozdrawiam!