Forum Index

Rules  | Points  | Add...  | Recent posts  | Search | Register | Log in



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


  Main Page -> Forum Index -> Programming Generally ->[C]Wskaźnik do tablicy dwuwymiarowej, obsługa Post new topic  Reply to topic 
Author
Hide the left column
Show left column Message
krzyfn
Level 12
Joined: 06 Nov 2004
Posts: 97
Post rating: 1
krzyfn
Level 12
Post#1 14 Nov 2008 18:08  Topic author   

[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.

Code:
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
Quote:

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 ?

Helpful post? + 0
Back to top

Google Adsense
Google


Back to top
Dr.Vee
Zasłużony dla elektroda
Location: Wrocław
Joined: 16 May 2008
Posts: 1793
Helped: 306
Post rating: 22
Dr.Vee
Zasłużony dla elektroda
Post#2 14 Nov 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ć:
Code:
#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
Code:
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

Helpful post? + +1
Back to top

Google Adsense
Google


Back to top
krzyfn
Level 12
Joined: 06 Nov 2004
Posts: 97
Post rating: 1
krzyfn
Level 12
Post#3 14 Nov 2008 20:08  Topic author   

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ć:

Code:
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:

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


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

Helpful post? + +1
Back to top

Google Adsense
Google


Back to top
Krashan7
Level 17
Location: Białystok
Joined: 16 Aug 2006
Posts: 153
Helped: 26
Post rating: 4
Krashan7
Level 17
Post#4 17 Nov 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:
Code:

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.

Helpful post? + 0
Back to top

Google Adsense
Google


Back to top
Dr.Vee
Zasłużony dla elektroda
Location: Wrocław
Joined: 16 May 2008
Posts: 1793
Helped: 306
Post rating: 22
Dr.Vee
Zasłużony dla elektroda
Post#5 17 Nov 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
Code:
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:
Code:
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

Helpful post? + 0
Back to top

Google Adsense
Google


Back to top
eros81
Level 14
Location: ok. Rybnika
Joined: 07 Oct 2003
Posts: 167
Helped: 1
Post rating: 4
eros81
Level 14
Post#6 22 Nov 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:
Code:

#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);
}


Helpful post? + +1
Back to top
Post new topic  Reply to topic     Main Page -> Forum Index -> Programming Generally -> [C]Wskaźnik do tablicy dwuwymiarowej, obsługa
Page 1 of 1

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

[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)


Switch to mobile version Switch to version for desktops