probleme pointeur void alors qu'un cast de char* marche :\

probleme pointeur void alors qu'un cast de char* marche :\ - C - Programmation

Marsh Posté le 01-04-2004 à 12:08:16    

salut à tous,
 
alors ouala
g besoin de stocker dans une structure une autre structure de nature inconnue au moment de la programmation
donc je me suis dit : no problemo, c une affaire pour le pointeur magique void* !!!
 
manque de pot ca ne marche pas  :pfff:  
 
voila le code qui marche :

#include <stdlib.h>
 
typedef struct structurePtr PtrStruct;
typedef struct structurePtr{
  int valeur;
  char *nom;
  char *toto;
}structure;
 
int main(void){
  PtrStruct *obj= 0x0;
  if((obj = (PtrStruct*)calloc(1, sizeof(structure))) != 0x0){
     
    obj->valeur = 1;
    obj->nom = (char*)calloc(sizeof("name" ) + 1, sizeof(char));
    sprintf(obj->nom, "%s", "name" );
    obj->toto = (char*)calloc(1, sizeof(int));
    sprintf(obj->toto, "%d", 2);
 
    printf("%d %s %d\n", obj->valeur, obj->nom, (int)(*(obj->toto)));
  }else{printf("%s\n", "echec allocation" );}
 
  return 0;
}

 
c'est la ruse que j'ai trouvé pour que ca marche... (ca compile et s'exécute sans pb, et gdb ne trouve rien à redire)...
mais ca ne marche pas puisque j'aobtient ca  l'exécution :  
1 name 50  :kaola:  
 
g 50 au lieu de 2, donc y a un pb de poiteur ... et la je capte pas... :cry:  
 
si j'utilise un pointeur void* pour toto que je caste, je génère carément une erreur comme quoi la valeur void n' pas été ingnorée comme elle aurait du avec ecec de la compilation...
si qqu'un a une soluce... moi tout petit  :jap:  
et moi tres content  :bounce:  
 
merci et a plus pour de nouvelles aventures...
 
dire que j'ai su faire ca y a trois quatre ans... la honte... :heink:

Reply

Marsh Posté le 01-04-2004 à 12:08:16   

Reply

Marsh Posté le 01-04-2004 à 12:20:35    

(int)(*(obj->toto)) !!!!!
tu cast ta chaîne en int? m'étonne pas que ça marche pas... regarde le code ASCII du caractère '2' et tu comprendras pourquoi tu trouves 50

Reply

Marsh Posté le 01-04-2004 à 12:48:52    

  obj->nom = (char*)calloc(sizeof("name" ) + 1, sizeof(char));
    sprintf(obj->nom, "%s", "name" );  
 
pas mal
 
en clair
 
obj->nom = calloc(sizeof "name", 1);
strcpy(obj->name, "name" );

Reply

Marsh Posté le 01-04-2004 à 13:22:24    

obj->nom = (char*)calloc(sizeof("name" ) + 1, sizeof(char));
   sprintf(obj->nom, "%s", "name" );  
 
pas mal

merci... g appris à programmer à la roots  :D  
 
obj->nom = calloc(sizeof "name", 1);
strcpy(obj->name, "name" );
 
le strcpy ajoute bien le \0 à la fin de la chaine ?
parcequ'avec sprintf ca le fait pas... de souvenance du moins...
 
et pour mon void* ?
 
g vu un topic + loin avec des infos m c pas exactement ce que je veut faire...
j'essaie d'exploiter et je reviens à la charge si je m'en sort pas...  :hello:

Reply

Marsh Posté le 01-04-2004 à 13:28:45    

les 2 le font
 
      obj->toto = calloc(1, sizeof(int)); // ? heink ?
      sprintf(obj->toto, "%d", 2);
 
       (int)(*(obj->toto))  // pas mal, tu transforme  le premier caractère d'une chaine en entier ... devine c'est quoi le code ascii de 2 ?


Message édité par Taz le 01-04-2004 à 13:29:03
Reply

Marsh Posté le 01-04-2004 à 14:04:36    

je parlais plutot de ca :
obj->name = calloc(sizeof("name" ), sizeof(char));
 
sizeof renvoie il 4 ou 5 ?
car s'il renvoie 4 et ne tient pas compte du \0 je te dit pas la marde ensuite quand tu accede à ta chaine.. :\

Reply

Marsh Posté le 02-04-2004 à 00:20:28    

il renvoie la taille de "name" qui est 5 (parenthèses non obligatoires) et sizeof(char) vaut 1 par définition.

Reply

Marsh Posté le 02-04-2004 à 00:21:01    

djdie a écrit :

il renvoie la taille de "name" qui est 5 (superflues)

Reply

Marsh Posté le 02-04-2004 à 00:30:15    

Comment on fait pour passer des arguments à un pthread correctement
 

Code :
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. struct MyArgs
  4. {
  5.   int i;
  6.   char s[16];
  7. };
  8. void* MyThreadedFunction(void *p)
  9. {
  10.   struct MyArgs *args = p;
  11.   printf("Got %d %s\n", args->i, args->s);
  12.   return NULL;
  13. }
  14. int main()
  15. {
  16.   pthread_t id;
  17.   struct MyArgs args = { 42, "TazForEver" };
  18.   if(pthread_create(&id, NULL, MyThreadedFunction, &args) != 0)
  19.     {
  20.       perror("thread_start" );
  21.       return 1;
  22.     }
  23.   if(pthread_join(id, NULL) != 0)
  24.     {
  25.       perror("thread_join" );
  26.       return 2;
  27.     }
  28.   return 0;
  29. }


Message édité par Taz le 02-04-2004 à 01:10:51
Reply

Marsh Posté le 02-04-2004 à 01:08:28    

Code :
  1. struct MyArgs *args = (struct MyArgs *) p;

Cast superflu aussi, si je ne m'abuse :D


Message édité par djdie le 02-04-2004 à 01:08:59
Reply

Marsh Posté le 02-04-2004 à 01:08:28   

Reply

Marsh Posté le 02-04-2004 à 01:10:40    

ah oui
 
édité ... faut dire que c'est du code récupéré et qui date  :whistle:


Message édité par Taz le 02-04-2004 à 01:11:16
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed