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 :

Quelques précisions. . .


Sujet :

C

  1. #181
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    hors-sujet :
    Avant de répondre à un topic il est convenable de lire "toutes" les précédentes réponses, donc à moins d'être très motivé seul ceux participant depuis le début continueront à te renseigner, ce qui limite le nombre de réponses/intervenant(je parle de manière générale, dans ce cas ça ne pose aucun problème).

    Mais avant tout tes questions peuvent servir également à d'autres personnes...
    Un titre de poste clair permet de faire une recherche plus efficace pour tous les (futur) membres/visiteurs du forums buttant éventuellement sur le même problème. Et il y a encore bien d'autres avantages à garder une discussion sur son axe d'origine.
    Après je ne connais pas tous les usages du forum.

    C'était une simple suggestion, ne dévions pas plus le sujet sur ce terrain.

  2. #182
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 408
    Par défaut
    Bon, j'en profite quand même pour donner la réponse: Quatre appels à system() ça donne quatre processus cmd.exe différents. Par conséquent, ils ne peuvent pas se "souvenir" de ce que tu as fait aux réglages précédents (comme un echo off).

    Si tu veux utiliser cmd, tu dois créer un fichier batch temporaire et l'exécuter.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #183
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Bonjour,

    Je remercie médinoc pour son explication.

    J'aurais une seule question à poser, concernant malloc()...
    Pourquoi ce code n'écris pas le nombre désiré, soit 82 !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void) {
    	signed char *chrptr;
    	chrptr = malloc((char) 82);
    	printf("%d\n", *chrptr);
    	return 0;
    }
    Quelqu'un pourrait-il me dire quelle erreur ais-je faite, s'il-vous-plaît?


    Merci,

    Sincèrement,

    Array

  4. #184
    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
    	chrptr = malloc((char) 82);
    	printf("%d\n", *chrptr);
    Le malloc alloue 82 bytes et leur adresse est mise dans chrptr. Dans ces 82 bytes, il y a n'importe quoi, (la mémoire n'est pas initialisée à l'allocation). En aucun cas, ceci n'alloue quelque chose avec 82 dedans.

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    De plus, le paramètre de malloc() est un size_t c'est-à-dire, en général, un entier non-signé, donc le cast vers un char n'a aucun sens.

  6. #186
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    De plus, le paramètre de malloc() est un size_t c'est-à-dire, en général, un entier non-signé, donc le cast vers un char n'a aucun sens.
    Cela ne pose de problème particulier dans la mesure où il y aura conversion implicite de char vers size_t. Mais tu as raison, c'est inutile. L'usage de ce cast est surtout dû à la mécompréhension du fonctionnement de malloc() par le PO.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Array Voir le message
    J'aurais une seule question à poser, concernant malloc()...
    Pourquoi ce code n'écris le chiffre désiré, soit 82 !!!

    Quelqu'un pourrait-il me dire quelle erreur ais-je faite, s'il-vous-plaît?
    As-tu la moindre idée du rôle de la fonction malloc() ? Tu as fait n'importe quoi. Le C, ça ne s'improvise pas, ça s'apprend. Relis ton cours.

    Il y a des tutoriels C sur ce site.

  8. #188
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    As-tu la moindre idée du rôle de la fonction malloc() ?
    Nope, lol.
    Eh bien, oui, en fait, je sais que c'est une fonction d'allocation dynamique.
    Cependant, je ne savais en aucun cas comment l'utiliser...
    C'est que les pointeurs ne sont abordés qu'au chapitre 5 de mon livre, et je suis qu' à 4.5 / 4.12.

    Voyez, quelque fois, je m'avance à l'aveuglette...
    Car je suis plutôt impatient de comprendre certains concepts.

    Maintenant, il me semble en effet plus judicieux d'avoir la possibilité d'allouer le nombre de bytes donnés. Après, on n'a qu'à utiliser un pointeur "char" pour donner la valeur de 82 à un des bytes ayant été alloués.

    ----------------

    J'ai vu sur le site d'Emmanuel Delahaye, qu'il y avait également une fonction realloc().

    Y-a-t-il d'autres fonctions d'allocation manuelle comme malloc() et realloc() ?

    Quand utiliser realloc()?

    Merci,

    Sincèrement,

    Array

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Array Voir le message
    Nope, lol.
    Eh bien, oui, en fait, je sais que c'est une fonction d'allocation dynamique.
    Cependant, je ne savais en aucun cas comment l'utiliser...
    C'est que les pointeurs ne sont abordés qu'au chapitre 5 de mon livre, et je suis qu' à 4.5 / 4.12.

    Voyez, quelque fois, je m'avance à l'aveuglette...
    Car je suis plutôt impatient de comprendre certains concepts.
    Ca ne va pas. Tu as un cours, alors tu le suis dans l'ordre. Les concepts liés à l'utilisation de la mémoire dynamique reposent sur des principes assez avancés (souplesse des données, auto-adaptation etc.) Tu verras ça en temps utile, mais ne brule pas les étapes.

  10. #190
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Tu trouveras un excellent didacticiel sur l'utilisation de malloc(), realloc ici: http://rperrot.developpez.com/articles/c/allocationC/.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Non, pas la peine pour lui, c'est écrit dans la suite de son bouquin il est juste impatient...

  12. #192
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Ca ne va pas. Tu as un cours, alors tu le suis dans l'ordre. Les concepts liés à l'utilisation de la mémoire dynamique reposent sur des principes assez avancés (souplesse des données, auto-adaptation etc.) Tu verras ça en temps utile, mais ne brule pas les étapes.
    J'ai décidé de suivre tes "conseils" parce que, de toute façon, lorsque j'essaie d'apprendre par moi-même, je n'apprends que partiellement certaines notions et cela ne me permet pas de maîtriser efficacement les concepts que j'essaie d'aborder. De plus, cela crée des bugs dans mes programmes... Ce qui est déplorable.

    Je me suis donc lancé dans une lecture exhaustive pour aborder finalement le chapitre des pointeurs.


    J'aurais une question sur un programme qui ne me donne pas ce que je souhaite...

    Le voici :

    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
     
    int main(void) {
    	int c;
    	FILE *fptr;
    	fptr = fopen("hello.txt", "w+");
    	fputc('7', fptr);
    	fputc('6', fptr);
    	fputc('5', fptr);
    	fputc('4', fptr);
    	fflush(fptr);
    	while ((c = fgetc(fptr)) != EOF)
    		putchar(c);
    	return 0;
    }
     
    }
    Le programme écrit bien 7654 dans hello.txt, mais la boucle qui est supposée écrire dans stdout le contenu du fichier avec fgetc ne fonctionne pas. Le programme n'écrit rien...
    Pourquoi?


    Merci,

    Sincèrement,

    Array

  13. #193
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Par défaut
    Si tu écris 7654 avec ton stylo, tu es rendu à la fin de 4.
    Pour lire ce que tu as écris il faudra que tu reviennes au début de ta feuille ?
    Et bien c'est pareil avec un fichier. C'est ça le principe d'un accès séquentiel.

    Essayes ça
    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
    #include <stdio.h>
     
    int main(void) {
    	int c;
    	FILE *fptr;
    	fptr = fopen("hello.txt", "w+");
    	fputc('7', fptr);
    	fputc('6', fptr);
    	fputc('5', fptr);
    	fputc('4', fptr);
    	fflush(fptr);
    	rewind(fptr); // revient au début du fichier
    	while ((c = fgetc(fptr)) != EOF)
    		putchar(c);
    	return 0;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Array Voir le message
    Le programme écrit bien 7654 dans hello.txt, mais la boucle qui est supposée écrire dans stdout le contenu du fichier avec fgetc ne fonctionne pas. Le programme n'écrit rien...
    Le explications de Garulfo sont tout à fait pertinentes. Je les complète ainsi :
    • Toute ouverture de fichier peut échouer. Il faut donc tester le pointeur avant de l'utiliser.
    • Tout fichier ouvert doit être refermé.
    • Dans un fichier texte, il est d'usage de terminer les lignes par '\n'

    Ce qui donne :
    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
    21
    22
    23
    24
    25
    26
     
    #include <stdio.h>
     
    int main (void)
    {
       FILE *fptr = fopen ("hello.txt", "w+");
       if (fptr != NULL)
       {
          fputc ('7', fptr);
          fputc ('6', fptr);
          fputc ('5', fptr);
          fputc ('4', fptr);
          fputc ('\n', fptr);
     
          rewind (fptr);
          {
             int c;
             while ((c = fgetc (fptr)) != EOF)
             {
                putchar (c);
             }
          }
          fclose (fptr);
       }
       return 0;
    }
    Nota : le fflush() n'est pas utile, car le rewind() force l'écriture.
    Citation Envoyé par n1124
    7.19.5.3 The fopen function
    Synopsis
    <...>
    6 When a file is opened with update mode ('+' as the second or third character in the
    above list of mode argument values), both input and output may be performed on the
    associated stream. However, output shall not be directly followed by input without an
    intervening call to the fflush function or to a file positioning function (fseek,
    fsetpos, or rewind)
    , and input shall not be directly followed by output without an
    intervening call to a file positioning function, unless the input operation encounters endof-
    file. Opening (or creating) a text file with update mode may instead open (or create) a
    binary stream in some implementations.

  15. #195
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Merci pour vos deux réponses claires, ce problème est résolu, et je comprend maintenant comment faire des opérations sur les fichiers. En fait, je ne savais pas trop le rôle d'une position de fichier, puisque mon livre était vague à ce sujet...

    Si tu écris 7654 avec ton stylo, tu es rendu à la fin de 4.
    Pour lire ce que tu as écris il faudra que tu reviennes au début de ta feuille ?
    Et bien c'est pareil avec un fichier. C'est ça le principe d'un accès séquentiel.
    Je croyais que fgetc(fptr) commençais sa lecture à zéro.
    Grossière erreur...


    -----------

    Bonjour,

    J'aurais une question concernant les pointeurs de pointeurs.

    En fait, je fais un programme pour appliquer ce que j'ai appris jusqu'à date sur les pointeurs...

    Voici le prototype d'une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void func(int tbl[SIZE_Y][SIZE_X]);
    Le problème est que j'aimerais ne pas avoir de taille fixe (enlever le SIZE_X), parce que cette fonction traitera dans le programme trois tableaux à deux dimensions de différentes tailles.

    Le problème est que le compilateur n'accepterait pas ce prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void func(int tbl[][]);
    Comment faire pour que ma fonction puisse agir de manière plus générique?


    Je vous remercie,

    Sincèrement,

    Array

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Array Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void func(int tbl[SIZE_Y][SIZE_X]);
    Le problème est que j'aimerais ne pas avoir de taille fixe (enlever le SIZE_X), parce que cette fonction traitera dans le programme trois tableaux à deux dimensions de différentes tailles.

    Le problème est que le compilateur n'accepterait pas ce prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void func(int tbl[][]);
    Comment faire pour que ma fonction puisse agir de manière plus générique?
    Ce n'est pas possible. Tu dois utiliser les tableaux dynamique st c'est alors une toute autre technique.

    http://emmanuel-delahaye.developpez....ge=Page5#LXXXI

    Mais l'interface devient alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void func(int **tbl, size_t n, size_t m);
    http://emmanuel-delahaye.developpez....page=Page4#LXV

  17. #197
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Ce n'est pas possible. Tu dois utiliser les tableaux dynamique et c'est alors une toute autre technique.
    Eh bien, j'ai réussi. J'avais cependant peur que cela sois plus difficile...
    Merci Emmanuel pour cette solution.


    Mais j'aurais encore deux questions...


    -----------------
    1-. Les tableaux statiques sont-ils structurés de la même manière que lorsqu'on alloue un tableau dynamique et que l'on enregistre des pointeurs à l'intérieur avec malloc()?
    Sûrement, n'est-ce pas?

    Parce que si j'utilise un code comme celui-ci :

    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
     
    #include <stdio.h>
     
    void func(int **tbl, size_t sz1, size_t sz2) {
            [...]
    }
     
    int main(void) {
            int tbl[10][30];
            tbl[0][0] = 'h';
            [...]
            tbl[10][30] = 'o';
            func(tbl, 10, 30);
            return EXIT_SUCCESS;
    }
    Le compilateur affirme que, dans l'instruction "func(tbl, 10,30)", les pointeurs sont incompatibles.
    Pourquoi?
    Est-ce simplement une question de dimension, où une question de structure?


    2-. Dans ce code-ci :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int func(void);
     
    int plp;
    plp = func();
     
    int main(void) {
    	return 0;
    }
     
    int func(void) {
    	printf("Hello, world!\n");
    	return 5;
    }
    Si je le compile avec gcc, je reçois les erreurs suivantes :

    Code gcc_mingw : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cplc.c:7: error: initializer element is not constant
    cplc.c:7: warning: data definition has no type or storage class


    Pourquoi?
    Que me suggérez-vous d'effectuer pour remédier à ce problème?

    -----------------

    Évidemment, je remercie d'avance quiconque me répond,

    Sincèrement,

    Array

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Array Voir le message
    1-. Les tableaux statiques sont-ils structurés de la même manière que lorsqu'on alloue un tableau dynamique et que l'on enregistre des pointeurs à l'intérieur avec malloc()?
    Sûrement, n'est-ce pas?

    Parce que si j'utilise un code comme celui-ci :

    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
     
    #include <stdio.h>
     
    void func(int **tbl, size_t sz1, size_t sz2) {
            [...]
    }
     
    int main(void) {
            int tbl[10][30];
            tbl[0][0] = 'h';
            [...]
            tbl[10][30] = 'o';
            func(tbl, 10, 30);
            return EXIT_SUCCESS;
    }
    Le compilateur affirme que, dans l'instruction "func(tbl, 10,30)", les pointeurs sont incompatibles.
    Pourquoi?
    Est-ce simplement une question de dimension, où une question de structure?
    C'est incompatibles, parce qu'un tableau de T à 2 dimension [N][M] est converti en un pointeur sur tableau de T à 1 dimension,

    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
    21
    22
    23
     
    #include <stdio.h>
     
    void fa (int tbl[10][30], size_t sz1, size_t sz2)
    {
    }
     
    void fb (int tbl[][30], size_t sz1, size_t sz2)
    {
    }
     
    void fc (int (*tbl)[30], size_t sz1, size_t sz2)
    {
    }
     
    int main (void)
    {
       int tbl[10][30] = {{0}};
       fa (tbl, 10, 30);
       fb (tbl, 10, 30);
       fc (tbl, 10, 30);
       return 0;
    }
    et non en pointeur de pointeur de type T. C'est la règle (évidemment, sinon, le compilateur ne pourrait pas calculer l'adresse des éléments).

    2-. Dans ce code-ci :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int func(void);
     
    int plp;
    plp = func();
     
    int main(void) {
    	return 0;
    }
     
    int func(void) {
    	printf("Hello, world!\n");
    	return 5;
    }
    Si je le compile avec gcc, je reçois les erreurs suivantes :

    Code gcc_mingw : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cplc.c:7: error: initializer element is not constant
    cplc.c:7: warning: data definition has no type or storage class
    C'est normal, on ne sait pas appeler une fonction hors d'une fonction.
    Cependant, avec le compilateur Intel, ICC, aucune erreur!
    J'ai du mal à le croire. Essaye en mode 'ansi'. C'est peut être une extension non portable.


    Pourquoi?
    Que me suggérez-vous d'effectuer pour remédier à ce problème?

    -----------------

    Évidemment, je remercie d'avance quiconque me répond,

    Sincèrement,

  19. #199
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Bonjour,

    J'aurais trois questions simplettes.

    1-. S'il n'y avait pas pas de structures en C, serais-ce un handicap, où pourrions-nous facilement nous-en passer?
    Dans quelle situation une structure peut-elle s'avérer indispensable (écartez celle où l'on veut améliorer l'aspect du code).

    2-. Une structure peut-elle contribuer à rendre un programme plus rapide?

    3-. Sur le site d'Emmanuel, il y a ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       size_t i;
       for (i = 0; i < N; i++)
       {
         free(pp[i]), pp[i] = NULL;
       }
       free(pp), pp = NULL;
    Je me demandais simplement pourquoi utilise-t-on une virgule à la place d'un point-virgule? Est-ce pour une raison particulière, ou par souci d'esthétisme?


    Merci pour vos futures réponses!

    Mes respects,

    Array

  20. #200
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Array Voir le message
    Bonjour,

    J'aurais trois questions simplettes.

    1-. S'il n'y avait pas pas de structures en C, serais-ce un handicap, où pourrions-nous facilement nous-en passer?
    Dans quelle situation une structure peut-elle s'avérer indispensable (écartez celle où l'on veut améliorer l'aspect du code).
    En assembleur, il n'y a pas structures, et on arrive à s'en passer. Mais je trouve que ce serait un handicap que de se passer d'une possibilité d'abstraction comme les structures. Les structures sont un outils essentiel notamment pour programmer des types abstraits de données (TAD).

    Citation Envoyé par Array Voir le message
    2-. Une structure peut-elle contribuer à rendre un programme plus rapide?
    Je ne crois pas qu'il y a un réel gain de performance à utiliser des structures (peut-être que d'avoir du code plus localisé permet des accès plus rapides, mais c'est sans doute des cacahuètes)
    Citation Envoyé par Array Voir le message
    3-. Sur le site d'Emmanuel, il y a ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       size_t i;
       for (i = 0; i < N; i++)
       {
         free(pp[i]), pp[i] = NULL;
       }
       free(pp), pp = NULL;
    Je me demandais simplement pourquoi utilise-t-on une virgule à la place d'un point-virgule? Est-ce pour une raison particulière, ou par souci d'esthétisme?
    Cela permet de mettre en évidence le fait que les opérations de libération de la mémoire et l'affectation de NULL à pp[i] sont liées (ces opérations vont de paire. Il est en effet conseillé d'affecter la valeur NULL à tout pointeur dont l'adresse est devenue invalide).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/12/2007, 19h44
  2. Entrées.. Sorties.. quelques précisions..
    Par Djef-69 dans le forum SL & STL
    Réponses: 2
    Dernier message: 28/11/2007, 23h16
  3. [Fabrique] Quelques Précisions
    Par djflex68 dans le forum Design Patterns
    Réponses: 8
    Dernier message: 20/12/2006, 13h34
  4. Quelques "précisions" sur Struts
    Par Atma_ dans le forum Struts 1
    Réponses: 19
    Dernier message: 03/11/2006, 15h20

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