Gå til innhold

peker til peker sendt som argument i en funksjon.


Anbefalte innlegg

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
Videoannonse
Annonse

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

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

Problemet er at pekeren som blir pekt til av pekeren ikke peker no sted(håper det ble riktig :hmm: )

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
, 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? :D

 

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 av handsape
Lenke til kommentar

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

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 av Orjanp
Lenke til kommentar

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 av handsape
Lenke til kommentar
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
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

#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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...