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

Tablica Dwuwymiarowa

Object Storage Arubacloud
0 głosów
398 wizyt
pytanie zadane 6 kwietnia 2016 w C i C++ przez mateusz12 Użytkownik (530 p.)

W jaki sposób mogę przesłać do funkcji oryginalną dwuwymiarową tablice stworzoną dynamicznie.

X i Y podane na początku definiuje mi liczbę wierszy i kolumn.

 

 

#include <iostream>

using namespace std;

int main()
{
    int x;
    int y;
    cin >> x >> y;


    int *w_x = &x;
    int *w_y = &y;

    int tab [*w_x][*w_y];

    for (int i=0; i<*w_x; i++)
    {
        for (int j=0; j<*w_y; j++)
        {
            tab[i][j]=i;
        }
    }

        for (int i=0; i<*w_x; i++)
    {
        for (int j=0; j<*w_y; j++)
        {
           cout << tab[i][j];
        }
        cout << " " << endl;
    }
    return 0;
}

 

2 odpowiedzi

+2 głosów
odpowiedź 6 kwietnia 2016 przez draghan VIP (106,230 p.)
edycja 6 kwietnia 2016 przez draghan

W jaki sposób mogę przesłać do funkcji oryginalną dwuwymiarową tablice stworzoną dynamicznie.

Podając jako argument wskaźnik, który użyłeś przy alokacji pamięci.

    int *w_x = &x;
    int *w_y = &y;
    int tab [*w_x][*w_y];

A co to ma być? To nie jest stworzenie tablicy dynamicznej. Do tablicy dynamicznej potrzebujesz wskaźnika, który będzie przechowywał adres przydzielony Ci przez system operacyjny za pośrednictwem operatora new[].

int **tab;
unsigned x, y;
cin>>x>>y;

tab = new int*[x];
for(unsigned i = 0; i < y; ++i)
   tab[i] = new int[y];

// ...
for(unsigned i = 0; i < y; ++i)
   delete[] tab[i];
delete[] tab;

 

komentarz 6 kwietnia 2016 przez mateusz12 Użytkownik (530 p.)

Dzięki wielkie

Będę wdzięczny jeszcze za analizę tego kodu.

Tworze tablice wysyłam ją do funkcji dopisanie_liczb gdzie przypisuje tablicy[3][2]=6.

I funkcja dopisywanie_liczb nie zwraca mi tej 6 do głównej funkcji.

#include <iostream>

using namespace std;



int main()
{
    cout << "dowolna tablica do funkcji" << endl;

    int ilosc_wierszy;
    int ilosc_kolumn;
    cin >> ilosc_wierszy >> ilosc_kolumn;

    int **tablica_dwa_wymiary;
    tablica_dwa_wymiary = new int*[ilosc_kolumn];

    int *w_tablica = &**tablica_dwa_wymiary;

    for (int i=0; i<ilosc_wierszy; i++)
    {
        tablica_dwa_wymiary[i]= new int [ilosc_kolumn];
    }

    int dopisanie_liczb(int *tablica_dwa_wymiary, int szerokosc);

    dopisanie_liczb(&**tablica_dwa_wymiary, ilosc_wierszy);

    cout << tablica_dwa_wymiary[3][2];

    return(0);

}


 int dopisanie_liczb(int *tablica_dwa_wymiary, int szerokosc)
 {
  int *w_szerokosc = &szerokosc;
  return *(tablica_dwa_wymiary + 3 * *w_szerokosc + 2)=6;


 }

 

komentarz 6 kwietnia 2016 przez criss Mędrzec (172,590 p.)
Po pierwsze to chyba zapominasz o kolejności wyknywanai działań, a po drugie - to nie ma sensu. Przekaż wskaźni na wskaźnik jeśli przekazac tablice dwu-wymiarową i odwołuj się operatorem []. Nie wiem po co to kombinowanie.

I dlaczego ciągle tworzysz bezsensowne wskaźniki jak np. tutaj w_szerokosc.
komentarz 6 kwietnia 2016 przez draghan VIP (106,230 p.)
1. Gdzie jest zwolnienie pamięci? Nie po to poświęcałem czas na pokazanie, że należy to zrobić, żebyś tego nie zrobił.

2. Jak Criss słusznie mówi: czemu tyle kombinujesz przy dostępie do tablicy...? Od tego jest operator indeksowania.

A tak w ogóle, to co Ty właściwie chcesz zrobić w funkcji dopisanie_liczb()?
+1 głos
odpowiedź 6 kwietnia 2016 przez criss Mędrzec (172,590 p.)

Po pierwsze: taka deklaracja tablicy (wielkość w zmiennej) jest niezgodna ze standardem i na większości kompilatorów się nie skompiluje. 

Oryginalną... Tzn. nie da się przesłać nie oryginalnej, bo przekazywanie tablicy to nic innego jak przekazanie adresu w pamięci do 0 elementu. Nie wiem po co wrzuciłeś tu ten kod, bo jedyny związek tego kodu z twoim pytaniem, to że jest tablica, ale bynajmniej nie zaalokowana dynamicznie. Swoją drogą: po co ten w_x i w_y? :D

Co do samego przekazania do funkcji... Jeśli jest zaalokowana dynamicznie to najpierw musiałeś utworzyć wskaźnik na wskaźnik (bo dwa wymiary tablicy), więc po prostu napisz funkcje która będzie przyjmować wskaźnik na wskaźnik. Jeśli jednak jest zadeklarowana tak jak w twoim kodzie (lokalnie), to musisz napisać funkcje przyjmująca tablice dwuwymiarową w "klasycznej formie" tzn. np. name[4][5]:

void f(int t[][5]);

Już na etapie deklaracji musisz podać przynajmniej drugi wymiar tablicy jaki przyjmuje funkcja.

Możesz też tu zerknąć.

komentarz 6 kwietnia 2016 przez draghan VIP (106,230 p.)

Jeśli jednak jest zadeklarowana tak jak w twoim kodzie (lokalnie),

...statycznie, jeśli chodzi o umiejscowienie w pamięci. ;)

komentarz 6 kwietnia 2016 przez criss Mędrzec (172,590 p.)
Raczej unikam tego słowa bo jest bardzo dwuznaczne (tylko dwu? :D) w programowaniu.
komentarz 6 kwietnia 2016 przez mateusz12 Użytkownik (530 p.)
Poradziłem sobie z tym już działa.

Dziękuje

Podobne pytania

0 głosów
2 odpowiedzi 1,475 wizyt
0 głosów
1 odpowiedź 476 wizyt
pytanie zadane 13 stycznia 2019 w C i C++ przez Shimeo7 Obywatel (1,910 p.)
0 głosów
1 odpowiedź 747 wizyt
pytanie zadane 29 grudnia 2016 w C i C++ przez czaki Nowicjusz (220 p.)

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

61,966 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!

...