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 :

problème allocation dynamique tableau 2d


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut problème allocation dynamique tableau 2d
    Bonjour, je ne suis pas débutant en c++, et pourtant je suis saisi d'un doute. Je m'explique, je tente d'allouer un tableau 2D dynamiquement de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    float ** tableau;
    tableau = new float * [nombreDeLigne];
    ....
    for(int i=0; i<nombreDeLigne; i++)
          tableau[i] = new float [nombreDeColonneVariableDuneLigneALautre];
    Et je suis gratifié d'un crash à l'exécution. Vous aurez probablement compris ma question, est il possible d'instancier dynamiquement un tableau avec un nombre de colonne variable selon les lignes ? Je l'ai déjà fait sans que cela ne pose jamais le moindre problème, mais dans ma situation je ne vois vraiment pas ce qui peut clocher d'autre. Voilà, vous remerciant par avance pour vos réponses.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Et pourquoi pas un vector ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector< std::vector<float> > v(nombreDeLigne);
    for( size_t i=0; i<nombreDeLigne; i++ )
        v.at(i).resize( nbdecolonnequetuveux );
    Pour ma part, il y a longtemps que je ne m'embête plus avec les new sur des tableaux, trop casse gueule...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Question de performances, par ailleurs je dois balancer mon tableau à une API ne prenant pas les vectors.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par virtual_bug Voir le message
    Question de performances, par ailleurs je dois balancer mon tableau à une API ne prenant pas les vectors.
    Je suis dubitatif sur le gain en perf, mais bon, admettons...

    Et pour acceder au tableau sous-jacent, tu as de toute façon la méthode 'data()', qui te permet de récupérer le pointeur:
    http://en.cppreference.com/w/cpp/container/vector/data

    De plus, l'utilisation d'un tel conteneur te dispensera de gérer les 'delete' associés.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Va pour un vector, mais je souhaiterai quand même obtenir une réponse à ma question, c'est bon à savoir.

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Citation Envoyé par virtual_bug Voir le message
    Et je suis gratifié d'un crash à l'exécution. Vous aurez probablement compris ma question, est il possible d'instancier dynamiquement un tableau avec un nombre de colonne variable selon les lignes ?
    Je dirais oui, et heureusement !!
    Tu est sûre que ce n'est pas plutôt l'utilisation des tableaux (tu vas pointer à la 10e colonnes de la iième ligne, alors qu'elle n'en contient que 9) qui fait crasher et pas les allocations mémoires ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Oui, je suis certain de mon utilisation, le crash intervient au moment de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[i] = new float[tailleVariable];
    , j'ai bien vérifié ma première allocation avec un nombre de ligne amplement suffisant. Ce qui est curieux, c'est que si j'exécute en mode débogage, tout se passe bien, mais en exécution standard ça crashe . Par contre si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[i] = new float[100000];
    , ça passe !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Ya du nouveau, si je remplace mon tableau par un vector<float *>, ca crashe exactement de la même façon au moment du push_back(new float[taille]), et là encore j'ai bien vérifié toutes mes variables de dimensions, je n'y comprends plus rien ! La seule explication que je vois est que ça plante à un autre endroit. J'ai identifié la ligne à l'aide de cout << et puisque ça ne plante pas avec le débogueur je ne vois pas comment faire d'autre. Des idées ?

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Si le nombre de colonnes varie d'une ligne à l'autre, es tu déjà certain que tu n'essayes pas d'accéder à un indice supérieur au nombre de colonnes que tu as pour une ligne donnée

    Comment fais tu pour gérer le nombre de colonnes pour un ligne donnée

    Vérifie peut etre déjà que tu définisse la valeur correcte, et qu'elle soit bien prise en compte

    Vérifies ensuite tous les endroits où tu utilises cette valeur pour etre sur de rester dans l'écart admis (surtout sur les appels en écriture )

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Salut, et merci pour ta réponse. Oui, j'ai bien vérifié la taille de mes lignes et colonnes, par ailleurs puisque c'est au moment de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[i] = new float[tailleVariable];
    que le crash intervient, la taille des colonnes est sans importance, je n'écris pas encore dedans. J'ai tenté de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tableau = new float * [10000];
    tableau [0] = new float[taillequelconque];//ça ça marche
    tableau[1] = new float[taillequelconqueInférieurALaPrecedente];//ça crash !
    ça ne marche pas non plus. Je crois que je vais lacher l'affaire, je ne m'en sors vraiment pas.

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Ca crash, mais que dit l'OS ? D'ailleurs c'est lequel ?

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    L'os (w7x64) se contente de dire que le programme a cessé de fonctionner, voici les informations détaillées :
    Signature du problème*:
    Nom d’événement de problème: APPCRASH
    Nom de l’application: test.exe
    Version de l’application: 0.0.0.0
    Horodatage de l’application: 4f8bfc42
    Nom du module par défaut: ntdll.dll
    Version du module par défaut: 6.1.7601.17725
    Horodateur du module par défaut: 4ec49b8f
    Code de l’exception: c0000005
    Décalage de l’exception: 00033e04
    Version du système: 6.1.7601.2.1.0.256.48
    Identificateur de paramètres régionaux: 1036
    Information supplémentaire n°*1: 0a9e
    Information supplémentaire n°*2: 0a9e372d3b4ad19135b953a78882e789
    Information supplémentaire n°*3: 0a9e
    Information supplémentaire n°*4: 0a9e372d3b4ad19135b953a78882e789

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 040
    Points
    33 040
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    es-tu sur que la variable a bien une valeur correcte ? > 0 ?

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Oui.

    Je vais m'arrêter là et passer à autre chose, je suis dépassé ! Merci à tous pour vos réponses.

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 040
    Points
    33 040
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par virtual_bug Voir le message
    Oui, je suis certain de mon utilisation, le crash intervient au moment de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[i] = new float[tailleVariable];
    , j'ai bien vérifié ma première allocation avec un nombre de ligne amplement suffisant. Ce qui est curieux, c'est que si j'exécute en mode débogage, tout se passe bien, mais en exécution standard ça crashe . Par contre si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[i] = new float[100000];
    , ça passe !
    Ce sont pourtant exactement les symptomes.
    En debuger ça ne crash pas parce qu'il va utiliser des valeurs par défaut d'initialisation le plus souvent. Sous visual je peux faire un new float[0], en pas-à-pas ça ne bronche pas, par contre en exécution normale, j'aurais une alerte de memory corruption, sans que ça crash.
    En release, le crash est instantanné.

  16. #16
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 379
    Points
    5 379
    Par défaut
    Si tu as un popup système qui t'annonce le crash, tu peux attacher le processus (la fenêtre) dans visual et voir pour quelle valeur ca plante.

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Résolu. Comme vous l'aviez suggéré, c'est bien au moment du remplissage que ça déconnait, le cout << placé juste après mon new n'étant pas flushé au moment où il le devrait, l'identification de la ligne provoquant l'erreur était fausse. Merci à tous.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/05/2008, 13h12
  2. Problème allocation dynamique ?
    Par Dark_Alex69 dans le forum C
    Réponses: 15
    Dernier message: 20/11/2007, 15h44
  3. problème allocation dynamique
    Par josef24 dans le forum Débuter
    Réponses: 6
    Dernier message: 12/11/2007, 12h31
  4. Allocation dynamique: Tableau de pointeur sur char
    Par Anonymouse dans le forum Débuter
    Réponses: 4
    Dernier message: 21/10/2007, 10h57
  5. Allocation dynamique tableau dans structure
    Par chental dans le forum C
    Réponses: 2
    Dernier message: 03/08/2006, 09h03

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