14. juli 2004 - 13:12
Der er
13 kommentarer
void pointer
Hejsa Jeg har en funktion der tager en void pointer som parameter. Hvordan for jeg overførst data til den variabel jeg bruger som parameter i funktions kaldet ??? Min applikation er i ANSI C.
Annonceindlæg fra DE-CIX
Du bør kune kalde den med en hvilken som helst pointer (eller med & på en variabel). Hvis compileren er meget picky kan du type cast til void pointer.
Jeg synes at jeg har prøvet begge dele. Får ingen kompiler fejl, men parameteren bliver sgu ikke overført.......... Jeg bruger keil.
Hm. Det her eksempel vikrer hos mig: #include <stdio.h> void f(int typ,void *arg) { if(typ==1) printf("%d\n",*((int *)arg)); if(typ==2) printf("%f\n",*((double *)arg)); } int main() { int i = 123; double x = 123.456; f(1,&i); f(2,&x); return 0; }
Jeg har sikkert ikke udtrykt mig tydeligt nok, men mit problem består i at få lagt en værdi ned i den variabel jeg "sender" med. I dit eksempel vil jeg f.eks. gerne lægge en værdi ned i "x" i funktionen "f".
void f(void *arg) { *((int *)arg) = 123; }
Kan man virkelig det, det kunne man sgå. Lækkert. Det virker, kanon. Skriv et svar så for du dine point
Forudsat at du vil putte en int ned i en variabel som er repræsenteret med en void pointer kan du f.eks gøre følgende: void put_void(void *v, int value) { *v = value; } int main(int argc, char *argv[]) { int tmp; put_void(&tmp, 2); return 0; } Hvis v er uallokeret skal du istedet gøre: void put_void(void **v, int value) { *v = malloc(sizeof(int)); **v = value; } int main(int argc, char *argv[]) { int *tmp; put_void(&tmp, 2); free(tmp); return 0; } Du kan selvfølgelig også bruge en macro: #define PUT_VOID(type, buf, arg) do { \ *buf = malloc(sizeof(type)); \ **buf = arg; \ } while(0) int main(int argc, char *argv[]) { char c = 12; char *buf; PUT_VOID(char, &buf, c); free(buf); return 0; } Som du kan se er der mange måder at gøre det på ;-) jules
20. juli 2004 - 10:52
#10
Hvilken C compiler vil compile: void put_void(void *v, int value) { *v = value; } ?
20. juli 2004 - 11:06
#11
Ok, ok.. Det blev skrevet lidt hurtigt med vægt på det pædagogiske indhold. Der skal selvfølgelæig stå: *(int*)v = value; -- jules
20. juli 2004 - 19:59
#12
Og ditto med det andet eksempel. Så jeg ved ikke rigtigt med det pædagogiske.
31. juli 2004 - 23:45
#13
tued> Tid at få afsluttet spørgsmålet ?
Kurser inden for grundlæggende programmering