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 :

Declaration de tableau apres une instruction etc...


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut Declaration de tableau apres une instruction etc...
    Peut-on faire ce genre de chose en C?

    J ai un prog qui marche avec l exemple1, mais peut etre que ce n est pas correct au niveau de la gestion de la mémoire vu que la taille et la declaration se font apres l instruction "int n = taille("matrice.txt");"
    pour l'exemple2 j ai un petit doute par rapport au fait que la taille est fonction d un argument...

    Si c est correct cela permet de s'affranchir de devoir faire des listes chainees meme si ca a ses avantages ...

    exemple1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int n = taille("matrice.txt");
    adj tab_adj[n];
    /* etc */
    exemple2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void fonction(int n)
    {
        adj tab_adj[n];
        /* etc */
    }
    Merci d'avance pour vos réponses !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    L'exemple 1 ne devrait pas poser de problème. Par contre, dans ton exemple 2, la tableau que tu créé ne sera que local à la fonction void fonction(int n) mais sinon c'est faisable, mais dans ce cas tu ne pourra pas utiliser le tableau en-dehors de ta fonction !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    pourquoi dit-on que les declarations doivent se faire au début des fonctions alors? (main ou pas ...)

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,
    ce que tu souhaite faire est déclarer un tableau dont la taille n'est pas connue à la compilation. Cela n'est pas possible en C90 (norme ANSI) mais le C99 (norme ISO) propose un mécanisme appelé VLA (pour Variable-Length Arrays ou tableau de taille variable) qui permet de faire ça.

    Sachant que la norme C99 n'est pas au point sur tout les compilateur (en particulier sur gcc : Status of C99 features in GCC) je te déconseille cette usage surtout que l'utilisation de l'allocation dynamique permet de faire la même chose (fonctions : malloc/calloc/realloc/free)

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par CSoldier
    L'exemple 1 ne devrait pas poser de problème. Par contre, dans ton exemple 2, la tableau que tu créé ne sera que local à la fonction void fonction(int n) mais sinon c'est faisable, mais dans ce cas tu ne pourra pas utiliser le tableau en-dehors de ta fonction !
    Mouais enfin pour le deuxieme exemple quand on compile avec -Wall -ansi -pedantic on a un warning

    Sinon ben tableau dynamique c'est le mieux je pense avec la taille passée en parametres

    Citation Envoyé par Sakijep
    pourquoi dit-on que les declarations doivent se faire au début des fonctions alors? (main ou pas ...)
    PArce que c'est la norme en C90 on decalre toujours en debut de bloc ( { } )
    En C99 par contre tu peux declarer ou bon te semble

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    Citation Envoyé par Skyrunner
    Mouais enfin pour le deuxieme exemple quand on compile avec -Wall -ansi -pedantic on a un warning
    est-ce que ce warning a une signification spéciale? est ce que c est mauvais ou pas?

    ps: je veux pas de proposition pour faire autrement, je veux juste savoir si on peut faire comme ca

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    Citation Envoyé par gege2061
    Bonjour,
    ce que tu souhaite faire est déclarer un tableau dont la taille n'est pas connue à la compilation. Cela n'est pas possible en C90 (norme ANSI) mais le C99 (norme ISO) propose un mécanisme appelé VLA (pour Variable-Length Arrays ou tableau de taille variable) qui permet de faire ça.

    Sachant que la norme C99 n'est pas au point sur tout les compilateur (en particulier sur gcc : Status of C99 features in GCC) je te déconseille cette usage surtout que l'utilisation de l'allocation dynamique permet de faire la même chose (fonctions : malloc/calloc/realloc/free)
    Bonjour et merci pour ta réponse,

    Dois-je donc en conclure que tout bon programmeur C, professionnels inclus, n'utilise pas cette faculté de pouvoir declarer des tableaux de taille non connue lors de la compilation VLA (variable length array) ?

    C'est dommage quand meme que C99 ne soit pas implementé sur tout les compilateurs, d'ailleurs comment ça se fait?

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Moi je fait que par allocation dynamique si je ne connais pas par avance la taille d'un tableau !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    Citation Envoyé par Skyrunner
    Citation Envoyé par Sakijep
    pourquoi dit-on que les declarations doivent se faire au début des fonctions alors? (main ou pas ...)
    PArce que c'est la norme en C90 on decalre toujours en debut de bloc ( { } )
    En C99 par contre tu peux declarer ou bon te semble
    De même, vu qu'il a été dit que C99 n'était pas au point sur tous les compilateurs, ça veut dire qu'il faudrait que je déclare mes variables en début de blocs malgré tout?

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Pour une question de portabilité, oui c'est préférable ! Est même, c'est une pratique qui est bien plus pratique, ca te permet d'avoir du 1° coup d'oeil toutes les variables locales à une fonction, c'est plus simple que de les dispatcher !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    HRS
    HRS est déconnecté
    Membre chevronné
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    678
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 678
    Par défaut
    Ces warning signifient que si vous deviez compiler votre code sur
    une autre machine, dotée d'un compilateur strict C89/90, il tomberait
    en erreur.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    merci beaucoup, c est le genre de choses importantes a savoir et maintenant je le sais :>

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Declaration de tableau apres une instruction etc...
    Citation Envoyé par Sakijep
    Peut-on faire ce genre de chose en C?
    Ce dont tu parles s'appelle un VLA (Variable Length Array). C'est une nouveauté de C99, et à ma connaissance, il n'existe pas d'implémentation gratuite et portable (gcc etc.) implémentant correctement cette fonction.

    Son usage est donc peu recommandé pour le moment... de plus, en cas d'erreur d'allocation, on est pas prévenu et c'est le comportement indéfini... (Sans parler des problèmes de portée déjà évoqués...)

    malloc() / free() est beaucoup plus sûr.

  14. #14
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    De toute façon, celà rend les programmes plus clairs :

    [bloc]
    Déclarations
    Instructions
    [/bloc]

    Celà facilite la relecture : toutes les variables sont au début, et on ne risque pas de trouver des déclarations en plein milieu de bloc (à tiens elle sert à quoi cette variable ???) Surtout si le nom de la variable n'est pas explicite, c'est une horreur. Utilise donc l'allocation dynamique.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/11/2010, 11h34
  2. Renvoyer un tableau après une requête AJAX
    Par franquis dans le forum jQuery
    Réponses: 6
    Dernier message: 06/08/2010, 13h05
  3. Réponses: 2
    Dernier message: 31/01/2008, 13h59
  4. Reprendre le code après une instruction stop
    Par sash6 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 15/11/2007, 16h07
  5. Réponses: 4
    Dernier message: 09/03/2006, 09h50

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