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 :

Copier un tableau dans un tableau plus grand


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 134
    Par défaut Copier un tableau dans un tableau plus grand
    Bonjour,

    Je suis en formation sur un cours C, et je dois rendre un TP, en codant à l'ancienne.
    Comme je fais du java , et plus de c depuis 2005 je suis un peu perdu.

    J'ai besoin de copier un tableau dans un tableau plus grand d'un item, pour ajouter un élément.

    Est-ce qu'en c on peut déclarer la taille d'un tableau dynamiquement avec une variable ?
    Je pensais reprendre la taille du tableau actuel et déclarer un tableau avec un élément en plus
    J'ai surtout des problèmes à trouver la syntaxe exact.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int taille = sizeOf(ancienTableau);
    nouveauTableau[taille+1];
     
    //copie des élément avec for
    for(int i=0;i < taile -1;i++) {
    nouveauTableau[i] = ancienTableau[i];
    }
     
    //ajout du nouvel item à la fin, la taille correspond au dernier index
    nouveauTableau[taille] = nouvelItem;
     
    ancienTableau = nourveauTableau


    Est-ce que c'est possible ?

    Par avance merci

    Cordialement
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 322
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Oui c'est tout à fait possible. Cependant il faut faire attention à ne pas dépasser la taille de la pile sinon un beau segdefault viendra doucher toutes tes espérances .

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 765
    Par défaut
    Hello,

    Vous pouvez regarder du côté de realloc, faîtes vos tests et si ça ne fonctionne pas, posez votre code modifié...

    https://en.cppreference.com/w/c/memory/realloc
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 545
    Par défaut
    Bonjour,

    Citation Envoyé par CoderInTheDark Voir le message
    Est-ce qu'en c on peut déclarer la taille d'un tableau dynamiquement avec une variable ?
    Je pensais reprendre la taille du tableau actuel et déclarer un tableau avec un élément en plus
    Oui mais uniquement à partir de C99 (il y a 26 ans tout de même) et à condition que ton tableau « ne soit pas trop grand ». Par ailleurs, ton tableau sera de fait une variable locale et il ne survivra pas à la sortie du bloc {} qui le contient. Donc tu ne peux pas t'en servir pour le renvoyer en tant que nouvel objet en sortie de fonction, par exemple.

    Explications : en C, en principe, les déclarations de variables doivent toutes se faire en début de bloc avant la première instruction, parce que le compilateur essaie de travailler en une seule passe et a besoin de connaître à l'avance la taille de toutes les variables locales pour réserver de la place dans la pile, où ces variables prendront place, et générer ensuite le code en conséquence. Mais comme toutes ces tailles doivent être connues à l'avance, elles doivent a priori être constantes.

    Depuis C99, il est devenu autorisé de déclarer des variables au milieu du code, chose qui se faisait dans tous les cas avec les langages interprétés car le problème ne se pose pas dans cette situation, mais également avec le C++ où c'est non seulement possible, mais parfois nécessaire. Il s'agit donc d'un rétroportage, avec plusieurs autres fonctionnalités comme les commentaires //, importés eux-aussi du C++ avec la même version de la norme.

    Par ailleurs — même en continuant à déclarer ses variables en début de bloc — chaque fois que l'on entre dans un bloc {} à l'intérieur d'un autre, on ouvre un cadre de pile et on peut y déclarer de nouvelles variables locales. Comme cette allocation a lieu à l'exécution, il est possible d'y réserver une taille arbitraire dont la valeur serait définie par une variable. C'est ce que l'on appelle les VLA (Variable Length Array) et c'est défini avec C99 également. Vu de l'extérieur, cela semble ne rien changer. En réalité, à la compilation, ça demande d'introduire des indirections supplémentaires parce ni la taille ni l'emplacement exact, même par rapport au début du cadre de pile, ne peut être connu à l'avance.

    On pourrait légitimement penser, également, que tout variable que soit ce tableau, sa longueur devrait quand même être définie avant d'ouvrir le cadre de pile, donc dans une variable située dans le bloc parent et pas le bloc courant. Cependant, quelques tests effectués à l'instant semblent montrer que le compilateur s'en accommode très bien, même en C99 strict.

    Quoi qu'il en soit, bien retenir que :
    • Il ne s'agit pas d'une allocation dans le tas (utiliser malloc, realloc et free pour cela) ;
    • Il n'y a pas de garbage collector en C ;
    • Ce tableau est déclaré dans la pile, donc débordements à prévoir si l'on dépasse une taille raisonnable ;
    • On peut se servir de ce tableau pour calculer des résultats et éventuellement les retourner, mais on ne peut pas retourner le tableau lui-même ;
    • Ne surtout pas utiliser cette approche dans une fonction récursive sans prendre d'extrêmes précautions.

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 466
    Par défaut
    Comme ici rien n'est typé, faire attention à la différence entre le sizeof d'un tableau et le nombre d'éléments qu'il contient.
    Il vaut mieux gérer en termes de nombres d'éléments car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    taille_du_tableau = NbElements * sizeof(element);

  6. #6
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 134
    Par défaut
    Ok merci

    Bon je vais oublié cette solution pour rester sur un tableau fixe.

    Cordialement
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exporter les données d'une table dans une table plus grande
    Par pierricktpt dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/04/2012, 16h20
  2. [Débutant] Mettre une image dans une matrice plus grande
    Par Artinuin dans le forum Images
    Réponses: 5
    Dernier message: 07/05/2010, 12h31
  3. Copie d'un tableau dans un tableau plus grand
    Par oodini dans le forum Débuter
    Réponses: 3
    Dernier message: 24/09/2007, 17h09
  4. Barre de défilement dans une figure plus grande que l'écran
    Par camillechambon dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 23/04/2007, 11h40
  5. Réponses: 13
    Dernier message: 07/01/2007, 20h43

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