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 :

Utilisation du malloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Par défaut Utilisation du malloc
    Bonjour !!

    Je souhaiterai utiliser la fonction malloc pour créer un tableau de nombre. Truc simple en apparence mais les exemples des différents tutos que j'ai trouvé ne marche pas chez moi... peut-être parce que je n'ai pas très bien compris le principe de la chose...

    Je définis un variable ii puis je veux créer un tableau de ii+1 cases.... Est-ce possible ?
    Pour le moment j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int ii = 512;
    double *Qmoy = malloc(ii *sizeof(double));
    ce qui normalement me crée un tableau de ii = 512 cases mais ça ne marche pas
    J'ai le message d'erreur suivant :
    initializer element is not constant
    Si quelqu'un pouvait m'aider...

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Où sont définies ces variables? Au niveau global? Si oui, il n'est pas possible d'initialiser de cette manière en faisant appel à une fonction. Il faut faire l'appel à malloc() dans une de vos propres fonctions (au début du main() par exemple).

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int ii = 512;
    double *Qmoy;
     
    int main(void)
     {
     Qmoy=malloc(ii *sizeof(double));
     ...
     }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Par défaut
    Je me suis construit un ti exemple tout simple

    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void main()
    {
    int i, tt = 1440.;
    double *h;
    double *h = malloc(tt *sizeof(double));
     
    for (i=0; i<=tt; i++)
        {
        h[i] = PI;
        printf("%f", h[i]);
        }  
    }
    ça marche nickel

    Comme j'aimerai utiliser tt et [I]h d'autres fois dans mon programme, j'ai tenté ça et là...
    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
    18
    19
    20
     
    int tt = 1440.;
    double *h;
     
    void remplissage()
    {
    int i;
    for (i=0; i<=tt; i++)
        {
        h[i] = PI;
        printf("%f", h[i]);
        }
    }
     
    void main()
    {
    double *h = malloc(tt *sizeof(double));
     
    remplissage();
    }
    Merci de ton aide rapide stephl

  4. #4
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    tt est un entier, donc pourquoi utiliser une constante double (1140.) au lieu de la constante entière (1140) pour l'initialiser?

    Dans votre parcours du tableau, vous allez un élément trop loin. Le for doit être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=0;i<tt;i++)
     {
     ...
     }
    Enfin dans le main(), il ne faut pas redéfinir h mais juste l'initialiser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(void)
    {
    ...
    h = malloc(tt *sizeof(double));
    remplissage();
    ...
    }
    Il pourrait aussi être judicieux de vérifier le retour de malloc() au cas où l'allocation n'aurait pas fonctionné.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Surikat, dans le code que tu as écris tu sors de la mémoire que tu as allouée ! Quand tu itères dans un tableau de n valeurs, il faut aller de 0 à n-1, donc il faut comme condition : i < n et non pas i <= n...

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    En plus des reponses precedentes:
    • l'utilisation de variables globales doit etre justifiee, donc justifiable. Ce n'est pas le cas ici. Il faut apprendre a passer des arguments aux fonctions.
    • tout segment memoire alloue par malloc() doit etre libere par free().

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Par défaut
    Citation Envoyé par DaZumba
    En plus des reponses precedentes:
    • l'utilisation de variables globales doit etre justifiee, donc justifiable. Ce n'est pas le cas ici. Il faut apprendre a passer des arguments aux fonctions.
    Il vaut mieux des variables locales et passer des arguments dans les fonctions alors ? Pourquoi est-ce mieux ?
    • tout segment memoire alloue par malloc() doit etre libere par free().
    Pour le free(), oui j'avais vu mais je ne l'ai aps mis dans mon exemple mais je ne l'oublierai pas !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Par défaut
    Citation Envoyé par PsychoH13
    Surikat, dans le code que tu as écris tu sors de la mémoire que tu as allouée ! Quand tu itères dans un tableau de n valeurs, il faut aller de 0 à n-1, donc il faut comme condition : i < n et non pas i <= n...
    Ah oui exact, le problème de la case n° 0...

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

Discussions similaires

  1. utilisation malloc free
    Par Débutant_ASM dans le forum Débuter
    Réponses: 5
    Dernier message: 17/03/2010, 10h11
  2. [Malloc - Free] Comment bien les utiliser dans ce cas ?
    Par DOC doc doc dans le forum Débuter
    Réponses: 6
    Dernier message: 06/08/2007, 14h39
  3. Tableau à 2 dimensions avec utilisation de MALLOC
    Par johnalias110 dans le forum C
    Réponses: 3
    Dernier message: 28/02/2007, 18h54
  4. utiliser strcat apres malloc
    Par remi77 dans le forum C
    Réponses: 13
    Dernier message: 26/10/2006, 10h21
  5. utilisation de malloc dans un fichier
    Par nemesys971 dans le forum C
    Réponses: 10
    Dernier message: 09/05/2006, 17h33

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