Compression de tableau (dans une structure)

Henker13 Messages postés 3 Date d'inscription mercredi 26 novembre 2008 Statut Membre Dernière intervention 26 novembre 2008 - 26 nov. 2008 à 13:50
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 27 nov. 2008 à 12:47
Bonjour,
Je suis nouveau sur le forum, je me permets de poser ma question d’entrer de jeux ?
J’ai un programme à faire dans le cadre de mes études dans lequel je dois gérer la location de cassettes vidéos. ( Par exemple).

J’en suis pour le moment dans la partie adhèrent. Dans cette partie, je dois pouvoir créer un adhérent, le modifier, l’afficher et le supprimer.
Une fois un adhérent supprimé il faut que je comprime le tableau pour ne pas laisser de case vide.

Mon problème ce situ dans la partie compression.

Voilà a quoi ressemble la structure adhérent


struct adherent
{
char nom[15],prenom[15];
int numerau;
};
Je crée ensuite un tableau d’adherent
struct adherent tabadh[100];

Et voilà la fonction

void compretab(struct adherent tabadh[])
{
struct adherent temp[100];
int i=0,j=0;
while (i<100) //compression dans un tableau temporaire
{
if(tabadh[i].nom=="aucune")//défini dans la fonction supprimer
{

strcpy ( temp[i].nom, tabadh[j].nom);
strcpy ( temp[i].prenom, tabadh[j].prenom);
// temp[i].nom=adhtab[j].nom;
// temp[i].prenom=adhtab[j].prenom;
i++;
j++;
}
else
{
j++;
}
}
while(i<100) //recopi du tableau temporaire dans le principal
{
strcpy (temp[j].nom, tabadh[j].nom);
strcpy (temp[j].prenom, tabadh[j].prenom);
// tabadh[j].nom=temp[j].nom;
// tabadh[j].prenom=temp[j].prenom;
}

}
lorsque je lance cette fonction le programme plante tout simplement.

Je compile avec le compilateur de l’invité de commande de mac OS. J’espère vous donner suffisamment d’information pour que vous puissiez m’aider.

Nésite pas si vous avez besoin de plus de détails

Merci d’avance.

Salutation



Philippe Javascript:Insert_Emoticon('/imgs2/smile.gif');

4 réponses

Henker13 Messages postés 3 Date d'inscription mercredi 26 novembre 2008 Statut Membre Dernière intervention 26 novembre 2008
26 nov. 2008 à 13:54
oula . . je peux le modifier . . ?
je ne sais pas pourquoi les lignes n'ont pas étaient sauté . .
Henker13 Messages postés 3 Date d'inscription mercredi 26 novembre 2008 Statut Membre Dernière intervention 26 novembre 2008
26 nov. 2008 à 14:02
void compretab(struct adherent tabadh[],int indexf)
{
struct adherent temp[100];
int i=0,j=0;
while (i<100) //compression dans un tableau temporaire
{
if(tabadh[i].nom=="aucune")
{
strcpy ( temp[i].nom, tabadh[j].nom);
strcpy ( temp[i].prenom, tabadh[j].prenom);
// temp[i].nom=adhtab[j].nom;
// temp[i].prenom=adhtab[j].prenom;
i++;
j++;
}
else
{
j++;
}
}
while(i<100) //recopi du tableau temporaire dans le principal
{
strcpy (temp[j].nom, tabadh[j].nom);
strcpy (temp[j].prenom, tabadh[j].prenom);
// tabadh[j].nom=temp[j].nom;
// tabadh[j].prenom=temp[j].prenom;
}

}
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
27 nov. 2008 à 12:32
Bienvenue !

Et oui pas moyen d'éditer ses messages, et les copiers collers partent parfois en live... A noter dans les outils (A gauche), de quoi coloriser le code. Mais moi il me fait le double de sauts de lignes qu'il ne faudrait... Et il y a aussi un bouton pour prévisualiser dans la RichTextBox en cas de doute.
<hr size="2" width="100%" />void compretab(struct adherent tabadh[], int indexf)
{
  struct adherent temp[100];
  int i=0, j=0;

  while (i < 100) // Compression dans un tableau temporaire
  {
    if(tabadh[i].nom == "aucune")
    {
      strcpy(temp[i].nom, tabadh[j].nom);
      strcpy(temp[i].prenom, tabadh[j].prenom);
      // temp[i].nom = adhtab[j].nom;
      // temp[i].prenom = adhtab[j].prenom;
      i++;
      j++;
    }
    else
    {
      j++;
    }
  }

  while(i < 100) // Recopie du tableau temporaire dans le principal
  {
    strcpy(temp[j].nom, tabadh[j].nom);
    strcpy(temp[j].prenom, tabadh[j].prenom);
    // tabadh[j].nom = temp[j].nom;
    // tabadh[j].prenom = temp[j].prenom;
  }
}
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
27 nov. 2008 à 12:47
Ah oui tu as un problème au fait.

Ta première boucle -> i s'incrémente moins vite que j. Donc tu peux te retrouver avec un j de 200... -> hors tableau -> plantage. Il faut faire du while j < 100

Ta deuxième boucle -> tu fait un while i, puis tu utilises j comme indice pour accèder au tableau. Et tu n'incrémente pas i/j dans ta boucle.

if(tabadh[i].nom == "aucune") -> Ca, ça ne veut rien dire. C'est un test de pointeur. Utilise strcmp à la place. Et je crois que tu voulais écrire !=.

Autre problème, en sortie de première boucle, ton tableau temporaire contient moins de données que le tableau d'entrée. Dans ta deuxième boucle, tu recopie tout le tableau temporaire (les 100 cases) dans le tableau principal. Problème, les 100 cases du temporaire n'ont pas toutes été initialisées -> strcpy va méchament planter en essayant de recopier les données non initialisées.

Tu n'as pas besoin d'un tableau temporaire : sachant que dans ta première boucle i s'incrémente forcément moins que j, tu n'écraseras jamais tes données.

Ton code manque quelque peu de rigueure et de réflexion. N'hésite pas à te relire et utilise régulièrement des printf (Ou un bon débogueur !) pour voir ce qu'il se passe. Je crois que Code::Blocks est dispo sur MAC. Il dispose un débogueur non pas incroyable mais suffisant.

[troll]
Et accessoirement, achète toi un vrai PC.
/troll
Rejoignez-nous