Forum Index

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

This site uses cookies. Learn more about cookies and changing the settings in your browser.

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


Post new topic  Reply to topic      Main Page -> Forum Index -> Programming Generally -> [C]Wskaźnik do tablicy dwuwymiarowej, obsługa
Author
Message
krzyfn
Poziom 12
Poziom 12


Joined: 06 Nov 2004
Posts: 97

Post#1 Post from the author of the topic 14 Nov 2008 18:08   

[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 message? + -

Back to top
   
Google


Google Adsense


Post# 14 Nov 2008 18:08   





Back to top
   
Dr.Vee
Zasłużony dla elektroda
Zasłużony dla elektroda


Joined: 16 May 2008
Posts: 1791
Location: Wrocław

Post#2 14 Nov 2008 19:17   

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


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

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 Smile

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 message? + -

Back to top
   
Google


Google Adsense


Post# 14 Nov 2008 19:17   





Back to top
   
krzyfn
Poziom 12
Poziom 12


Joined: 06 Nov 2004
Posts: 97

Post#3 Post from the author of the topic 14 Nov 2008 20:08   

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


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

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 message? + -

Back to top
   
Google


Google Adsense


Post# 14 Nov 2008 20:08   





Back to top
   
Krashan7
Poziom 12
Poziom 12


Joined: 16 Aug 2006
Posts: 102
Location: Białystok

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 message? + -

Back to top
   
Dr.Vee
Zasłużony dla elektroda
Zasłużony dla elektroda


Joined: 16 May 2008
Posts: 1791
Location: Wrocław

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 Smile

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 message? + -

Back to top
   
eros81
Poziom 14
Poziom 14


Joined: 07 Oct 2003
Posts: 164
Location: ok. Rybnika

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 message? + -

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


Administrator || Moderators || Forum Rules || General Rules || Cookies information || Contact

Page generation time: 0.042 seconds

elektroda.pl topic RSS feed