Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/11/2008, à 14:56

sifourquier

[résolu] pointeur void * attention : assignment makes pointer from...

Bonjour

j'ai un warning dans le programme que je crée

attention : assignent makes pointer from integer without a cast

je ne comprend pas bien car j'assigne un pointeur void (void*) a un pointeur de pointeur Tjoy (Tjoy**) qui est un type def d'une structure

ma structure

struct Tjoy
{
	unsigned char present;
	float axes[ABS_MAX+1];
	unsigned char buttons[KEY_MAX - BTN_MISC + 1];
	unsigned char nb_axes;
	unsigned char nb_buttons;
	int version;
	char name[NAME_LENGTH];
};
typedef struct Tjoy Tjoy;

ma fonction

void * mon_malloc_joy(unsigned long int dim);

....


void * mon_malloc_joy(unsigned long int dim)
{
	void * p;
	p=malloc(dim);
	if(p==NULL)
	{
		printf("\nerreur d'allocation de la mémoire\n");
		quit(0);
	}
	return p;
}

le code qui fait le warning

Tjoy ** joy;

Tjoy ** InitJoy ()
{
	...

	joy=mon_malloc(sizeof(Tjoy *)*NB_MAX_JOY);
	...
}

voila s'est seulement un warning et sa marche mais j'aimerais comprendre

j'ai tester avec

	joy=(Tjoy **)mon_malloc(sizeof(Tjoy *)*NB_MAX_JOY);

mais sa me donne

attention : transtypage vers un pointeur depuis un entier de taille différente

sa marche très bien avec les pointeur de char ou autre s'est seulement avec les structure que sa fait le warning
sa marche aussi très bien avec malloc directement

voila si vous avez une idée

Dernière modification par sifourquier (Le 03/11/2008, à 19:43)

Hors ligne

#2 Le 02/11/2008, à 16:21

tiky

Re : [résolu] pointeur void * attention : assignment makes pointer from...

Bonjour,

Utilise le type size_t pour passer la dimension de la zone mémoire à ta fonction malloc.
Tu dois initialiser ton pointeur à NULL avant un malloc.
Voilà un exemple ( j'ai pas mis les testes des pointeurs après les mallocs, mais il faut les faire wink )

#include <stdio.h>
#include <stdlib.h>
#define SIZE 5

int main( void )
{
    int ** ptr = NULL;
    ptr = malloc( sizeof( int * ) * SIZE );
    int i;
    for( i = 0; i < SIZE; i++ )
    {
        ptr[i] = NULL;
        ptr[i] = malloc( sizeof( int ) );
        *(ptr[i]) = 123; 
    }

    for( i = 0; i < SIZE; i++ )
    {
	free( ptr[i] );
    }	
    free( ptr );

    return 0;
}

Note: Ta fonction malloc est mauvaise car tu quittes sans libérer la mémoire.

Dernière modification par tiky (Le 02/11/2008, à 16:36)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#3 Le 02/11/2008, à 17:00

rniamo

Re : [résolu] pointeur void * attention : assignment makes pointer from...

@tiky : pourquoi elle est mauvaise ? on ne libère pas dans le malloc si ?


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#4 Le 02/11/2008, à 17:41

tiky

Re : [résolu] pointeur void * attention : assignment makes pointer from...

rniamo a écrit :

@tiky : pourquoi elle est mauvaise ? on ne libère pas dans le malloc si ?

J'ai pas dit qu'il fallait libérer dans le malloc mais il quitte dans le malloc sans faire de libération. Enfin comme j'ai pas tout le code, je peux me tromper.

Dernière modification par tiky (Le 02/11/2008, à 17:41)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#5 Le 02/11/2008, à 17:42

rniamo

Re : [résolu] pointeur void * attention : assignment makes pointer from...

ok, autant pour moi


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#6 Le 03/11/2008, à 19:05

sifourquier

Re : [résolu] pointeur void * attention : assignment makes pointer from...

Merci mais j'ai tester avec size_t et sa ne change rien
pour ce qui est de la libération elle est bien après et je fait aussi l'allocation de tout les pointeur avec la boucle mais je ne comprend vraiment pas ce warning

cette fonction est utiliser pour remplacer le malloc standard pour faire une vérification si il y a bien marcher

je veux qu'on puisse changer n'importe qu'elle malloc dans un programme par celui la

Dernière modification par sifourquier (Le 03/11/2008, à 19:30)

Hors ligne

#7 Le 03/11/2008, à 19:42

sifourquier

Re : [résolu] pointeur void * attention : assignment makes pointer from...

bon ben s'est les erreur les plus stupide les plus dure a trouver
j'apelle mon_malloc et la fonction sapelle mon_maloc_joy roll


....

Hors ligne

#8 Le 03/11/2008, à 19:46

nicolas.sitbon

Re : [résolu] pointeur void * attention : assignment makes pointer from...

tiky a écrit :

Tu dois initialiser ton pointeur à NULL avant un malloc.

Non, absolument pas :

#include <stdio.h>
#include <stdlib.h>

#define SIZE 5U

int main (void)
{
   int **ptr = malloc (SIZE * sizeof *ptr);

   if (ptr != NULL)
   {
       for (size_t i = 0; i < SIZE; i++)
       {
           ptr[i] = malloc (sizeof *ptr[i]);

           if (ptr[i] != NULL)
           {
              *(ptr[i]) = 123;
           }
       }

       for (size_t i = 0; i < SIZE; i++)
       {
          free (ptr[i]), ptr[i] = NULL;
       } 
   
       free (ptr), ptr = NULL;
   }

    return 0;
}

Hors ligne

#9 Le 03/11/2008, à 20:48

nicolas66

Re : [résolu] pointeur void * attention : assignment makes pointer from...

Tout à fait d'accord, il n'y a pas d'obligation à initialiser son pointeur avant un `malloc' ...


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne