interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  didi le Sam 05 Nov 2011, 20:05

bonsoir

je fait l'interro de l'année derniere et j'ai un problem de compilation :
incompatible types when assigning to type 'char[15]' from type 'char *'

La structure de Joueur est :

Code:
typedef struct joueur {
   char nom[15]; /* chaîne (il n'y a pas deux noms identiques parmi les meilleurs joueurs) */
   char prenom [15]; /* chaîne (prénom du joueur) */
   short points; /* points obtenus pendant l'année */
   int taille; /* taille du joueur en cm */
   char nationalite[4]; /* chaîne contenant toujours 3 lettres */
   Date dateNais; /* Date est une structure donnée dans le premier TD */
} Joueur;

Code:

int main(void) {
   ...
        ...
        Joueur *joueur = (Joueur *) malloc(sizeof(Joueur));
   char nom[15]; // et j'ai essayé comme  : char *nom =  (char *)malloc(sizeof(char)*15);
   char prenom[15];
   ...
        ...
      // ici je complete le nom et le prenom et je fais l'assignation

   joueur->nom = nom;      // c'est ici dans ces 2 lignes que j'ai des erreur de compilation
   joueur->prenom = prenom;  //


incompatible types when assigning to type 'char[15]' from type 'char *'
pourtant la varaible nom est bien la type 'char[15]'
comme même type que l'occurence de Joueur (Joueur->nom)

merci d'avance Smile


Dernière édition par didi le Dim 06 Nov 2011, 13:36, édité 1 fois

didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

resolu Re: interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  iCart le Sam 05 Nov 2011, 22:30

Un tableau est un pointeur constant, d'ou l'erreur. (Source)

Par contre, rien ne t’empêche de copier élément par élément... ou d'utiliser une fonction de la librairie standard qui le fait pour toi!

iCart

Nombre de messages : 58
Age : 27
Prénom : Sylvain
Statut : Echappé 2013
Date d'inscription : 09/12/2009

Revenir en haut Aller en bas

resolu Re: interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  didi le Sam 05 Nov 2011, 23:04

merci Smile
c'est juste ici il parle même problem
j'ai corrigé mes erreurs

mais J'ai encore un autre problem Smile

j'ai une erreur d'execution à cause d'allocation mémoir (realloc)

Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "atp.h"

void affiche(Joueur *j);
int main(void) {
   Joueur *joueur = (Joueur *) malloc(sizeof(Joueur));
   Joueur **tab  = (Joueur **) malloc(sizeof(Joueur*));
   int tailleZone,i,somme = 0,nomInd,preInd,cpt = 0;
   void *ptr_g;
   char *nomPrenom,*ptr_c;
   char nom[15];
   char prenom[15];
   short *point;
   float *taille;
   unsigned char *longuer,max;
   ptr_g = getInfoJ(&tailleZone);
   ptr_c = (char *) ptr_g;

   while(somme < tailleZone)    {
      point = (short*) ptr_c;
      joueur->points = *point;
      point++;
      taille = (float *)point;
      joueur->taille = (*taille)*100;
      taille++;
      longuer = (unsigned char *)taille;
      max = *longuer;
      longuer++;
      nomPrenom = (char *) longuer;
      nomInd = 0;
      preInd = 0;
      for(i = 0; i < max; i++)   {
         if((i%2 == 0) && (*(nomPrenom+i) != '#'))   {
            nom[nomInd] = *(nomPrenom+i);
            nomInd++;
         } else if (i%1 == 0 && *(nomPrenom+i) != '#')   {
            prenom[preInd] = *(nomPrenom+i);
            preInd++;
         }
      }
      prenom[preInd] = '\0';
      nom[nomInd] ='\0';
      ptr_c = nomPrenom+max;
      strcpy(joueur->nom,nom);
      strcpy(joueur->prenom,prenom);
      somme = somme +(sizeof(short)+sizeof(float)+sizeof(unsigned char)+max);
      ptr_c = nomPrenom+max;
      *(tab+cpt) = joueur;
      affiche(*(tab+cpt));
      cpt++;
      tab = (Joueur **) realloc(tab,sizeof(Joueur *)* cpt);
      if(tab == NULL)   {
         printf("\nTab est NULL");
      }

   }
   printf("\nLe nombre de jouers est : %d\n",cpt);
   free(ptr_g);
   ptr_g = NULL;


   return EXIT_SUCCESS;
}

void affiche(Joueur *j)   {
   printf("\nNom : %s Prenom : %s Points : %d taille : %d\n",j->nom,j->prenom,j->points,j->taille);
}

didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

resolu Re: interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  smb le Dim 06 Nov 2011, 07:42

Didi, tout d'abord tu ne fais pas ce qui est demandé dans l'énoncé !
On te demande de réallouer au fur et à mesure un tableau de Joueur et pas un tableau de pointeurs de Joueur. Evil or Very Mad

C'est évidemment en cherchant à se compliquer la vie qu'on tombe sur des problèmes !



smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  didi le Dim 06 Nov 2011, 12:00

Merci encore monsieur avec un pointeur tout va bien Smile

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "atp.h"

int compare(const int *a,const  int *b);
void affiche(Joueur *j);
int main(void) {
   Joueur *joueur = (Joueur *) malloc(sizeof(Joueur));
   Joueur *tab = (Joueur *) malloc(sizeof(Joueur));
   int tailleZone,i,somme = 0,nomInd,preInd,cpt = 0;
   void *ptr_g;
   char *nomPrenom,*ptr_c;
   char nom[15];
   char prenom[15];
   short *point;
   float *taille;
   unsigned char *longuer,max;
   ptr_g = getInfoJ(&tailleZone);
   ptr_c = (char *) ptr_g;

   while(somme < tailleZone)    {
      point = (short*) ptr_c;
      joueur->points = *point;
      point++;
      taille = (float *)point;
      joueur->taille = (*taille)*100;
      taille++;
      longuer = (unsigned char *)taille;
      max = *longuer;
      longuer++;
      nomPrenom = (char *) longuer;
      nomInd = 0;
      preInd = 0;
      for(i = 0; i < max; i++)   {
         if((i%2 == 0) && (*(nomPrenom+i) != '#'))   {
            nom[nomInd] = *(nomPrenom+i);
            nomInd++;
         } else if (i%1 == 0 && *(nomPrenom+i) != '#')   {
            prenom[preInd] = *(nomPrenom+i);
            preInd++;
         }
      }
      prenom[preInd] = '\0';
      nom[nomInd] ='\0';
      ptr_c = nomPrenom+max;
      strcpy(joueur->nom,nom);
      strcpy(joueur->prenom,prenom);
      somme = somme +(sizeof(short)+sizeof(float)+sizeof(unsigned char)+max);
      ptr_c = nomPrenom+max;
      *(tab+cpt) = *joueur;
      affiche((tab+cpt));
      cpt++;
      tab = ( Joueur *) realloc(tab,sizeof(Joueur)*(cpt+1));
      if(tab == NULL)   {
         printf("\nTab est NULL");
      }

   }
   printf("\nLe nombre de jouers est : %d\n",cpt);
   free(ptr_g);
   ptr_g = NULL;


   return EXIT_SUCCESS;
}



didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

resolu Re: interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  smb le Dim 06 Nov 2011, 14:53

Il n'empêche que ta solution reste encore un peu compliquée alors qu'il y a moyen de faire plus simple !
Mais bon, si tu détestes la simplicité ...

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  didi le Dim 06 Nov 2011, 17:28

Il n'empêche que ta solution reste encore un peu compliquée alors qu'il y a moyen de faire plus simple !
si vous citez quelque lignes .. ça me permet reflechir pour simplifier

si tu détestes la simplicité ...
non Pas du tout j'aime la simplicité Smile

didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

resolu Re: interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  smb le Dim 06 Nov 2011, 18:05

Pourquoi
Code:
Joueur *joueur = (Joueur *) malloc(sizeof(Joueur));
et pas simplement
Code:
Joueur unJoueur;
en changeant par la suite ce qu'il faut.

Et tout compte fait, pourquoi passer par une variable intermédiaire ?
Il est possible de mettre les informations extraites de la zone mémoire directement dans le tableau dynamique, non ?


smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  didi le Dim 06 Nov 2011, 18:09

merci Smile

didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

resolu Re: interro : 1 _ Année 2010-2011 _ 26 novembre 2010

Message  Contenu sponsorisé Aujourd'hui à 10:56


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum