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 :

Probleme d'allocation dynamique


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 12
    Points
    12
    Par défaut Probleme d'allocation dynamique
    Bonjour tous !

    J'ai un petit probleme :
    Je n'arrive pas a faire une allocation dynamique d'un tableau de char*.

    Le tableau devras contenir 'nb_ligne', ce 'nb_ligne' n'est connue qu'à l'execution du programme, une ou deux lignes avant l'allocation.
    Et chaque ligne est un char[1024].

    J'ai donc essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char** Mon_Tableau = new char[nb_ligne][1024]; 
    for( int j=0 ; j<nb_ligne ; j++)
        List_Histo[j] = new char[1024];
    Mais j'ai une erreur a la compilation, sur la 1ere ligne :
    E2034 Impossible de convertir 'char (*)[1024]' en 'char**'
    Un cast permet de compiler, mais l'allocation ne se fait pas correctement.
    (C'est avec Borland C++Builder 6, j'ai l'oligation de travailler avec lui mais j'ai tout de meme essayé avec Visual, pour voir, et là, cast ou pas cast, sa compile pas !)

    Je croit avoir essayé toutes les variantes possibles, mais je n'arrive pas à me debarrasser de ce probleme.

    Merci de votre aide.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Des éléments de réponse dans la FAQ.
    Sinon peut-être qu'utiliser les chaînes de caractères C++ (std::string) simplifierait le problème ?

    MAT.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Effectivement, en C++ un tableau de chaînes c'est un std::vector<std::string>, surtout pas un char**.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Merci pour vos reponses, mais j'aimerais un peu plus de precisions, svp.

    Pourquoi est-ce impossible d'utiliser des char* puisque la deuxieme dimension fait toujours 1024 caracteres et que la premiere est connue juste avant l'allocation ?
    On connait bien la taille de chaques elements.

    Quand a la FAC, je l'avait deja regarder. C'est le meme type d'exemple que dans l'aide de visual et de borland, avec des int, donc cela ne m'aide pas plus que ça...

  5. #5
    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,
    Bien que j'adhere completement à l'avis de Mat007 et de laurent, on va quand meme te donner un petit élément de réponse, histoire de te coucher ce soir un peu moins "ignare" (dit tout en gentillesse ) que ce que tu ne l'étais ce matin

    Quand tu déclares une variable sous la forme de
    tu es bien conscient de déclarer un ... pointeur de pointeurs de type char...

    La mémoire que tu dois allouer, c'est... simplement la mémoire suffisante pour contenir le nombre de pointeurs de type char qui t'intéresse...

    Autrement dit, uniquement la valeur contenue dans nbligne

    Par la suite, effectivement, il s'agira d'allouer la mémoire pour le nombre de caractères que doit prendre chaque ligne

    Ce n'est donc pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char **mavar=new char[nbligne][1024];//erreur
    que tu dois faire, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char **mavar= new char*[nbligne];
    for(unsigned int i=0;i<nbligne;i++)
        mavar[i]=new char[1024];
    C'est à dire:
    • Allouer un espace mémoire suffisant pour le nombre de lignes voulu
    • Pour Toute ligne voulue, allouer un espace mémoire suffisant pour contenir le nombre de caractères voulu


    Mais, on ne le redira jamais assez: la S(T)L en général, les std::string et std::vector en particulier permettent de gérer de manière bien plus simple les chaines de caractères et les tableaux de chaines en particulier

    Tu nous rétorqueras sans doute que, pour une raison d'intégration de ton programme, tu dois pouvoir disposer d'une chaine de caractères "C style"

    Nous pourrons te rassurer: la methode c_str() des std::string est là pour cela

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Quand a la FAC, je l'avait deja regarder. C'est le meme type d'exemple que dans l'aide de visual et de borland, avec des int, donc cela ne m'aide pas plus que ça...
    Y a pas vraiment de différence fondamentale entre allouer un int** et allouer un char**, pas plus qu'allouer un Toto** ou un TrucMuche*****.
    Ce qui est expliqué dans la FAQ c'est la manière correcte d'allouer un tableau à plusieurs dimension, quelque soit le type des éléments et le nombre de dimensions.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Ouaip, en faite c'est comme sa que j'avais commencer, mais cela ne fonctionnait pas.
    J'en avait deduit que cela venait de l'allocation mais mon erreur venait d'ailleur, plus loin dans le code.

    Il faut dire que je decouvre Borland, et que je ne comprend pas grand chose à son debogueur...

    Merci de votre aide en tout cas, et desolé pour le derangement, qui n'avait pas vraiment lieu d'etre...
    j'aurais au moins appris certaines choses ! Je me concherais moins ignare !

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

Discussions similaires

  1. probleme allocation dynamique de mémoire
    Par totoscill dans le forum C
    Réponses: 18
    Dernier message: 28/02/2008, 16h44
  2. Probleme Re Allocation dynamique 2D
    Par zicos dans le forum C
    Réponses: 6
    Dernier message: 03/06/2007, 11h01
  3. probleme d'allocation dynamique de mémoire
    Par Blo0d4x3 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2007, 07h53
  4. probleme allocation dynamique
    Par ciberju dans le forum C
    Réponses: 2
    Dernier message: 28/08/2006, 09h40
  5. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27

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