Forum elektroda.pl

Regulamin  | Punkty  | Dodaj...  | Ostatnie  | Szukaj | Rejestracja | Zaloguj



[C]Wskaźnik do tablicy dwuwymiarowej, obsługa


  Strona Główna -> Forum elektroda.pl -> Programowanie Ogólne ->[C]Wskaźnik do tablicy dwuwymiarowej, obsługa Napisz nowy temat  Odpowiedz do tematu 
Autor
Schowaj lewą kolumnę
Pokaż lewą kolumnę Wiadomość
krzyfn
Poziom 12
Dołączył: 06 Lis 2004
Posty: 97
Ocena postów: 1
krzyfn
Poziom 12
Post#1 14 Lis 2008 18:08  Autor tematu   

[C]Wskaźnik do tablicy dwuwymiarowej, obsługa


Witam, głowię się dłuższy czas jak poruszać się jednym wskaźnikiem po tablicy dwuwymiarowej.

Kod:
int **wsk, tab[10][10];
wsk = (int**)tab;  // wsk = tab nie przechodzi, nie wiem czemu

tab[0][0] = 5;
tab[0][1] = 7;
tab[1][0] = 9;

printf("%d, %d", *wsk, *(wsk+1));


jak wyświetlić element tab[1][0] ?

i czemu
Cytat:

printf("%d", **wsk);

nie przechodzi ?

W ogóle jak poruszać się jednym wskaźnikiem po całej tablicy. Nie interesuje mnie rozwiązanie z dwoma wskaźnikami. Chcę przekazywać jeden wskaźnik do funkcji i mieć dostępną całą tablicę dwuwymiarową, a nie tylko jeden jej wiersz.

A może trzeba zadeklarować tablicę wskaźników na wiersze tablicy dwuwymiarowej i wskaźnik do tej tablicy przekazywać do funkcji ?

Pomocny post? + 0
Powrót do góry

Google Adsense
Google


Powrót do góry
Dr.Vee
Zasłużony dla elektroda
Miasto: Wrocław
Dołączył: 16 Maj 2008
Posty: 1793
Pomógł: 306
Ocena postów: 22
Dr.Vee
Zasłużony dla elektroda
Post#2 14 Lis 2008 19:17    

Re: [C]Wskaźnik do tablicy dwuwymiarowej, obsługa


Krótka odpowiedź: tak się nie da. :)

Długa odpowiedź: mówiąc o wskaźniku na tablicę wielowymiarową musisz podać wszystkie oprócz ostatniego wymiaru. Czyli tak naprawdę musiałbyś napisać:
Kod:
#include <stdio.h>

int main(void)
{
    int tab[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
    int (*wsk)[3] = tab;

    printf("%d\n", **wsk);
    printf("%d\n", *(*(wsk)+1));
    printf("%d\n", *(*(wsk+1)));
    return 0;
}

Polecam program "cdecl" do odcyfrowywania i tworzenia "magicznych" typów C w stylu tablica wskaźników na funkcje z argumentem: wskaźnik na tablicę funkcji (void) -> int zwracających ... i tak dalej :)

Przykładowo
Kod:
kokr@copper:/tmp/c$ cdecl
Type `help' or `?' for help
cdecl> declare tab as array of pointer to function (pointer to function (void) returning int) returning pointer to int
int *(*tab[])(int (*)(void ))
cdecl> explain int *(*tab[])(int (*)(void ))
declare tab as array of pointer to function (pointer to function (void) returning int) returning pointer to int

Pozdrawiam,
Dr.Vee

Pomocny post? + +1
Powrót do góry

Google Adsense
Google


Powrót do góry
krzyfn
Poziom 12
Dołączył: 06 Lis 2004
Posty: 97
Ocena postów: 1
krzyfn
Poziom 12
Post#3 14 Lis 2008 20:08  Autor tematu   

Re: [C]Wskaźnik do tablicy dwuwymiarowej, obsługa


Eh. To smutne. Myślałem, że w C da się wszystko :).

Moim zadaniem jest napisać program do transpozycji macierzy z wstawką asemblerowską.

Chciałem zrobić dynamicznie stworzoną tablice (malloc) po podaniu wymiarów macierzy. Następnie napisać funkcję drukującą macierz (działającą na trzech argumentach - wskaźnik do tablicy, x i y).

Teraz widzę jednak, iż będę musiał zrobić dwa wskaźniki (pionowy i poziomy).

Jeszcze jedno pytanie:

Słyszałem o czymś takim jak 'argumenty domniemane'. Można je rzekomo definiować:

Kod:
funkcja(int a, int b = 10);


A teraz chcę aby moje funkcje do obsługi macierzy potrafiły działać na dwóch argumentach (dla macierzy prostokątnych), albo na jednym (dla kwadratowych).

W skrócie można to zrobić poprzez przeładowanie funkcji (napisanie dwóch funkcji z różną ilością argumentów). Jednak ja chciałbym jeszcze krócej, dlatego stworzyłem coś takiego:

Kod:
funkcja(int a, int b = a);


Kompilator tego nie przyjmuje. Jak to zrobić, żeby działało ? ^^

Pomocny post? + +1
Powrót do góry

Google Adsense
Google


Powrót do góry
Krashan7
Poziom 15
Miasto: Białystok
Dołączył: 16 Sie 2006
Posty: 102
Pomógł: 16
Ocena postów: 1
Krashan7
Poziom 15
Post#4 17 Lis 2008 12:13    

Re: [C]Wskaźnik do tablicy dwuwymiarowej, obsługa


Argumenty domniemane działają tylko w C++.

Co do tablic wielowymiarowych, to zwykle symuluję je za pomocą tablicy jednowymiarowej i operacji na wskaźnikach. Przykładowo tablica int-ów 6 x 3:
Kod:

int tab[6*3];
// pobieram element [wiersz, kolumna]
int element = tab[wiersz * 6 + kolumna];

Zdaję sobie sprawę, że nie jest to zbyt elegancki zapis, ale od eleganckich zapisów jest C++, C jest od wydajności i zwartości kodu.

Pomocny post? + 0
Powrót do góry

Google Adsense
Google


Powrót do góry
Dr.Vee
Zasłużony dla elektroda
Miasto: Wrocław
Dołączył: 16 Maj 2008
Posty: 1793
Pomógł: 306
Ocena postów: 22
Dr.Vee
Zasłużony dla elektroda
Post#5 17 Lis 2008 21:40    

Re: [C]Wskaźnik do tablicy dwuwymiarowej, obsługa


Transpozycja macierzy jest akurat najprostszą operacją, po prostu zamieniasz kolejność indeksów nie ruszając w ogóle danych w macierzy :)

Nawet w c++ nie uda Ci się taka deklaracja funkcji
Kod:
void funkcja(int a, int b = a);
W tym przypadku a musi być wyrażeniem stałym (albo stałą globalną). Jak chcesz obsługiwać jedną funkcją różne typy macierzy, to zadeklaruj sobie odpowiedni typ dla macierzy, np:
Kod:
typedef struct {
    size_t rozmiar1;
    size_t rozmiar2;
    int *dane;
} macierz_t;

void transponuj(macierz_t *macierz) {
    if (macierz->rozmiar1 == macierz->rozmiar2)
        /* kod dla macierzy kwadratowej */
    else
        /* kod dla macierzy prostokątnej */
}

Implementacja dynamicznych macierzy wielowymiarowych tak jak napisał Krashan7, albo zobacz http://c-faq.com/aryptr/dynmuldimary.html

Pozdrawiam,
Dr.Vee

Pomocny post? + 0
Powrót do góry

Google Adsense
Google


Powrót do góry
eros81
Poziom 14
Miasto: ok. Rybnika
Dołączył: 07 Paź 2003
Posty: 167
Pomógł: 1
Ocena postów: 4
eros81
Poziom 14
Post#6 22 Lis 2008 14:46    

Re: [C]Wskaźnik do tablicy dwuwymiarowej, obsługa


Witam
Pewnie autorowi to już się nie przyda ale zamieszczam przykładowy kod:
Kod:

#include <stdio.h>

int main() {
unsigned char tab[10][10];
unsigned char x,y;

printf ("\nAnaliza tablic oraz wskaźników do nich\n\n");

for (x=0;x<10;x++)   //wypełnianie elementów tablicy
   for (y=0;y<10;y++)
      tab[x][y]=x*10+y;

printf ("Tablica:\n");
for (x=0;x<10;x++){
   for (y=0;y<10;y++){
      printf ("|%d",tab[x][y]);
   }
   printf ("|\n");      // przeskok do nowej lini co 10
}

unsigned char *wsk;
wsk=&tab[0][0];      //przypisanie wskaźnikowi adresu pierwszego elementu z tablicy

printf ("\nTablica z wskaźników:\n");

for (x=0;x<10;x++){
   for (y=0;y<10;y++)
      printf ("|%d",*(wsk+x*10+y));      //elementy tablicy w pamieci programu ułozone są
                  //liniowo, jeden za drugim
   printf ("|\n");      // przeskok do nowej lini co 10
}

 return (0);
}


Pomocny post? + +1
Powrót do góry
Napisz nowy temat  Odpowiedz do tematu     Strona Główna -> Forum elektroda.pl -> Programowanie Ogólne -> [C]Wskaźnik do tablicy dwuwymiarowej, obsługa
Strona 1 z 1
Podobne tematy
[C++] Deklaracja tablicy dwuwymiarowej. (5)
c++ ukadanie tablicy dwuwymiarowej (2)
C - Funkcje tablicy dwuwymiarowej (3)
[C] - Malloc w dwuwymiarowej tablicy (3)
[Pascal] Obwód tablicy dwuwymiarowej, (3)
[Pascal] Zapis do tablicy dwuwymiarowej. (4)
[C] Przekazywanie tablicy dwuwymiarowej do funkcji (1)
[C++] Tworzenie tablicy dynamicznej dwuwymiarowej (28)
jak chodzić po tablicy dwuwymiarowej? (4)
Rozmiar tablicy dwuwymiarowej [ANSI C] (8)


Przełącz wygląd na komórki Przełącz wygląd na komputery desktop

Administrator || Moderatorzy || Regulamin forum || Regulamin ogólny || Informacja o cookies || Redaktorzy || Reklama || Kontakt

Page generation time: 0.12 seconds

elektroda.pl temat RSS