Incompatible types in assignment

Résolu
cs_dranixx Messages postés 3 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 18 janvier 2009 - 18 janv. 2009 à 16:56
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 - 19 janv. 2009 à 19:29
Bonjour à tous

je suis débutante, et dans le cadre de mes cours je dois finir une petite interface dont en gros le but est de gérer des chevaliers...
j'en suis à la suppression d'une entrée, et il faut décaler les lignes du tableau lors d'une suppression: on supprime l'entrée 2, donc la 3 prend sa place et ainsi de suite...

mon code se trouve ici: http://utilitybase.com/paste/11149

la fonction qui pose problème est à la ligne 60...
//supprimer un chevalier + décaller les enregistrements
void delchev


j'ai essayé d'incrémenter une autre variable avant pour ne pas mettre le +1 mais ca ne marche pas mieux...

Merci beaucoup pour votre aide!

7 réponses

Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
18 janv. 2009 à 19:55
Oh je n'ai pas fait attention, lorsque que tu copies des char, il faut tjs utiliser strcpy
strcpy(tab[i].nom , tab[i+1].nom);

A+
____________________________________________________________________________
Mon site internet :  http://ImAnalyse.free.fr
http://ImAnalyse.free.fr
3
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
18 janv. 2009 à 18:34

Salut
Il faut que tu décales tout à partir de la position delchar


printf("nSuppression du chevalier %sn",tab[delchev].nom);
for (i=delchev;i<(*nbchevalier-1);i++)
{
  tab[i].nom = tab[i+1].nom;
  tab[i].surnom = tab[i+1].surnom;
  tab[i].couleurpref = tab[i+1].couleurpref;
  tab[i].lexploit = tab[i+1].lexploit;
  delchev++;
}


*
nbchevalier
-=1;
A+
____________________________________________________________________________
Mon site internet :  http://ImAnalyse.free.fr
http://ImAnalyse.free.fr
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
18 janv. 2009 à 18:38
Ta variable int delchev a le même nom que ta fonction delchev(). Ca doit être ça que le compilateur n'aprécie pas
ed73
0
cs_dranixx Messages postés 3 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 18 janvier 2009
18 janv. 2009 à 19:28
Merci pour vos réponses
ed73: j'ai changé le nom de la variable mais ca n'a pas amélioré les choses
Pistol_pete: j'ai changé ma variable par i et modifié la condition de la boucle et toujours la même erreur.... 

//supprimer un chevalier + décaller les enregistrements
  void delchev(chevalier tab[], int *nbchevalier)
  {
        int supprchev=0;
        int i=0;
        printf("Suppression d'un chevalier, veuillez entrer son numéro: \n\n\n");
        scanf ("%d",&supprchev);
        printf("\nSuppression du chevalier %s\n",tab[supprchev].nom);

        for (i=supprchev;i<*nbchevalier;i++)
            {
            tab[i].nom = tab[i+1].nom;
            tab[i].surnom = tab[i+1].surnom;
            tab[i].couleurpref = tab[i+1].couleurpref;
            tab[i].lexploit = tab[i+1].lexploit;
            supprchev++;
            }
        *nbchevalier-=1;
        system("PAUSE");
  }
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_dranixx Messages postés 3 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 18 janvier 2009
18 janv. 2009 à 20:32
Parfait! Merci beaucoup pour ton aide
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
19 janv. 2009 à 19:25
Bonsoir,

Plutôt que de copier un à un les différents champs de la structure, tu peux employer la fonction memcpy, définie dans string.h, qui peut copier toute la structure d'un coup.
Un avantage : si tu décides de rajouter un champ à la structure, celui-ci est automatiquement pris en compte dans la fonction delchev !
Celle-ci peut être ainsi écrite:

/* supprimer un chevalier + décaler les enregistrements */
void delchev(chevalier tab[], int *nbchevalier)
{
int i=0;
printf("Suppression d'un chevalier, veuillez entrer son numéro: ");
if (scanf ("%d",&i) != 1
|| i < 0 || i >= *nbchevalier)
{
puts("Chevalier inconnu...\n") ;
return ;
}

printf("\nSuppression du chevalier %s.\n", tab[i].nom);

for (;i<*nbchevalier;i++)
memcpy(tab + i, tab + i + 1, sizeof(*tab)) ;

--*nbchevalier;
}

Deux petits conseils pour la route.

1. Il est important de tester qu'il n'y a pas d'erreur. Ici par exemple il faut tester que l'utilisateur rentre bien un nombre qui est le numéro d'un chevalier. Même si l'utilisateur n'est pas malveillant, il peut se tromper.
2. Si dans ton application, supprimer un chevalier est une opération fréquente, il peut être judicieux de ne pas procéder par décalage. Par exemple déplacer uniquement le dernier du tableau à la place de l'élément supprimé est bien plus efficace mais cela «mélange» un peu le tableau. Tu peux également songer à une structure de données différente, comme la liste chaînée.

Bonne continuation.
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
19 janv. 2009 à 19:29
Oups,
Il faut décrémenter le nombre de chevaliers avant de faire les décalages.
Sinon, à la dernière itération de la boucle for, on copie un chevalier inexistant, ce qui peut être fâcheux.
0
Rejoignez-nous