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 :

Recopie de tableau


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut Recopie de tableau
    Bonjour,

    Je ne vois vraiment pas où pourrait être le bug, mais bug il y a sûrement ici:

    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
     
     
    // initialisation effectuée qu'une seule fois:
     
    vect=new SignEval[allocSize];
     
    // plus loin, répété un nombre arbitraire de fois:
     
    allocSize=2*allocSize+1; // *
    SignEval* aux=vect; // pour se rappeler de l'adresse de vect
    vect=new SignEval[allocSize];
    // boucle pour récupérer les anciennes valeurs; currSize<allocSize depuis *
    for (int i=currSize-1; i>=0; i--) vect[i]=copie(aux[i]);
    // enfin on libère l'espace mémoire devenu inutile
    delete [] aux;
    // puis on ajoute le nouvel élément
    vect[currSize++]=copie(parametre_de_la_fonction)
    Le constructeur de recopie est OK d'après mes tests précédents sur une autre version du programme, et j'alloue bien le bon espace mémoire. J'en déduis qu'il y a un problème avec delete [] aux ou SignEval* aux=vect, mais je ne vois vraiment pas pourquoi :-/

    J'obtiens une segFault avec l'utilisation de cette classe, et tout se passe bien en utilisant la STL (wiwiwi je sais utiliser la STL c'est bien mieux, mais je voulais la spécialiser pour ce dont j'ai besoin).

    Merci d'avance,
    Benjamin.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Dans le bout de code en question, je ne vois pas de problèmes, mais il y a plein de non dits :
    - Es-tu vraiment certain de tes constructeur de copie et opérateur= et destructeurs ? Ils peuvent passer certans tests et pas d'autres.
    - Que fait la fonction copie ?
    - Que vaut currSize ?
    - Question de stye : Pourquoi remplis-tu la copie à l'envers ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    Citation Envoyé par JolyLoic
    Dans le bout de code en question, je ne vois pas de problèmes, mais il y a plein de non dits :
    - Es-tu vraiment certain de tes constructeur de copie et opérateur= et destructeurs ? Ils peuvent passer certans tests et pas d'autres.
    - Que fait la fonction copie ?
    Voici le constructeur de recopie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SignEval (int pf, float ev, unsigned long cle) {
       prof=pf;
       eval=ev;
       clef=cle;
    }
    - Que vaut currSize ?
    Initialisé à zéro, reste toujours <=allocSize et est donc <allocSize après la ligne commentée "// *".

    - Question de stye : Pourquoi remplis-tu la copie à l'envers ?
    Car la comparaison à 0 est plus rapide, même si le compilo s'en chargerait sûrement sans moi

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Chewbi
    Voici le constructeur de recopie:
    Ce que tu me montres n'est pas un constructuer de copie, mais un simple constructeur.

    Et la fonction copie, elle est écrite comment ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    en fait si, car je zappe l'appel au constructeur de recopie (new appelant le constructeur basique) pour effectuer des assignations "prof=pf; eval=ev; clef=cle;" plus rapides qu'un appel de fonction; donc c'est une sorte de recopie :-)

    Désolé de ne pas avoir répondu plus tôt, je préparais mon retour en France (j'étudie au Québec et viens de rentrer pour les vacances).

    Sinon, j'ai résolu mon problème bêtement: il suffisait d'initialiser le pointeur vect à 0 dans le constructeur, évitant les appels de delete [] avec des valeurs bidons. J'ai un peu honte :-/

    Bonnes fêtes de noël,
    Benjamin.

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

Discussions similaires

  1. [Toutes versions] Recopier un tableau d'une autre feuille via une liste déroulante
    Par alex.du.09 dans le forum Excel
    Réponses: 3
    Dernier message: 18/05/2011, 17h10
  2. [VBA-E]Recopier un tableau en supprimant les plages vides
    Par jefe.k dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 16/02/2007, 16h13
  3. Comment recopier le contenu d'1 TEXTAREA dans 1 tableau(TABLE)
    Par Invité dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 30/10/2006, 16h06
  4. Recopie dans un tableau
    Par Goundy dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 26/11/2005, 21h25

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