Incompatible types in assignment [Résolu]

Signaler
Messages postés
3
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
18 janvier 2009
-
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011
-
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

Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6

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
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
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
Messages postés
3
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
18 janvier 2009

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");
  }
Messages postés
3
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
18 janvier 2009

Parfait! Merci beaucoup pour ton aide
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

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.
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

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.