• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dynamiczna tablica dwuwymiarowa

Object Storage Arubacloud
0 głosów
901 wizyt
pytanie zadane 20 stycznia 2018 w C i C++ przez AnastaZIuk Początkujący (330 p.)
zmienione kategorie 20 stycznia 2018 przez AnastaZIuk

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!
 

1 odpowiedź

+1 głos
odpowiedź 20 stycznia 2018 przez j23 Mędrzec (194,920 p.)
wybrane 20 stycznia 2018 przez AnastaZIuk
 
Najlepsza

Poprawiłem nieco tę twoją funkcję:

string **modyfikuj(string **test, int &rozmiar)
{
	int stary_rozmiar = rozmiar;
 
	rozmiar *= 2;

	string **nowa_tablica = new string *[rozmiar];
 
	for(int i = 0; i < rozmiar; i++)
	{
		nowa_tablica[i] = new string[rozmiar];
	}
	
	for(int z = 0; z < stary_rozmiar; z++)
	{
		for(int o = 0; o < stary_rozmiar; o++)
			nowa_tablica[z][o] = test[z][o];
	}

	for(int i = 0; i < stary_rozmiar; ++i)
	{
	  delete[] test[i];
	}

	delete[] test;

	return nowa_tablica;
}

 

komentarz 20 stycznia 2018 przez AnastaZIuk Początkujący (330 p.)
Wcześniej robiłem w taki sam sposób, używając wskaźnika zamiast referencji, trochę tego nie mogę zrozumieć. A mógłbyś mi wytłumaczyć, dlaczego po nadaniu wartości 0 zmiennej pomoc1 w jakimkolwiek miejscu program wyrzuca? Niepoprawna dereferencja? Tylko w którym miejscu?

I dziękuję bardzo!
komentarz 21 stycznia 2018 przez j23 Mędrzec (194,920 p.)
Nie widzę powodu do "wyrzucania" programu. Generalnie ta funkcja jakaś dziwna jest, dlatego dałem poprawioną wersję.

Podobne pytania

0 głosów
0 odpowiedzi 143 wizyt
0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 28 stycznia 2022 w C i C++ przez danielch Użytkownik (660 p.)
0 głosów
1 odpowiedź 207 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez julsonem Nowicjusz (120 p.)

92,555 zapytań

141,404 odpowiedzi

319,559 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...