przekazywanie jednego wymiaru tablicy 2D do funkcji z arg. 1D

0

Witam,
w programie tworzę sobie funkcję ze wskaźnikiem do 1D tablicy a następnie dynamiczną tablicę dwu wymiarową w następujący sposób:

double funkcja(double*x,/*...*/){
//...
}
//...
//main:
int x = 10, y=5;
double** wsk;
wsk = new double*[x]; //tworzymy tablicę do wskaźników
for(int i=0; i<x; i++)
   wsk[i] = new double[y]; //tworzymy tablice, do których wskaźniki są zapisane w tej poprzedniej

i teraz chciałbym się zapytać czy jest możliwość wrzucania do ww. funkcji poszczególne tablice (wiersze) z tej tablicy dwu wymiarowej? tzn. żeby były one traktowane jak 1D?
np. tak:

double x = 0;
x = funkcja(wsk[5]) //przekazujemy 6 tablicę z tablicy 2D -> czy to jest poprawne?
0

Nie nazywaj wszystkiego x, bo raz że to się nie skompiluje, to dwa że trudno ci nawet wyjaśnić do których zmiennych się odwoływać.

Oprócz wsk[5] musiałbyś przekazać rozmiar tego wiersza tablicy, albo przyjąć na stałe jeden rozmiar (u ciebie 5).

0
Azarien napisał(a)

Nie nazywaj wszystkiego x, bo raz że to się nie skompiluje, to dwa że trudno ci nawet wyjaśnić do których zmiennych się odwoływać.

Oprócz wsk[5] musiałbyś przekazać rozmiar tego wiersza tablicy, albo przyjąć na stałe jeden rozmiar (u ciebie 5).

Tak, masz rację - za dużo tych x-ów (akurat na to nie zwróciłem uwagi :D).
A czemu uważasz, że powinienem "przekazać rozmiar tego wiersza"? jeśli to jest niezależna tablica a tylko wskaźnik do niej jest przechowywany w tej innej tabilcy?
I w ogóle jak to zrobić? Czy mógłbym prosić jakiś przykład?

0

Bo funkcja nie wie gdzie te dane się kończą. Sam wskaźnik jej tego nie powie. O ile nie masz ustawionej na sztywno długości, odwołania w funkcji w rodzaju x[5] mogą oznaczać wyjechanie poza tablicę, a nie masz jak sprawdzić zakresu (nie znasz rozmiaru).
Rozmiar możesz przekazać w oddzielnym argumencie:

void  funkcja(double  *x, size_t  length);
0

przekazać normalnie:

funkcja(wsk[5], y);

gdzie y to jest ten twój rozmiar y przy twórzeniu tablicy.

Dlaczego? Dlatego, że w C i C++ rozmiar tablicy się traci podczas przekazywania go do funkcji:

foo(double *tab)
{
    // no, jaki jest rozmiar tablicy?
}
0
Azarien napisał(a)

przekazać normalnie:

funkcja(wsk[5], y);

gdzie y to jest ten twój rozmiar y przy twórzeniu tablicy.

Dlaczego? Dlatego, że w C i C++ rozmiar tablicy się traci podczas przekazywania go do funkcji:

foo(double *tab)
{
    // no, jaki jest rozmiar tablicy?
}

Sorry pewnie za głupie pytanie, ale co oznacza zdanie "rozmiar tablicy traci się"? Czy masz na myśli to, że w funkcji nie mam informacji o tym jakiego rozmiaru zadeklarowałem tablicę czyli, że nie mam dostępu do zmiennych typu x i y? czy jeszcze o coś innego? Bo jakby co to to akurat wiem :)
Natomiast jeśli zadeklaruję zmienną globalnie to będę miał rozmiar tablicy wewnątrz funkcji :-)

0

Sarrus, mniejsza z tymi zmiennymi globalnymi - po prostu nie rozumiem zdania "rozmiar tablicy traci się" - co to oznacza?
Czy może ktoś podać przykład kiedy się nie traci a na czym polega utrata tego rozmiaru?
pozdrawiam

0

Funkcja otrzymuje wskaźnik. Wskaźnik informuje tylko o tym, gdzie znajdują się dane i jakiego są typu. Nic więcej. Nie przekazuje informacji o tym czy to jest jeden element, czy początek tablicy ani jaka jest jej długość. Jeśli chcesz w funkcji iterować po elementach tablicy, musisz wiedzieć ile ona ma elementów, a tego wskaźnik nie mówi. Musisz tę długość przekazać w inny sposób. Jeśli ilość elementów jest stała, możesz użyć np. definicji preprocesora, ustawiając tym samym rozmiar na sztywno. Jeśli rozmiar tablicy może być różny dla każdego wywołania funkcji, możesz przekazać rozmiar w oddzielnym argumencie, albo terminować dane określoną wartością, tak jak np. ciągi znaków (c-string) terminuje się bajtem zerowym.

EDIT: może poniższy kod rozjaśni sytuację. Skompiluj i wykonaj żeby zobaczyć efekt.

#include <stdio.h>


void  function(double  *x)
{
    printf("In function: %zi\n", sizeof(x));
}


int  main(void)
{
    double      row[20];


    printf("In main: %zi\n", sizeof(row));
    function(row);

    return 0;
}
0

ok, dzięki za pomoc.
Ale jeśli dobrze rozumiem to jeśli utworzę sobie class x i zadeklaruję tam zmienną int dlugosc_tab; i później zadeklaruję sobie tą tablicę a później w tej samej klasie zrobię sobie funkcję, do której będę przekazywał tablicę to będę miał w obrębie całej klasy informację o długości tej tablicy - prawda? Czyli tak na prawdę nie stracę informacji o długości tablicy.
pozdrawiam

0

Stracisz, ale będziesz mógł ją pobrać z innego miejsca. Tak samo, jak przy przekazaniu rozmiaru przez argument - tracisz informację o rozmiarze tablicy, ale masz ją w innym miejscu.

BTW, czy C++ nie ma jakichś wyczesanych klas do tablic? Może użyj ich i olej tą szopkę.

0
Kumashiro napisał(a)

Stracisz, ale będziesz mógł ją pobrać z innego miejsca. Tak samo, jak przy przekazaniu rozmiaru przez argument - tracisz informację o rozmiarze tablicy, ale masz ją w innym miejscu.

BTW, czy C++ nie ma jakichś wyczesanych klas do tablic? Może użyj ich i olej tą szopkę.

Jeśli chodzi Ci o vector to tak, ma :)
Ale, żeby bawić się na wektorze trzeba nauczyć się podstaw - nie zawsze jest możliwość lub sens bawić się vectorem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1