Forum Programmation.c gros débutant, problême pour compiler (gcc)

Posté par  .
Étiquettes : aucune
0
13
jan.
2006
bonjour tout le monde,
je débute tout juste en programmation et je n'arrive pas à compiler mon premier programme, (afficher "Bonjour" à l'écran, je pense que vous devez connaître :-) ).
le code source du programme en question ( au cas ou je me suis trompé quelque part):

#include <stdio.h>

void main ()
{
puts ("bonjour");
getchar ();
return;
}

ensuite je tente de compiler avec gcc:

gcc -c /home/tonks/tryC/programme1.c

et ça me donne ceci:

:~$ gcc -c /home/tonks/tryC/programme1.c
/home/tonks/tryC/programme1.c: Dans la fonction « main »:
/home/tonks/tryC/programme1.c:4: attention : le type de retour de « main » n'est pas « int »
/home/tonks/tryC/programme1.c:8:2: attention : pas de retour chariot à la fin du fichier

Voila. Si j'ai bien compris le tutorial que j'utilise, je devrais normalement obtenir un fichier objet, mais ce n'est pas le cas.
Pourriez vous m'expliquer ce que tout cela veut dire, j'avoue que je suis "déja" largué, je n'arrive pas à savoir ou se trouve mon erreur.
Je vous remercie d'avance, j'espere que je ne raconte pas de bêtises et désolé si la question s'avère être stupide, je débute.
  • # 2 trucs :)

    Posté par  (site web personnel, Mastodon) . Évalué à 5.

    1. remplace le "void main" par un "int main"
    2. ajoute une ligne vide à la fin de ton fichier

    Et hop, ca compile et ca tourne !
    :)
    • [^] # Re: 2 trucs :)

      Posté par  . Évalué à 5.

      et remplace alors ton
      return;

      par

      return 0;

      ce qui voudra dire que ton programme s'est bien terminé.
    • [^] # Re: 2 trucs :)

      Posté par  . Évalué à 8.

      en fait,même sans ça, ça compile. Quand la ligne commence par attention, c'est un avertissement, à prendre au sérieux en général (c'est avec ce genre de choses négligées qu'on doit passer du temps à débugger) (ici ce n'est pas grave, tu ne risque rien)

      pour lancer ton fichier, qui a été compilé, il devrait se nommer programme1.o et se trouver dans le répertoire courant. Pour le lancer, il faut encore faire l'édition des liens, c'est a dire lier tous les fichier objets (facile, ici il n'y en a qu'un) ensembles pour créer un exécutable :
      gcc programme1.o

      cela crée un fichier a.out exécutable dans le répertoire courant, que tu peux lancer par
      ./a.out

      Pour avoir un nom plus sympathique, tu peux essayer
      gcc programme1.o -o programme1
      qui te créera l'exécutable avec comme nom de fichier programme1 (./programme1 pour le lancer)
      • [^] # Re: 2 trucs :)

        Posté par  . Évalué à 0.

        en fait,même sans ça, ça compile
        Mouais, "ça compile" n'est pas une preuve que le programme soit correct.
        main DOIT retourner un int. Point. C'est la norme qui le définit très clairement. Un programme C contenant un main ne retournant pas un entier est incorrect. (je crois qu'en C++ c'est possible, mais en tout cas pas en C).

        Ce qui peut changer, ce sont les paramètres de main: soit
        int main(void)
        si tu t'en fous des arguments, soit
        int main(int argc, char *argv[])
        si tu en as besoin, soit
        int main ( /* autre chose */ )
        si tu as envie d'utiliser des extensions fournies par ta plate-forme, mais non portables ("portable" au sens du C).
        Les deux premières sont définies dans la norme, et fonctionneront sur toute implémentation du C (enfin, mis à part les cas des freestanding environments, mais on va passer pour l'instant); la troisième est implementation-defined et donc dépend de l'environnement. Par exemple, le
        int main(int argc, char *argv[] char *env[])
        est une extension commune, qui compilera et fonctionnera sur certaines implémentations, mais n'est pas portable.

        Cela dit, un compilateur C a le droit de rejeter un programme définissant main comme retournant void.

        Et, en passant, pour compiler un programme C avec GCC, une ligne de commande pour avoir les bons avertissements est
        gcc -Wall [ -Wextra | -W ] [ -std=c99 [ -pedantic ]]
        -Wextra est défini depuis la 4.0 je crois, avant c'était -W; et -std=c99 est utile (et même recommandé) pour s'assurer que ton code est correct au sens de la norme C99. Note que ce flag désactive certaines extensions (POSIX, GNU ou autres) qui entrent en conflit avec la norme, donc tu ne pourras pas forcément l'utiliser, suivant ce que tu veux faire. Le -pedantic retournant des avertissements supplémentaires de la norme, et rejete toute extension.
  • # et pourtant...

    Posté par  . Évalué à 4.

    ton programme compile. Certes avec quelques "warnings" mais il compile.

    Je fais ça :
    $ gcc programme1.c
    j'obtiens un a.out. Et avec les bonnes permissions (chmod u+x a.out) il peut être lancé :

    $ ./a.out
    bonjour

    Pour sortir du programme control+c

    Dans ton cas, tu utilises l'option -c (qui provoque une compilation partielle, et te donne un fichier objet en .o).

    Alors vérifie avec un petit ls que tu n'as pas de nouveaux fichiers après compilation.
    • [^] # Re: et pourtant...

      Posté par  (site web personnel) . Évalué à 5.

      Pour sortir du programme control+c


      Je peux me tromper, mais vu le code, un simple appui sur une touche ne suffit-il pas à sortir ? (cf. l'appel à getchar)
      • [^] # Re: et pourtant...

        Posté par  . Évalué à 1.

        En effet, ou presque.
        N'importe quelle touche affiche la touche et "entr" redonne le prompt.
        J'ai fait et dit "control+c" par habitude.
  • # J'y arrive.

    Posté par  . Évalué à 1.

    Bonsoir,
    merci beaucoup pour votre coup de main, j'ai apporté les modifications que vous m'aviez conseillées et ça marche. Encore merci.
    A+

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.