Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++]Przekazywanie tablicy 2D do funkcji.

Gaatt 12 Sty 2012 20:50 2774 9
  • #1 12 Sty 2012 20:50
    Gaatt
    Poziom 10  

    Witam!

    Mam problem. Nie umiem przekazać statycznej tablicy 2D do funkcji. W moim projekcie zamierzam umieścić trzy pliki:
    1) main.cpp (funkcja main())
    2) functions.cpp (pozostałe funkcje)
    3) functons.h (plik nagłówkowy)
    Nie wiem w jaki sposób mam napisać argumenty funkcji oraz jej prototyp.
    Proszę o pomoc.

    0 9
  • #2 12 Sty 2012 20:50
    mickpr
    Poziom 39  

    Przekazuj wskaźnik, a tablicę zrób statyczną

    0
  • #3 12 Sty 2012 20:55
    Gaatt
    Poziom 10  

    Czy mógłbym prosić o kod. Próbowałem już wielu sposobów i męczyłem się kilkanaście godzin.

    0
  • #4 12 Sty 2012 22:25
    mickpr
    Poziom 39  

    Popatrz na ten kod

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #5 12 Sty 2012 22:28
    crn
    Poziom 8  

    Statycznej tablicy nie da sie przekazac pzez wskaznik. Do statyczniej tablicy musi byc znany 2 wymiar.

    Wiec albo funkcja ebdize miala argumetny *tab[rozmiar_2_wymiaru]

    albo cala tablica musi byc dynamiczna

    Pozdrawiam

    0
  • #6 13 Sty 2012 15:45
    Gaatt
    Poziom 10  

    Nie rozumiem. Jeśli tablica jest statyczna, to chyba zawsze znamy drugi wymiar, bo go deklarujemy. Ponadto tablica w kodzie mickpr jest zadeklarowana globalnie, czego podobno należy unikać. Czy dzięki wskazaniu pierwszego elementu tablicy zyskamy dostęp do całej? Czy wewnątrz funkcji da się wtedy zainicjalizować tablicę w ten sposób :
    tab = {{.....},
      {.....},
      {.....}} ?

    0
  • #7 13 Sty 2012 16:09
    mickpr
    Poziom 39  

    Gaatt napisał:
    ...Ponadto tablica w kodzie mickpr jest zadeklarowana globalnie, czego podobno należy unikać. Czy dzięki wskazaniu pierwszego elementu tablicy zyskamy dostęp do całej? Czy wewnątrz funkcji da się wtedy zainicjalizować tablicę w ten sposób :
    tab = {{.....},
      {.....},
      {.....}} ?

    Ja założyłem, że zawsze znamy rozmiar tablicy. Autor nie powiedział, że musi być to tablica dynamiczna - tylko, że ma być 2D. Globalna deklaracja w moim przykładzie jest tylko przykładowa, nic nie stoi na przeszkodzie aby ją ukryć a z poziomu funkcji main operować tylko na wskaźniku, przekazywać tylko wskaźnik + 2 wymiary (czego ja nie zrobiłem - bo mi się nie chciało). Chciałem tylko zasugerować rozwiązanie. Tablice 2D również możesz inicjować w podany przez Ciebie sposób. Problemem przy przekazywaniu tablic przez wskaźnik jest dostęp do niej. Teoretycznie rzecz biorąc nazwa tabeli 2D jest w zasadzie wskaźnikiem na jej pierwszy (zerowo indeksowany) element - czyli tablica[0][0]. Jeśli przekażesz wskaźnik - to co masz - to "czysty" adres. Teraz kwestia odwrotna - jak w prosty sposób tworzyć sobie dostęp do tak otrzymanej struktury. W moim przypadku zauważ - jak dostałem się do konkretnego pola
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Jest to dość karkołomne. Należało by rzutować taki wskaźnik na tablica[][]. Nie jestem pewny - więc nie określę, czy się tak da, czy nie - może ktoś mądrzejszy się wypowie.

    Jeszcze mała uwaga - przy tablicach dynamicznych nie masz pewności, czy i gdzie zostanie allokowana pamięć. Sposób dostępu który nazywam "wyliczanym" to taki "wytrych". Trzeba dokładnie pomyśleć, zanim się go zastosuje. Przepraszam za zamieszanie

    0
  • #8 04 Lut 2012 17:47
    Gaatt
    Poziom 10  

    Przepraszam, że tak długo nie odpisywałem. Próbowałem sam napisać jakiś program. Niestety nie udało się. Zdesperowany, postanowiłem skompilować Twój kod. Także się nie udało. Czy mógłbyś dla mnie napisać prosty program, który by się kompilował? Prosiłbym o coś w tym stylu (bez żadnych dodatków, chodzi mi tylko o parametry i wywołanie funkcji):

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Za pomoc z góry dziękuję.

    0
  • Pomocny post
    #9 04 Lut 2012 19:11
    beluosus
    Poziom 25  

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #10 05 Lut 2012 12:50
    Gaatt
    Poziom 10  

    Wielkie dzięki za pomoc. Sam nieco zmodyfikowałem kod i dodałem prototyp funkcji, tak aby można było stworzyć plik header. Oto on:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Dziękuję wszystkim. Temat zamykam.

    0