Pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter, inscrivez-vous gratuitement !

 

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 7
    Points : 3
    Points
    3

    Par défaut Supprimer une case d'un tableau

    Bonjour à tous!

    Je fais appel à votre expérience pour une question qui me bloque:
    Je travaille sur un tableau de types structurés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct {
    char titre [40];
    char artiste [40];
    int annee;
    char genre [40];
    char fichier_pochette [40];
    } t_cd ;
     
     
    typedef struct {
        t_cd tab[MAX];
    } t_liste;
    Mon problème: je souhaiterais supprimer une case de ce tableau qui manipule des informations sur des CDs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void supprimerCD(char titre[40], t_cd liste [], int *nb_cd){
     
    int i=0; // indice qui correpond au i-eme CD
    int j=0;
     
    int R;
    for (i=0; i<=*nb_cd; i++)
    {
        R=strcmp(titre , liste[i].titre); 
        if (R==0)
        {
     
    		    for (j=i; j<=*nb_cd-i; j++){
    		    liste [j]= liste [j+1];
     
    // c'est ici que je bloque.. comment creer un nouveau tableau mais de dimension -1 
     
    		    } 
                break;
     
        }
    }
        if (R!=0){
            printf("CD NON TROUVE\n");
        }
     
    }

    J'ai compris la manoeuvre: je recopie tout mon tableau en remplaçant celle que je veux supprimer par celle d'après puis je recopie mon tableau dans
    un autre taille de dimension [t-1].
    C'est justement cette partie que je n'arrive pas à faire.

    Merci par avance!

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    juin 2007
    Messages
    4 052
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 052
    Points : 7 112
    Points
    7 112

    Par défaut

    La taille de ton tableau est déclarée lors de la compilation : c'est la valeur "MAX".
    Dans ce cas de figure, il faut généralement stocker une valeur supplémentaire indiquant le remplissage du tableau.
    Exemple pour l'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct
    {
      t_cd tab[MAX];
      size_t size_tab;
    } t_liste;
    Tes fonctions vont gérer la structure "t_liste" en prenant en compte la taille utilisée, tout en prenant garde de ne jamais dépasser la valeur "MAX".
    Pour la suppression, si l'ordre de stockage n'a pas d'importance, tu peux simplement remplacer l'élément à supprimer par le dernier élément de la liste puis diminuer la taille de "1".
    Sinon, si l'ordre a de l'importance, alors utilise la fonction "memmove" pour décaler toutes les valeurs d'une case vers la gauche en écrasant la valeur à supprimer, puis décrémenter le membre "size_tab".

    EDIT : memmove et pas memcopy comme le fait remarquer plus bas Matt_Houston, puisque la zone de départ et la zone de fin se chevauche.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Merci beaucoup pour tes conseils !! J'essaie tout ça!

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Bon je viens d'essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void supprimerCD(char titre[40], t_cd liste [], int *nb_cd){
     
    int i=0; // indice qui correpond au i-eme CD
    int j=0;
    size_t size_tab;
     
    int R;
    for (i=0; i<=*nb_cd; i++)
    {
        R=strcmp(titre , liste[i].titre);
        if (R==0)
        {
     
    		    for (j=i; j<=*nb_cd-i; j++){
    		    liste [j]= liste [j+1];
    		    }
     
    		    break;
     
        }
    }
    size_tab =size_tab-1;
        if (R!=0){
            printf("CD NON TROUVE\n");
        }
     
    }
    Je ne suis pas sur du placement par contre.

    En fait ma procédure me supprime bien les données que je souhaite supprimer mais les remplace par un 0.
    Je m'explique:
    supposons que je rentre 2 disques:
    a
    a
    1
    a
    a

    et

    b
    b
    1
    b
    b


    je fais ensuite supprimer "b" et j'obtiens:

    a
    a
    1
    a
    a



    0



    Donc en soit mon programme fonctionne sauf que j'ai ce "0" qui m'agace !

    Et en ajoutant le size_tab-1 ca ne change rien...

  5. #5
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 322
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 322
    Points : 3 882
    Points
    3 882

    Par défaut

    Ce que dinobogan explique c'est qu'un tableau ou, pour utiliser un terme plus général, un conteneur de type vecteur (qui stocke a priori ses éléments de manière contigüe en mémoire) possède deux caractéristiques distinctes : son nombre d'éléments et sa capacité, qui est la limite supérieure du nombre d'élément.

    Si le conteneur est un tableau C, sa capacité (ici : MAX) est fixe. Si la mémoire occupée par le conteneur est allouée de manière dynamique en revanche, cette grandeur est susceptible de varier en fonction des besoins de l'application.

    Note que j'ai évité ici d'employer le terme de taille qui est justement ambigü : s'agirait-il de la taille en octets d'un seul élément ? Du nombre d'éléments dans la collection ? De la capacité du conteneur ? De la quantité de mémoire occupée par le conteneur, en octets ? Etc, etc..


    Citation Envoyé par dinobogan Voir le message
    Sinon, si l'ordre a de l'importance, alors utilise la fonction "memcpy" pour décaler toutes les valeurs d'une case vers la gauche en écrasant la valeur à supprimer, puis décrémenter le membre "size_tab".
    Attention : lorsque l'on intervient en place et que les deux buffers sont susceptibles de se chevaucher, on doit utiliser memmove en lieu et place de memcpy.

Discussions similaires

  1. Supprimer une case d'un tableau
    Par saidma dans le forum java.util
    Réponses: 4
    Dernier message: 26/10/2014, 11h55
  2. Supprimer une case vide d'un tableau
    Par Ahmad1994 dans le forum java.util
    Réponses: 2
    Dernier message: 17/02/2014, 11h31
  3. Supprimer une case d'un tableau
    Par cedji dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 02/04/2012, 11h28
  4. supprimer une case d'un tableau
    Par marooh dans le forum C
    Réponses: 19
    Dernier message: 22/10/2010, 16h14
  5. Supprimer une case d'un tableau de structure
    Par GomuSan dans le forum C
    Réponses: 3
    Dernier message: 30/12/2007, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo