Avatar billede tued Nybegynder
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.
Avatar billede arne_v Ekspert
14. juli 2004 - 13:15 #1
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.
Avatar billede tued Nybegynder
14. juli 2004 - 13:18 #2
Jeg synes at jeg har prøvet begge dele. Får ingen kompiler fejl, men parameteren bliver sgu ikke overført..........

Jeg bruger keil.
Avatar billede arne_v Ekspert
14. juli 2004 - 13:23 #3
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;
}
Avatar billede tued Nybegynder
14. juli 2004 - 13:26 #4
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".
Avatar billede arne_v Ekspert
14. juli 2004 - 13:28 #5
void f(void *arg)
{
  *((int *)arg) = 123;
}
Avatar billede tued Nybegynder
14. juli 2004 - 13:32 #6
Kan man virkelig det, det kunne man sgå. Lækkert.
Det virker, kanon.

Skriv et svar så for du dine point
Avatar billede arne_v Ekspert
14. juli 2004 - 13:33 #7
svar
Avatar billede tued Nybegynder
14. juli 2004 - 13:34 #8
Tak for det.
Avatar billede jules_colding Nybegynder
20. juli 2004 - 10:11 #9
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
Avatar billede arne_v Ekspert
20. juli 2004 - 10:52 #10
Hvilken C compiler vil compile:

void put_void(void *v, int value)
{
    *v = value;
}

?
Avatar billede jules_colding Nybegynder
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
Avatar billede arne_v Ekspert
20. juli 2004 - 19:59 #12
Og ditto med det andet eksempel.

Så jeg ved ikke rigtigt med det pædagogiske.
Avatar billede arne_v Ekspert
31. juli 2004 - 23:45 #13
tued>

Tid at få afsluttet spørgsmålet ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester