Autor Wątek: Przenoszenie wielowymiarowych tablic  (Przeczytany 3334 razy)

Offline _user

  • Użytkownik

# Lipiec 20, 2015, 19:29:24
No tak, zmienilem na:
Kod: (c) [Zaznacz]
  tab=(int**)malloc(l*sizeof(int*));
  for(int i=0;i<l;++i)
    tab[i]=(int*)malloc(k*sizeof(int));
i dziala poprawnie, dzieki lethern, ze zwrociles mi uwage na to alokowanie tablic, bede staral sie go uzywac teraz czesciej, no to problem rozwiazany biore sie za dalsza czesc programu : )

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kos

  • Użytkownik
    • kos.gd

# Lipiec 21, 2015, 13:00:30
Olaboga, co to za wariactwo, N+1 malloców na jecną tablicę 2D? :<

Jak już chcesz koniecznie używać int** do pokazywania na 2D tablicę (koniecznie chcesz?) to alokuj ją w 2 alokacjach, a nie w N+1:

// tab[l][k]
// l rows, k columns

tab=(int**)malloc(l*sizeof(int*));
tab[0] = malloc(k*l*sizeof(int));
for(int i=1;i<l;++i)
tab[i]=tab[i-1]+k;

void func(int k, int l, int** tab) {}

Chociaż trochę prościej tak jak Lethern napisał używać w C po prostu typu tablicowego (działa od C99):

int (*tab)[k] = malloc(k*l*sizeof(int));

void func(int k, int l, int tab[][k]) {}

w C++ nie zadziała, bo nie ma VLA, ale tam nie tracisz życia na te durne tablice i po prostu podajesz std::array albo std::vector  albo boost::multi_array.

(See also: http://stackoverflow.com/questions/14548753/passing-a-multidimensional-variable-length-array-to-a-function/14549030#14549030)

Offline Kos

  • Użytkownik
    • kos.gd

  • +1
# Lipiec 21, 2015, 13:04:27
Co do błędu, to co zwraca malloc jest typu void*, a Ty oczekujesz albo int* albo int**, więc musisz dodać rzutowanie (w komunikacie masz napisane, ze oczekuje int*)

W C można niejawnie rzutować z void* na int*. Jeśli jest taki błąd, to stawiam że user kompiluje jako C++. Skoro kod jest w C++, to dlaczego w ogóle rozmawiamy o malloc? :)

Offline jelcynek

  • Użytkownik

  • +2
# Lipiec 21, 2015, 13:05:37
Ogólnie taki protip, że może się zastanów czy potrzebujesz tablice dwuwymiarowe. Użycie tablicy jednowymiarowej (wymiaru k * l) i przeliczanie indeksu to moim skromnym zdaniem dużo czytelniejsza sprawa.
« Ostatnia zmiana: Lipiec 21, 2015, 13:08:28 wysłana przez jelcynek »

Offline lethern

  • Użytkownik

# Lipiec 21, 2015, 14:55:13
optimization nazi..

pierwsza zasada optymalizacji
nie optymalizuj

Offline Xirdus

  • Moderator

# Lipiec 21, 2015, 15:06:56
Nie chodzi (tylko) o optymalizację, ale łatwość użycia.

Offline jelcynek

  • Użytkownik

# Lipiec 21, 2015, 15:15:49
Cytuj
optimization nazi..

Cytuj
przeliczanie indeksu to moim skromnym zdaniem dużo czytelniejsza sprawa.

Nie ma słowa o optymalizacji, nawet o tym nie pomyślałem. Chyba, że optymalizacja kodowanie :).
« Ostatnia zmiana: Lipiec 21, 2015, 15:18:08 wysłana przez jelcynek »

Offline lethern

  • Użytkownik

# Lipiec 21, 2015, 16:56:29
Zgodze się, wszystko powinno iść w kierunku czytelności i łatwości użycia / uniknięcia błędów (wide vector)
Nie wiem jednak dlaczego
tab[i*size+k]miałoby być bardziej czytelne niż
tab[i][k]
[edit] poprawiłem błąd... Nawet tutaj pisząc popełniłem bład.
Pomijając samą czytelność, szansa na zrobienie błędu jest dużo większa.. Dla każdego sensownego (w mojej ocenie) stylu programowania takie coś powinno odpaść na wstępie

[edit2]@poniżej - zuskujesz na czytelności malloc, a co z czytelnością dostępu do elementu?
« Ostatnia zmiana: Lipiec 21, 2015, 17:46:19 wysłana przez lethern »

Offline jelcynek

  • Użytkownik

# Lipiec 21, 2015, 17:38:36
Bardziej mi chodziło, że to:

tab = (int*)malloc(l*k*sizeof(int));

jest bardziej czytelne, niż to:

tab=(int**)malloc(l*sizeof(int*));
tab[0] = malloc(k*l*sizeof(int));


Offline Xirdus

  • Moderator

# Lipiec 21, 2015, 23:53:37
@lethern: przede wszystkim nie musisz się pierdzielić z żadnymi wskaźnikami na wskaźniki.