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 :

Allocation dynamique d´un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par défaut Allocation dynamique d´un tableau
    bonjour,
    j´ai un probleme avec un programme en c que j´essaie d´ecrire.
    Dans mon programme en C je recupere des donnees provenant d´une application ét je voudrais les stocker dans un tableau.J´ai donc creer une fonction mais le probleme c´est que le nombre des donnees que je recupere n´est jamais la meme. Quand je declare ma function, ca me dit qu´il faut que je mette une constante dans mon nombre d´elements du tableau. Mais je ne peux pas savoir le nombre d´elements avant de recevoir les donnees.
    J´ai regarde des infos sur l´allocation dynamique, j´ai vu qu´on pouvait creer ce tableau de taille variable dans le main mais comment faire quand on veut l´utiliser dans une fonction au niveau de la declaration de la fonction?
    Merci de prendre un peu de votre temps pour me repondre.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    On fait exactement comme tu ferais avec un tableau automatique, on passe l'adresse du premier élément. Il faut par ailleurs un mécanisme permettant de savoir combien d'éléments le tableau contient.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par défaut
    le probleme c´est que je declare ma function avant le main et apres je l´explicite.

    void (tab);

    int main
    {... recuperation des donnees}

    void(tab){...}

    Il me faut connaitre la taille du tableau avant le main et moi je la connais pas.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Tu n'as pas besoin de connaitre la taille du tableau à l'avance. Tu passes simplement à ta fonction le pointeur que tu as initialisé par un appel à malloc(), et tu lui passes en plus la taille du tableau.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    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
    T* CreerTableau(size_t N) //crée un tableau de N éléments de type T
    {
       T* tab = malloc(N* sizeof *tab);
       // éventuellement, si tab != NULL, on peut initialiser le tableau
       return tab;
    }
    int main (void)
    {
      .... // je fais des choses
           // je connais maintenant la taille N du tableau
           // Alors je peux créer le tableau
      T* tab = CreerTableau(N); // avec T le type des éléments du tableau
      if(tab != NULL)
      {  
        LireTableau(tab,N,....);  // recuperation des donnees
      ....
    }
    Si la fonction CreerTableau est placée après le main, mettre avant le main son prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T* CreerTableau(size_t N); // ne pas oublier le ;

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par défaut
    merci matafan et diogene pour vos reponses,
    c´est exactement ce que j´avais besoin et ca marche.
    Une fois que j´ai creer ce tableau j´arrive a afficher ce qu´il contient mais comment recuperer tous les elements du tableau dans mon int main.
    En faite j´ai besoin d´utiliser ce qu´il y a dans le tableau.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    En faite j´ai besoin d´utiliser ce qu´il y a dans le tableau.
    Oui, sinon, ça ne servirait à rien !

    Si tu es sur la trame que j'ai précédemment envoyé, rien de plus simple :
    exemple pour montrer comment accéder aux éléments du tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main (void)
    {
      ....
      T* tab = CreerTableau(N); // avec T le type des éléments du tableau
      if(tab != NULL)
      {  
        LireTableau(tab,N,....);  // recuperation des donnees
        // multiplier par 2 les éléments positifs  du tableau :
        for(i=0;i<N;i++)
           if (tab[i] >0 ) tab[i] = 2*tab[i] ;
    }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par défaut
    Merci diogene ca marche tres bien, maintenant ce que j´aimerais faire c´est creer une fonction avec mon pointer comme parametre, attribuer des valeurs a tous elements pointes par le pointeur (ca j´arrive a le faire) et pouvoir utiliser ces valeurs dans le int main.
    J´arrive a remplir les elements pointes par mon pointeur et les afficher dans ma fonction mais je n´arrive pas a les reutiliser dans mon main.

    type fde unction utilisé:
    void (mxArray* in,double* ptr)
    je recupere les elements du mxArray et je les mets dans les elements pointes par mon pointer mais je ne peux pas les utiliser en dehors de ma fonction.
    Est ce que c´est possible au moins de faire ca?
    Parce que vu que je rempli mon pointer en me servant d´un autre pointer je sais pas trop.

    Je me demande si quand vous avez commence a programmer vous etiez comme moi (c est a dire un peu perdu) ou si vous etiez plus a laise.

Discussions similaires

  1. allocation dynamique à un tableau
    Par amateurc dans le forum Débuter
    Réponses: 4
    Dernier message: 25/06/2008, 20h24
  2. Réponses: 11
    Dernier message: 11/06/2008, 18h05
  3. Bug sur une allocation dynamique de tableau
    Par Atharendil dans le forum C++
    Réponses: 6
    Dernier message: 15/12/2007, 23h42
  4. Réponses: 9
    Dernier message: 12/06/2007, 14h15
  5. Réponses: 6
    Dernier message: 26/11/2005, 19h55

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