• 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++

Object Storage Arubacloud
0 głosów
524 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 (155,460 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 (155,460 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 (155,460 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ź 636 wizyt
pytanie zadane 20 stycznia 2020 w C i C++ przez layla Początkujący (260 p.)
0 głosów
1 odpowiedź 209 wizyt
0 głosów
3 odpowiedzi 564 wizyt
pytanie zadane 12 stycznia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

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

...