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

Dynamiczna tablica dwuwymiarowa

0 głosów
1,208 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 (195,220 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 (195,220 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 373 wizyt
0 głosów
0 odpowiedzi 251 wizyt
pytanie zadane 28 stycznia 2022 w C i C++ przez danielch Użytkownik (660 p.)
0 głosów
1 odpowiedź 475 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez julsonem Nowicjusz (120 p.)

93,776 zapytań

142,732 odpowiedzi

323,384 komentarzy

63,379 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...