IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

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

C Discussion :

Décalage indice d'un tableau


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 2
    Par défaut Décalage indice d'un tableau
    Bonsoir à tous,

    Dans le cadre d'un exercice je travaille avec un tableau de pointeur du type Livre (type créé par moi même) afin de gérer une "bibliothèque".
    J'aimerai écrire une fonction qui permet, à partir d'un indice du tableau, de décaler tous les livres d'un tableau de livre vers la droite.
    Le tableau a suffisamment de place pour le permettre.

    La signature de la fonction : void decalerStock (Livre *s, int taille, int indice);, indice à partir duquel il faut décaler les éléments de s & taille : nombre d'éléments dans s.

    Voici ma proposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Livre *intermediaire = malloc( (taille-indice)*sizeof(Livre)); //j'alloue un tableau intermédiaire de la taille exacte nécessaire
     
    for(int i=indice ; i<taille; ++i){             //je remplis mon tableau intermediaire des taches à déplacer
        intermediaire[i-indice]=s[i];
    }
     
    for(int j=indice+1 ; j<=taille ; ++j){
        s[j]=intermediaire[j-indice-1];
    }
    free((void*)intermediaire);
    J'ai l'impression cependant que ça revient à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=taille-1 ; i>indice ; --i){
        s[i]=s[i-1];                               //on fait pointer chaque indice de i vers l'indice précédent
    }
    Mais dans les 2 cas, j'ai l'impression que je fais une erreur au niveau des pointeurs, pouvez-vous m'aider svp ?

    Merci d'avance,

    EDIT :
    En schématisant le problème, j'ai réalise que chaque pointeur d'indice i doit pointer vers l'adresse contenue par le pointeur d'indice i-1

    Cela reviendrait à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=taille ; i>indice ; --i){
        s[i]=*s[i-1];                              Le pointeur i (de type livre) pointe vers l'adresse contenue par le pointeur i-1
    }
    Cependant, ai-je le droit d'écrire cela (notamment *s[i-1] dans le cas où s est de type Livre que j'ai créé)

    Merci encore d'avance,

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Le premier code me paraît presque correct, sauf l'allocation dynamique qui n'a pas la bonne taille. Il faut allouer (taille-indice) pointeurs.
    Le second code est correct (et est le plus optimal!)
    Le troisième n'a pas de sens. s[i-1] est un Livre* donc *s[i-1] est un Livre, alors que s[i] est un Livre*, tu veux donc copier une structure dans une variable de type pointeur!

    Mince j'ai tout faux, je pensais à un tableau de pointeurs (ce que j'aurais créé pour décaler rapidement les Livres).
    Donc ton allocation est finalement correcte. Il faut bien (taille-indice) * sizeof(Livre).
    Le troisième n'a pas de sens car s[i-1] est un Livre donc *s[i-1] cherche à déréférencer quelque chose qui n'est pas un pointeur donc n'a pas de sens.

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 752
    Par défaut
    Pour moi, il y a une cou*lle quelque part

    Soit tu fais un tableau de pointeurs, et donc le décalage est simple (*tab_pointeurs) = *(tab_pointeurs - 1).
    Soit tu fais un tableau d'"objets" (<- grosses pincettes), alors là ton affectation ne fonctionne pas.
    Il me semble que dans ce cas , le C fait une copie binaire. Le C n'est qu'un langage procédural (*) et donc il faut coder une fonction/ interface pour copier/ déplacer un livre vers un autre.

    Et sinon tu ne maîtrises pas l'arithmétique des pointeurs tab[i] est équivalent à *(tab + i). Avec *tab[i] tu sembles être perdu entre écriture pointeur et écriture crochet


    *: Ici , il faut comprendre qu'on n'a pas un mécanisme de constructeur de recopie ou de surcharge de l'affectation ... comme avec le langage C++ par exemple.

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 2
    Par défaut
    Merci pour votre réponse,
    En effet ces notions sont très nouvelles et j'ai beaucoup de mal à les comprendre
    Pourtant je vous parle d'un sujet d'exercice qui m'a été donné et ça correspond aux consignes données.

    Du coup, quel conseil me donneriez-vous pour tout décaler d'un rang pour un tableau de pointeur ?

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 186
    Par défaut
    Moi je te conseillerais de plutôt utiliser une liste chainée.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par pzorki Voir le message
    Voici ma proposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Livre *intermediaire = malloc( (taille-indice)*sizeof(Livre)); //j'alloue un tableau intermédiaire de la taille exacte nécessaire
     
    for(int i=indice ; i<taille; ++i){             //je remplis mon tableau intermediaire des taches à déplacer
        intermediaire[i-indice]=s[i];
    }
     
    for(int j=indice+1 ; j<=taille ; ++j){
        s[j]=intermediaire[j-indice-1];
    }
    free((void*)intermediaire);
    Pourquoi remplir tout un second tableau ? Pour décaler des éléments tu as juste besoin d'une place, pas de "n" places !!!
    En plus tu dis que le tableau a la place pour le décalage. Donc te suffit de prendre une place libre dans le tableau d'origine

    Citation Envoyé par pzorki Voir le message
    J'ai l'impression cependant que ça revient à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=taille-1 ; i>indice ; --i){
        s[i]=s[i-1];                               //on fait pointer chaque indice de i vers l'indice précédent
    }
    En effet, c'est exactement ça. Décaler les éléments c'est partir de la fin en revenant vers le point de base du décalage

    Citation Envoyé par pzorki Voir le message
    Cela reviendrait à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=taille ; i>indice ; --i){
        s[i]=*s[i-1];                              Le pointeur i (de type livre) pointe vers l'adresse contenue par le pointeur i-1
    }
    Absolument pas. Un élément d'un tableau ne peut pas être égal à son pointé (ou au pointé d'un autre élément)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 35
    Par défaut
    Une fois ton tableau initialisé, tu peux te servir du tableau lui même pour te déplacer dedans. Je veux parler ici de l'arithmétique des pointeurs. Le nom de ton tableau est un pointeur vers son premier éléments. Donc en faisant montableau++, tu fais avancer le pointeur au prochain élément (avec accès à la valeur par *montableau).

Discussions similaires

  1. Les indices d'un tableau multidimension
    Par aikinhdo dans le forum Langage
    Réponses: 1
    Dernier message: 04/04/2007, 18h24
  2. [Tableaux] Récupérer l'indice d'un tableau
    Par emageren dans le forum Langage
    Réponses: 2
    Dernier message: 03/11/2006, 10h21
  3. Réponses: 11
    Dernier message: 26/05/2006, 17h51
  4. Réponses: 2
    Dernier message: 11/04/2006, 22h54
  5. [Tableaux] Recuperer le plus grand indice d'un tableau
    Par schnito dans le forum Langage
    Réponses: 4
    Dernier message: 31/01/2006, 20h01

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