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

Linux Discussion :

affichage des strings en gcc


Sujet :

Linux

  1. #1
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut affichage des strings en gcc
    Bonjour

    Je commence la programmation sous linux (mais déjà expert sous windows ).. mais le probleme c'est que mes codes sources écrites en dev-c++ ne sont pas compliés par la commande gcc. (le compilateur semble détecter des erreurs que je ne rencontrais pas sous windows.

    Et l'une des principales erreurs c'est l'affichage des variables de type char.
    soit deux exemples.
    -1- printf("votre nom est %s", nom);
    -2- printf("vous avez entré la lettre %c", lettre);

    Ainsi, meme quand j'arrive à obtenir le fichier executable a.out (et encore !!!)
    en le lançant: S'il s'agit du premier exemple, la variable est lu, mais pour l'affichage, il m'envoie une sympatique message d'erreur.

    Et dans le deuxieme cas, le programme se termine sans meme qu'on m'invite à entrez mon caractère.


    Merci

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Un code entier avecla commande de compilation serait souhaitable.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    ok, je vais mettre une version simplifiée.

    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 main() {
     
    char nom;
    int age;
     
    printf("votre age\n");
    scanf("%d\n", &age);
     
    printf("votre nom\n");
    scanf("%s\n", &nom);
     
    printf("votre nom est %s et vous avez %d ans", nom, age);
     
    }
    voila, par exemple pour ce code j'obtiens facilement l'executable a.out,
    mais comme resultat j'obtiens ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    votre nom est et vous avez 6 ans

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    On utilise les balises [ CODE ] pour présenter un code (bouton # dans l'interface), pas les balises citations...

    Sinon :
    Et ensuite tu utilises nom comme une chaîne de caractère ? Et tu t'étonnes que ça ne marche pas ? Si ce code marche sous Windows, je mange mon chapeau.

    --
    Jedaï

  5. #5
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    quel boolet!!

    D'accord pour ce coup-ci, mais n'empêche que pas mal de code restent inexploitable en linux. (Si la fil ne se ferme j'essairez d'en poster quelques exemples.

  6. #6
    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 : 48
    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
    Citation Envoyé par Linu6 Voir le message
    D'accord pour ce coup-ci, mais n'empêche que pas mal de code restent inexploitable en linux. (Si la fil ne se ferme j'essairez d'en poster quelques exemples.
    Si tu respectes au moins les normes ANSI/ISO et POSIX.1 il n'y a pas de raisons, c'est très portable donc exploitable sur tous systèmes prennant en charge ces normes !
    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 !

  7. #7
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    voila, par exemple ce code fonctionne sans erreur sur windows (dev c++)

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main(){
     
     
       int  dday;
       char jds;
     
     
       struct prog{
             int x;
             int y;
             int z;};
              struct prog prog1;
     
       printf("entrez le jour: ");
       scanf("%d", &prog1.x);
       printf("entrez le mois: ");
       scanf("%d", &prog1.y); 
       printf("entrez le l'annee: ");
       scanf("%d", &prog1.z); 
     
       if(prog1.y>=3)
       prog1.y = prog1.y-2;
       else  {prog1.y=prog1.y+10;
             prog1.z=prog1.z-1;                
             }
     
       dday=calcul( prog1.x, prog1.y, prog1.z);
     
     
     
     enum day{ dim, lun, mar, mer, jeu, vend, sam} days;
     
       if (dday<0)
                  dday=dday+7;
     
      switch (dday){
            case  dim : printf("Dimanche");
                   break;
             case lun : printf("Lundi");
                   break;     
             case mar : printf("Mardi");
                   break;        
             case mer : printf("Mercredi");
                   break;
             case jeu : printf("Jeudi");
                   break; 
             case vend : printf("venderdi");
                   break; 
             case sam : printf("samedi");
                 break;             
                   }
     
     
                printf("\n");
     
     
     
     
           int calcul (int j1, int m1, int a1){
               int nb;
               int s=a1/100;
               int an=a1%100;
               nb=(((13*m1-1)/5)+(an/4)+(s/4)+an+j1-(2*s));
               nb=nb%7;
                return nb;    
     
          }
     
     
      system("PAUSE");	
      return 0;
    }
    mais sur linux, j'obtiens pas l'executable gcc

    erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ gcc code.c
    code.c: In function `main':
    code.c:63: warning: `calcul' was declared implicitly `extern' and later `static'
    code.c:31: warning: previous declaration of `calcul'
    code.c:63: warning: static declaration for `calcul' follows non-static

  8. #8
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Peut-être est-ce sumplement la version qui n'est pas la même. L'une respecte mieux la norme que l'autre.
    Précision : Dev-C++ utilise une "version windows" si l'on peut dire de gcc, cependant le retard dans les versions doit être conséquent.

    Dev-C++ n'était pas assez strict, si tu préfères.

  9. #9
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    Je sens que je vais réapprendre le C sous linux depuis le début

  10. #10
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Linu6 Voir le message
    voila, par exemple ce code fonctionne sans erreur sur windows (dev c++)

    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main(){
           // ...
           dday=calcul( prog1.x, prog1.y, prog1.z);
           // ...
           int calcul (int j1, int m1, int a1){
               int nb;
               int s=a1/100;
               int an=a1%100;
               nb=(((13*m1-1)/5)+(an/4)+(s/4)+an+j1-(2*s));
               nb=nb%7;
                return nb;    
     
          }      
      system("PAUSE");	
      return 0;
    }
    Je ne me rappelle plus trop mais a priori déclarer une fonction à l'intérieur d'une autre n'est possible que dans les standards récents (C99 ?) et par ailleurs tu utilises cette fonction avant que de la déclarer... Pas sûr que ça soit bien raisonnable. Il y a d'autres points qui me surprennent un peu dans ton programme mais ça doit être parce que je n'ai plus fait de C (sérieusement) depuis un certain temps et par ailleurs le problème que je t'ai cité semble être ce qui froisse gcc donc...

    (Et le system("PAUSE"); ne marchera pas sous Linux évidemment.)

    --
    Jedaï

  11. #11
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Je ne me rappelle plus trop mais a priori déclarer une fonction à l'intérieur d'une autre n'est possible que dans les standards récents (C99 ?) et par ailleurs tu utilises cette fonction avant que de la déclarer... Pas sûr que ça soit bien raisonnable.
    En effet, c'est un standard récent.
    De plus, l'utilisation précédant la déclaration, c'est propre au C.
    Cf le sujet "C et C++ mythe et réalité", dont un lien a été donné sur http://c.developpez.com/. Jean-Marc donne des renseignements sur le sujet.

  12. #12
    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 : 48
    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
    Je ne connais pas C99 donc je dirais simplement qu'on ne déclare pas de prototype d'une fonction à l'intérieur d'une autre, ne serait-ce que par soucis de compatibilité entre les versions de GCC !

    Par ailleurs, GCC ne compile pas en C99 par défaut, il faut lui spécifier que tu veux compiler dans cette version, je me souviens plus comment on le fait, faut voir dans la page man du compilateur !
    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 !

  13. #13
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Alp Voir le message
    De plus, l'utilisation précédant la déclaration, c'est propre au C.
    Pour être propre il faut déclarer une fonction avant de l'utiliser, même si on ne la définit que plus tard/ailleurs.

    --
    Jedaï

  14. #14
    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 : 48
    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
    Citation Envoyé par Jedai Voir le message
    Pour être propre il faut déclarer une fonction avant de l'utiliser, même si on ne la définit que plus tard/ailleurs.

    --
    Jedaï
    +1
    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 !

  15. #15
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Pour être propre il faut déclarer une fonction avant de l'utiliser, même si on ne la définit que plus tard/ailleurs.

    --
    Jedaï
    C'est propre au C, mais ce n'est pas propre tout court, soyons clair.

  16. #16
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    Je sais moi meme j'ai l'habitude de déclarer les prototypes avant main() et les définir après main()!

    Je dois dire que là encore j'ai choisi un mauvais code pour l'exemple.
    En attendant la fermeture du file, je vais voir quel autre cas de figure fonctionne en win$ et pas en linux.


  17. #17
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Je pense qu'il serait nécessaire que tu regardes les options de compilation de dev-c++ !

    En effet, voici ce que donne le code que tu as posté lors d'une compilation sans option avec gcc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    > gcc test_developpez.c
    test_developpez.c: In function `main':
    test_developpez.c:63: warning: `calcul' was declared implicitly `extern' and later `static'
    test_developpez.c:31: warning: previous declaration of `calcul'
    test_developpez.c:63: warning: static declaration for `calcul' follows non-static
    Voici ce que ca donne avec quelques options :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    gcc -ansi -Wall -O2 -pedantic test_developpez.c
    test_developpez.c: In function `main':
    test_developpez.c:31: warning: implicit declaration of function `calcul'
    test_developpez.c:35: warning: ISO C89 forbids mixed declarations and code
    test_developpez.c:63: warning: ISO C forbids nested functions
    test_developpez.c:63: warning: `calcul' was declared implicitly `extern' and later `static'
    test_developpez.c:31: warning: previous declaration of `calcul'
    test_developpez.c:63: warning: static declaration for `calcul' follows non-static
    test_developpez.c:71: warning: ISO C89 forbids mixed declarations and code
    test_developpez.c:9: warning: unused variable `jds'
    test_developpez.c:35: warning: unused variable `days'
    je pense que si tu corriges ton code pour qu'il n'y ait pas de warning, tu devrais déjà avoir moins de problèmes !
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  18. #18
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    e pense qu'il serait nécessaire que tu regardes les options de compilation de dev-c++ !
    De quelles options parles-tu? (..disponibles dans quel environnement?)

  19. #19
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Linu6 Voir le message
    De quelles options parles-tu? (..disponibles dans quel environnement?)
    Tous les compilateurs que je connais proposent un certain nombre d'options de compilation, qui permettent d'avoir plus ou moins de warning en fonction de ce que tu fais.
    Il en est très probablement de même pour dev-c++, il faut fouiller dans les menus pour rendre le compilateur moins permissif sur les erreurs du code.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Par défaut Programmation en général ...
    Et programmation et en C en particulier.

    Regle de base definie par moi meme :
    Ne jamais utiliser de methodes nouvelles si elle n'apporte rien de significatif
    Donc si une version de compilateur permet des déclaration n'importe ou ( ce qui ne corresponds pas au C d'origine ) ne l'utilisez pas.
    a) Cela nuit a la lisibilité du code
    b) La portabilité est limitée

    Le C ne permet que des declaration a un seul niveau au contraire du Pascal qui permet d'integrer tout un programme a l'interieur d'une fonction definissant ainsi des bloc esthetiques.
    De meme lors de la compilation si des prototypes de fonction peuvent etre definit en amont du programme c'etait pour pouvoir compiler une fonction A appelant une fonction B qui elle meme appelle A. Mais formellement , de respecter un certain ordre ds le code ( meme si avec la masse de code inclu par les compilateurs l'ordre n'est pas respecté).
    A titre d'exemple ... Il ne viendrait a personne l'idee de faire des includes apres le main() {... }
    Include...

    GCC est le compilateur natif Linux, quand tu parles de dev cpp c'est davantage il englobe aussi les notions evenementielle ( la partie discution avec l'interface graphique de Windows )
    Note que DEV CPP est un tres bon outil mais si permet de faire de choses pas terribles ... on est pas obligé de les utiliser.
    Note que Dev CPP m'a permi de virer Borland C que j'utilisais de facon illegale

    Son equivalent sous Linux est le couple QT-KDEVELOP ( et d'autres ... GTK je crois).
    QT c'est le C++ avec des myriades d'objets , il est enorme et pas facile à aborder.
    Je compile des prog desormais sous QT-KDE
    Mais je me sers principalement de QT pour me fournir de jolies fenetres de jolis boutons... A travers QTdesigner ... J'integre le minimum de code dans le designer.

    Dans les programmes eux meme , je n'utilise a 99 % que du C standard
    Les includes je les mets tout en haut .
    Je definis des variable globales (le moins possible).
    En essayant de mettre les fonctions generales en debut de code, celles reutilisables dans d'autre programme.
    Ensuite les fonction, generales liees au programme.
    Ensuite par bloc, les fonctions de chaque fenetre
    Enfin main precede de certaines fonctions ...

    Dernier truc , 1 ligne = 1 instruction ...
    Les programmes de type if (a=f(g(x++)==&t(z(u-1))
    C'est le nid a embrouille assuré... Ca n'amuse que le type qui ecrit ..
    Et ca se saurait si l'interpretation de 10 instruction successives au lieu d'une contenant 8 instruction penalisait la performance d'un programme sur une machine pouvant calculer des dizaines de multiplication reelles par seconde
    Je disais ca pour la déclaration de structure ...
    Declare sa forme, puis declare les variables corresondant c'est qd meme formellement plus cool.

    Y'a 12 ans ,J'ai fait un programme de 80 000 ligne en C sous windows.
    ... Peut etre qu'on pourrait y trouver encore 2 bugs.
    Si il y avait peu de bugs ...
    C'est parce que je respecte les principes cites plus haut


    Voici mon site ... Tu pourras y trouver qq exemples
    http://the-gaillard.site.voila.fr/

    Bonne chance

Discussions similaires

  1. Lecture/affichage d'un fichier contenant des string
    Par Khaoula.85 dans le forum Visual C++
    Réponses: 4
    Dernier message: 02/12/2009, 11h13
  2. affichage d'un entier concatiner à des string en qt-
    Par jeanjack dans le forum Débuter
    Réponses: 1
    Dernier message: 28/04/2009, 22h12
  3. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  4. Forcer l'affichage des dizaines...
    Par pataluc dans le forum Langage
    Réponses: 4
    Dernier message: 26/11/2002, 19h38
  5. [VB6] [Flexgrid] Format d'affichage des numériques
    Par yansolo dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/10/2002, 21h00

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