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

Przesyłanie dwuwymiarowej tablicy do funkcji jak wskaźnik do wskaźnika C++

Mały hosting, OGROMNE możliwości
0 głosów
1,135 wizyt
pytanie zadane 27 grudnia 2019 w C i C++ przez Sejdi Początkujący (460 p.)
edycja 27 grudnia 2019 przez Sejdi

Witam mam funkcje 

void (double** Tab);

I tutaj moje pytanie jak przesłać do takiej funkcji tablicę dwuwymiarową? W sensie jak przesłać jako argument w wywołaniu tej funkcji?

double tab[6][2];
Alg(?)

Co w miejsce znaku zapytania?

 

2 odpowiedzi

0 głosów
odpowiedź 27 grudnia 2019 przez Michałełe Nałogowiec (25,600 p.)

Witam

W funkcji przyjmujesz wskaźnik na wskaźnik.

W poniższym kodzie dynamicznie alokuję tablicę wskaźników, i w każdym z nich ( wskaźniku) tworzę nową tablicę.


void func(double** Tab){
	// ...
}

int main(){
	
	double** arr = new double*[5];

	for (int i = 0; i < 5; ++i)
		arr[i] = new double[ 10];

	func( arr);

	return 0;
}

Dodam jeszcze, że stworzyłem 5 elementową tablicę wskaźników, po 10 elementów każda

komentarz 27 grudnia 2019 przez mokrowski Mędrzec (158,960 p.)
No i tego sposobu powinno się oduczać :-/ Ani to wygodne ani efektywne.

A.. i pamięć Ci cieknie.
komentarz 27 grudnia 2019 przez Michałełe Nałogowiec (25,600 p.)
Zgadzam się z cieknącą pamięcią, cały kod napisany tak aby przeszło do funkcji zawartej w pytaniu
komentarz 27 grudnia 2019 przez mokrowski Mędrzec (158,960 p.)

Tylko to nawet nie jest sygnatura funkcji (tak na marginesie) :) A co do przesłania (gdyby była), lepiej alokować w 1 transakcji całość obszaru pamięci i przygotować do przesłania dane. Wtedy jest mniej powodów do błędów. Jakoś tak:

#include <iostream>
#include <cstddef>

constexpr static std::size_t width = 3;
constexpr static std::size_t height = 3;

void show_table(int ** table) {
    for(auto row = 0U; row != height; ++row) {
        for(auto col = 0U; col != width; ++col) {
            std::cout << table[row][col] << ' ';
        }
        std::cout.put('\n');
    }
}

int main() {
    int * table = new int[width * height];

    // prepare table
    int * tableArg[height];
    for(auto i = 0U; i != height; ++i) {
        tableArg[i] = (table + width * i);
    }

    // fill table
    for(auto row = 0U; row != height; ++row) {
        for(auto col = 0U; col != width; ++col) {
            tableArg[row][col] = row * 10 + col + 100;
        }
    }

    show_table(tableArg);

    delete[] table;
}

Choć o tablicach i ich efektywnym wykorzystaniu można długo...

 

0 głosów
odpowiedź 27 grudnia 2019 przez mokrowski Mędrzec (158,960 p.)

Odpowiedź zależy od tego co chcesz uzyskać? :)

Ba, ogólne pytanie brzmi jak pamięć na tę tablicę była alokowana? Jeśli jako ciągła przestrzeń pamięci, najmniej problemów będziesz miał przy takiej sygnaturze funkcji:

void foo(int * table, std::size_t width, std::size_t height);

W środku będzie prosta arytmetyka wskaźników. No ale jeśli chcesz się męczyć, to można tak:

void foo(int table[3][3]);

Wtedy przyjmiesz tablice 3 x 3.

Jest jeszcze kilka innych sposobów.

komentarz 27 grudnia 2019 przez Sejdi Początkujący (460 p.)
Chodziło mi raczej o to jak przesłać tablicę dwuwymiarową jako argument gdy jest taki zapis w funkcji. Wywołanie funkcji Alg(x) i co napisać jako X

Podobne pytania

0 głosów
1 odpowiedź 1,170 wizyt
pytanie zadane 20 stycznia 2020 w C i C++ przez layla Początkujący (260 p.)
0 głosów
1 odpowiedź 295 wizyt
0 głosów
3 odpowiedzi 929 wizyt
pytanie zadane 12 stycznia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)

93,718 zapytań

142,631 odpowiedzi

323,262 komentarzy

63,266 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.

...