Orjanp Skrevet 7. november 2006 Rapporter Del Skrevet 7. november 2006 Gitt følgende kode: #include <stdio.h> #include <stdlib.h> void print_table(unsigned int **buf, int size) { int i; for(i=0; i<size; i++) printf("%d\n", *buf[i]); } int main(int argc, char **argv) { int i; int h = 4, w = 8; unsigned int **a_buf; a_buf = (unsigned int **)malloc(sizeof(int *)*h*w); for(i=0; i<h*w; i++) *a_buf[i] = i; print_table(&a_buf, h*w); } Hvordan kan jeg sende a_buf til print funksjonen? Bufferen er en peker til en peker. Ikke spør hvorfor, eksemplet ovenfor er kun en simplifisering av det egentlige problemet. Lenke til kommentar
Giddion Skrevet 7. november 2006 Rapporter Del Skrevet 7. november 2006 Hjelper dette? #include <stdio.h> #include <stdlib.h> void print_table(unsigned int **buf, int size) { int i; for(i=0; i<size; i++) printf("%d\n", *buf[i]); } int main(int argc, char **argv) { int i; int h = 4, w = 8; unsigned int **a_buf; a_buf = (unsigned int **)malloc(sizeof(int *)*h*w); for(i=0; i<h*w; i++) *a_buf[i] = i; print_table(a_buf, h*w); // ENDRING!! før -> print_table(&a_buf, h*w); } Lenke til kommentar
Manfred Skrevet 7. november 2006 Rapporter Del Skrevet 7. november 2006 Hvorfor skal du sende den over som en referanse? Det er da strengt tatt ikke nødvendig når vi snakker om pekere. Så jeg vil vel si meg enig i at du fjerner & fra funksjonskallet ditt. Lenke til kommentar
Orjanp Skrevet 7. november 2006 Forfatter Rapporter Del Skrevet 7. november 2006 Det er ingen grunn til at jeg skulle sende den som referanse. Fikk ikke det til å fungere, så jeg testet med endel forskjellige metoder. Var bare tilfeldig at det var den jeg postet her. #include <stdio.h> #include <stdlib.h> void print_table(unsigned int *buf[], int size) { int i; for(i=0; i<size; i++) printf("%d\n", *buf[i]); } int main(int argc, char **argv) { int i; int h = 4, w = 8; unsigned int **a_buf; a_buf = (unsigned int **)malloc(sizeof(int *)*h*w); for(i=0; i<h*w; i++) *a_buf[i] = i; print_table(a_buf, h*w); } Får kun segmentation fault. Lenke til kommentar
Giddion Skrevet 7. november 2006 Rapporter Del Skrevet 7. november 2006 Problemet er at pekeren som blir pekt til av pekeren ikke peker no sted(håper det ble riktig ) For å si det på en annen måte så bruker du malloc til å allokere plass til mange pekere, men disse peker ikke til noe sted eller de peker på "tilfelldige" steder derfor får du problemer, men det har ingenting med at hvordan du sender info til print_table PS: hos meg klikker koden her: *a_buf = i; Lenke til kommentar
handsape Skrevet 8. november 2006 Rapporter Del Skrevet 8. november 2006 (endret) , eksemplet ovenfor er kun en simplifisering av det egentlige problemet. 7236982[/snapback] la meg gjette; "tabell" - som i 2D-arrays? litt interessant dette, så jeg hakket sammen en sak her: http://nostdal.org/~lars/programming/c/table.c ..er jeg genial, eller hva? edit: ønsker du et eksempel som viser hvordan du gjør _akkurat_ det du spør om (sende unsigned int** til funksjon ..etc..) kan du kontakte meg (og mange andre) utenfor dette forumet da jeg ikke er velkommen her og må gå lange omveier via proxyer m.m. hver gang jeg skal lese/poste/redigere noe: * IRC: #programmering på adams.freenode.net; jeg har nicket `lnostdal' * USENET ( no.it.programmering.c - se linken "USENET" i signaturen min) Endret 8. november 2006 av handsape Lenke til kommentar
einaros Skrevet 8. november 2006 Rapporter Del Skrevet 8. november 2006 Hvorfor skal du egentlig sende dette som pointer til pointer? For bruken du illustrerer, holder det i massevis å gjøre det slik som dette. #include <stdio.h> #include <stdlib.h> void print_table(unsigned int *buf, int size) { int i; for(i=0; i < size; i++) printf("%d\n", buf[i]); } int main(int argc, char **argv) { int i; int h = 4, w = 8; unsigned int *a_buf; a_buf = (unsigned int *)malloc(h * w); for(i=0; i< h * w; i++) a_buf[i] = i; print_table(a_buf, h*w); free(a_buf); return 0; } Lenke til kommentar
Orjanp Skrevet 9. november 2006 Forfatter Rapporter Del Skrevet 9. november 2006 (endret) Nå var det ikke den egentlige bruken jeg eksemplifiserte. Det var bare en simplifisering av det egentlige problemet, som det står i første innlegg. Litt av poenget var også å finne ut hvordan det kunne gjøres, Lars: Takk igjen for kode. Synd at din tid på forumet skulle ende slik. 2D array er det ja. Det er en enkel vindtunnell simulering som skal omskrives fra en sekvensiell implementasjon, til å benytte seg av X antall maskiner satt opp i en cluster. I den hensikt i å forhåpentligvis oppnå en ytelsesforbedring. Ørjan... Endret 9. november 2006 av Orjanp Lenke til kommentar
handsape Skrevet 9. november 2006 Rapporter Del Skrevet 9. november 2006 (endret) ok, om hastighet er prioritet "numero uno" så kan det hende ting bør gjøres litt annerledes .. en ting står nevnt i structen `Array2D' om du på forhånd kan estimere maks-størrelsen på 2d-arrayet ditt kan du allokere statisk (event. "automatisk" eller whatever); da vil du kunne bruke standard []-syntax for å aksessere elementer #include <stdio.h> #define MAX_DIM 10 void blah(char blah[MAX_DIM][MAX_DIM]) { blah[0][0] = 'a'; } int main() { char arr[MAX_DIM][MAX_DIM]; blah(arr); printf("%c\n", arr[0][0]); return 0; } /* lars@ibmr52:~/programming/c$ gcc -g -Wall b.c -o b && ./b a */ edit: jeg forsvinner nok ikke helt; det er bare 1000 ganger mer behagelig å bruke andre fora Endret 9. november 2006 av handsape Lenke til kommentar
einaros Skrevet 9. november 2006 Rapporter Del Skrevet 9. november 2006 edit:jeg forsvinner nok ikke helt; det er bare 1000 ganger mer behagelig å bruke andre fora 7249789[/snapback] Gjort deg til uvenn med de høyere makter? Lenke til kommentar
einaros Skrevet 9. november 2006 Rapporter Del Skrevet 9. november 2006 Nå var det ikke den egentlige bruken jeg eksemplifiserte. Det var bare en simplifisering av det egentlige problemet, som det står i første innlegg. Litt av poenget var også å finne ut hvordan det kunne gjøres, 7249441[/snapback] Kan du koke ned en kort sum-up av hva du vil/skal lage? Lenke til kommentar
einaros Skrevet 9. november 2006 Rapporter Del Skrevet 9. november 2006 Hvorfor skal du sende den over som en referanse? Det er da strengt tatt ikke nødvendig når vi snakker om pekere. Så jeg vil vel si meg enig i at du fjerner & fra funksjonskallet ditt. 7237645[/snapback] Det er ingen referanse, det er address-of-operatoren. Lenke til kommentar
Orjanp Skrevet 10. november 2006 Forfatter Rapporter Del Skrevet 10. november 2006 Nå var det ikke den egentlige bruken jeg eksemplifiserte. Det var bare en simplifisering av det egentlige problemet, som det står i første innlegg. Litt av poenget var også å finne ut hvordan det kunne gjøres, 7249441[/snapback] Kan du koke ned en kort sum-up av hva du vil/skal lage? 7250960[/snapback] Denne skulle vel forklare ganske greit hva jeg gjør. Takk for hjelpen alle sammen. Ørjan... Lenke til kommentar
Shell Skrevet 14. november 2006 Rapporter Del Skrevet 14. november 2006 #include <stdio.h> #include <stdlib.h> void print_table(unsigned int **buf, int size) { int i; for(i=0; i<size; i++) printf("%d\n", *buf[i]); } int main(int argc, char **argv) { int i; int h = 4, w = 8; unsigned int *aBuf; // alloc data aBuf = malloc( sizeof(int)*h*w ); // alloc pointers unsigned int *aPtr = malloc(sizeof(int)*w*h); // init data for(i=0; i<h*w; i++) aBuf[i] = i; // init pointers to data for (i=0; i<h*w; i++) aPtr[i] = &aBuf[i]; print_table(&aPtr, h*w); } Usikker på hva du ønsker, hva med denne? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå