Débuter en C

Débuter en C - C - Programmation

Marsh Posté le 06-08-2006 à 20:04:33    

Salut à tous ! j'avais, il y a quelques mois réalisé un topic similaire à celui-ci mais visiblement il à du être effacé :(.
 
Enfin me voila de nouveau.  
 
Je déja quelques petites questions : J'ai ici un bouquin très intéressant du fait de son aspect pédagogique très pointu. Je m'y retrouve bien et même si c'est long et ben ça vient. Il me donne un programme qui permet d'imprimer des listings seulement pour le coups c'est un peu vague, j'aimerais en savoir un peu plus. L'idée, je pense, est de faire travailler le maniement et la mise en page de l'ensemble, de prendre l'habitude à se tourner l'esprit et ainsi chercher à quoi servirait le programme.
 
le voici :  
 
/* PRINT_IT.C--Ce ^programme imprime les listings avec les numéros de lignes*/
#include <stdlib.h>
#include <stdio.h>
 
void do_heading(char *filename);
 
int line, page;
 
main( int argv, char *argc[] )
{
      char buffer[256];
      FILE *fp;
       
      if( argv < 2 )
      {
          fprintf(stderr, "\nLa syntaxe correcte est : " );
          fprintf(stderr, "\n\nPRINT_IT nomfichier.est\n" );
          exit(1);
          }
       
      if (( fp = fopen( argc[1], "r" )) == NULL )
      {
            fprintf( stderr, "Erreur d'ouverture du fichier, %s!", argc[1]);
            exit(1);
            }
       
      page = 0;
      line = 1;
      do_heading( argc[1] );
      while( fgets(buffer, 256, fp ) != NULL )
      {
             if( line % 55 == 0 )
             do_heading( argc[1] );
       
             fprintf( stdprn, "%4d:\t%s", line++, buffer );
             }
       
      fprintf( stdprn, "\f" );
      fclose(fp);
      return 0;
}
 
void do_heading( char *filename )
{
     page++;
     
     if (page > 1)
     fprintf( stdprn, "\f" );
     
     fprintf( stdprn, "page: %d, %s\n\n", page, filename );
}
 
 
Alors, il ne reconnait pas "stdprn" ainsi que "do_heading"  Pourrais-je avoir un coup de main ? A quoi servent ces deux fonctions ?  
J'utilise Dev C++ qui semble assez simple d'après ce qu'on m'avait déja dit sur ce forum et j'admet qu'une fois les premier bidouillages fait, on s'y adapte assez vite.  
 
Merci d'avance
 
Stéphaninho

Message cité 1 fois
Message édité par stephaninho le 06-08-2006 à 20:07:11
Reply

Marsh Posté le 06-08-2006 à 20:04:33   

Reply

Marsh Posté le 06-08-2006 à 20:20:03    

Si ce programme provient de ton livre, alors jette ton livre. :sweat:
Des variables globales, des flux non standards, inversion des conventions argv/argc (bon ce n'est qu'une convention, mais quand même)... c'est pas génial. :/
 
Pour répondre à tes questions néanmoins : do_heading() devrait être correctement reconnu par le compilateur, je ne vois pas de problème.
Par contre pour stdprn c'est normal, c'est visiblement le nom d'un flux, mais je ne sais pas d'où ça sort. Et malgré le nom, ce n'est certainement pas standard.

Reply

Marsh Posté le 06-08-2006 à 21:10:06    

Elmoricq a écrit :

Si ce programme provient de ton livre, alors jette ton livre. :sweat:


stephaninho > Tu nous donne le titre du bouquin et le nom de l'auteur stp ?

Reply

Marsh Posté le 06-08-2006 à 21:27:36    

Il est pourtant bien. le titre est "le language C" par peter aitken & bradley L. Jones
 
Effectivement, "stdprn" n'est pas reconnu par la norme ANSI. Cependant mon compilateur reconnait "stdout" je ne comprend pas pouquoi.. à quoi correspondent ces fonction ? ce sont bien des fonctions ?
 
il fait quoi exactement ?
 
merci d'avance !


Message édité par stephaninho le 06-08-2006 à 21:27:55
Reply

Marsh Posté le 06-08-2006 à 21:30:21    

stdout n'est pas une fonction, mais un flux. C'est en réalité une variable de type FILE*, définie par stdio.h
Le flux stdout est le flux de sortie standard. C'est là que s'écrivent les informations usuelles.
Sa contrepartie, stderr, est le flux d'erreur standard. C'est là que l'on écrit les erreurs.
Il en existe un troisième, toujours défini par la norme : stdin. C'est le flux d'entrée standard, habituellement le clavier, ou un fichier redirigé, etc.
 
Ces trois flux, stdin, stdout et stderr, sont définis par la norme.

Reply

Marsh Posté le 06-08-2006 à 22:32:07    

je comprend mieux, cela dit je ne vois pas dans quel cas on utilise ces trois variable..  :??:

Reply

Marsh Posté le 06-08-2006 à 22:37:40    

Eh bien, par exemple, si tu souhaites afficher quelque chose, tu utilises tout naturellement :

printf("blahblah\n" );


 
La fonction printf() imprime en fait ce message sur stdout.
C'est équivalent à :

fprintf(stdout, "blahblah\n" );


 
Pareil pour stderr.
 
 
Quant à stdin, tu utilises une fonction de lecture, fgets() par exemple.

Reply

Marsh Posté le 06-08-2006 à 22:57:44    

http://a526.g.akamai.net/7/526/14067/v1/img.priceminister.com/photo/1196430_M.jpg
 
 

Reply

Marsh Posté le 06-08-2006 à 23:01:56    

C'est gentil dadifat, mais on peut gérer sans toi pour l'instant. Si ça se corse on te fera signe...

Reply

Marsh Posté le 06-08-2006 à 23:42:23    

stephaninho a écrit :

main( int argv, char *argc[] )



J'ai cru un instant que stephaninho avait fait une erreur en recopiant le programme sur ce forum. Mais quand je vois la suite

stephaninho a écrit :

if (( fp = fopen( argc[1], "r" )) == NULL )



Là je prends peur car je vois que ce n'est pas une erreur. Comment un auteur (sérieux ?) d'un bouquin de C peut écrire des trucs pareils ???


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 06-08-2006 à 23:42:23   

Reply

Marsh Posté le 06-08-2006 à 23:50:42    

Ben, en fait, il suffit de se renseigner sur l'auteur pour comprendre le niveau...
 
http://www.pgacon.com/default.htm
 
Il doit pas être trop mauvais, il touche à pas mal de langages : VB, Javascript et puis occasionnellement du C.
En tout cas, il n'a pas l'air d'avoir la même expertise qu'un Kernighan dans le langage C...
 
Bah, j'imagine qu'il doit avoir une famille à nourrir...  :whistle:


Message édité par pains-aux-raisins le 06-08-2006 à 23:53:46
Reply

Marsh Posté le 07-08-2006 à 09:43:49    

A propos de livres et d'auteurs, je trouve également douteux que ce livre porte le même titre que celui de Kernighan&Ritchie, qui lui est une référence.
 
D'ailleurs stephaninho, je te le conseille, c'est à la fois un livre pour apprendre, avec des exercices, et un dictionnaire à avoir sous le coude pour plus tard. J'ai de l'expérience en langage C, et je continue à l'utiliser. :)

Reply

Marsh Posté le 07-08-2006 à 10:28:23    

pluzun pour le k&r

Reply

Marsh Posté le 07-08-2006 à 10:31:16    

Si je me souviens stdprn était défini en Turbo C, dans les années 85/90....

Reply

Marsh Posté le 07-08-2006 à 15:04:01    

pains-aux-raisins a écrit :

C'est gentil dadifat, mais on peut gérer sans toi pour l'instant. Si ça se corse on te fera signe...


[:rofl]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-08-2006 à 15:06:31    


 
 :whistle:  
 
 
 

Reply

Marsh Posté le 08-08-2006 à 11:40:22    

Pourtant les explications sont claires :$ ils precisent bien que cette phase je n'ai pas a comprendre reellement chaque element du programme, juste que je dois le taper voir ce qu'il fait et le modifier pour voir les resulstats.
 
Je vais surement en acheter un autre à l'occasion.  
 
merci de tout vos conseils en tout cas ! :) je garde precieusement vos conseils !  
 
quelqu'un pourrait me dire a quoi sert ce prog ? j'arrive pas à le faire fonctionner :$ J'ai dev C++ et je les lance avec l'invite de commande MS-dos car sous dev c++ il ne reste pas affiché, le fenetre se ferme immédiatement après avoir executé le programme.
 
merci :)

Reply

Marsh Posté le 08-08-2006 à 11:45:52    

stephaninho a écrit :

quelqu'un pourrait me dire a quoi sert ce prog ? j'arrive pas à le faire fonctionner :$ J'ai dev C++ et je les lance avec l'invite de commande MS-dos car sous dev c++ il ne reste pas affiché, le fenetre se ferme immédiatement après avoir executé le programme.


 
 

/* PRINT_IT.C--Ce ^programme imprime les listings avec les numéros de lignes*/


;)
 
C'est censé sortir sur l'imprimante, mais stdprn n'est pas standard. D'après Trap D c'est un flux défini dans un vieux compilateur particulier (Borland Turbo C), c'est donc obsolète. :/


Message édité par Elmoricq le 08-08-2006 à 11:46:12
Reply

Marsh Posté le 08-08-2006 à 11:52:20    

Je l'ai lu aussi lol mais j'aimerais avoir plus de details sur l'ensemble  :ange:
 
En fait, stnprn n'est, comme je l'ai dit pas reconnu par la norme ansi, et le bouquin conseille, le cas ou il y aurait des probleme de compilation, de changer par stnout.  

Reply

Marsh Posté le 08-08-2006 à 12:00:34    

ton programme lit le fichier que tu lui donnes en argument et le réécrit en faisant précéder chaque ligne par son numéro. Toutes les 55 lignes, on change de page et on place au début de la nouvelle page un en-tête.
 
Pour comprendre en détails comment ça marche, réfère toi à ton bouquin (qui doit quand même je suppose expliquer un peu les exemples fournis). La fonction do_header ne sert qu'à afficher les en-têtes de pages. La lecture / réécriture du fichier se trouve dans la boucle while.
 
EDIT: comme tous les autres, je ne saurais trop de conseiller l'achat d'un meilleur bouquin de C ; le tien n'a vraiment pas l'air terrible...


Message édité par franceso le 08-08-2006 à 12:02:05

---------------
TriScale innov
Reply

Marsh Posté le 08-08-2006 à 13:56:42    

merci bien, je vais regarder ça de plus près..  
 
je crois que je vais me resigner à en acheter un autre oui :(

Reply

Marsh Posté le 08-08-2006 à 19:03:44    

J'ai réussi à copiler mon programme, surement une erreur de frappe de ma part. le principe est de lui donner n'importe quel fichier texte et il mettra le numero de ligne a coté avec une en tete ? Je le fais sous l'invite de commande, c'est possible ? Je demande ça parce que j'ai essaye et il me dit : "PRINT_IT n'est pas reconnu en tant que commande interne ou externe, un programme executable ou un fichier de commande" je comprend presque le sens, juste "commande internet ou externe" qui me pose problème.. comment palier à ce problème !

Reply

Marsh Posté le 08-08-2006 à 19:12:13    

stephaninho a écrit :

J'ai réussi à copiler mon programme, surement une erreur de frappe de ma part. le principe est de lui donner n'importe quel fichier texte et il mettra le numero de ligne a coté avec une en tete ? Je le fais sous l'invite de commande, c'est possible ? Je demande ça parce que j'ai essaye et il me dit : "PRINT_IT n'est pas reconnu en tant que commande interne ou externe, un programme executable ou un fichier de commande" je comprend presque le sens, juste "commande internet ou externe" qui me pose problème.. comment palier à ce problème !


 
En gros, ça veut dire que tu lui as demandé d'exécuter une commande "PRINT_IT", et que ce n'est pas une commande interne (genre "dir" ) donc il cherche un exécutable ou un script de ce nom là et il en trouve pas => erreur.
 
PRINT_IT, c'est bien le nom que tu as donné à ton exécutable ?
juste pour confirmation, tu tournes bien sous windows ?
tu peux donner la ligne de commande que tu as tapée ?
 
c'est peut-être un problème de PATH, mais je ne connais pas assez la ligne de commande windows pour en dire plus.


---------------
TriScale innov
Reply

Marsh Posté le 08-08-2006 à 19:42:33    

honte sur moi, l'executable ne s'appele pas print_it (je debute...)
 
apres modif, voici ce que ca me donne
 
http://img458.imageshack.us/img458/1621/listingqv8.jpg

Reply

Marsh Posté le 08-08-2006 à 21:07:38    

C'est normal, les fichiers .DOC sont dans un format propriétaire non-documenté, en gros il n'y a quasiment que les logiciels Microsoft Word qui peuvent les comprendre (et quelques autres, mais ce n'est pas le sujet.)
 
Essaie ton programme sur un fichier texte tout simple, voire un fichier .INI qui traine...

Reply

Marsh Posté le 08-08-2006 à 21:44:30    

T'es un as ! merci ça marche...  
 
tout ça pr ça lol il est nul ce programme, non ? !!!

Reply

Marsh Posté le 08-08-2006 à 21:48:00    

il faut bien commencer par quelque chose [:spamafote]
 
De plus, de la lecture de fichier, quand tu développes, tu en bouffes pas mal :D

Reply

Marsh Posté le 08-08-2006 à 21:50:50    

stephaninho a écrit :

T'es un as ! merci ça marche...  
 
tout ça pr ça lol il est nul ce programme, non ? !!!


 
J'ai encore, dans de vieux cartons, mon tout premier programme, écrit en pascal.  
Un space invader. En un temps où pour moi les tableaux étaient une rumeur (j'ai donc développé un starfield à coup de 150 variables), les variables locales un concept abstrait, et le mot "algorithme" une grossierté.
 
De temps à autre je le zieute, histoire de me rappeler l'humilité. :D

Reply

Marsh Posté le 08-08-2006 à 21:52:47    

Elmoricq a écrit :

J'ai encore, dans de vieux cartons, mon tout premier programme, écrit en pascal.  
Un space invader. En un temps où pour moi les tableaux étaient une rumeur (j'ai donc développé un starfield à coup de 150 variables), les variables locales un concept abstrait, et le mot "algorithme" une grossierté.
 
De temps à autre je le zieute, histoire de me rappeler l'humilité. :D


le premier space invaders qui nécessite 512 Mo [:pingouino]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-08-2006 à 21:54:40    

edit : avec une procédure d'install sur 3 disquettes et un loader de bitmaps pompé j'sais-plus-où :D


Message édité par Elmoricq le 08-08-2006 à 21:55:35
Reply

Marsh Posté le 08-08-2006 à 22:07:17    

Si j'arrivais à faire ça je serai content lol

Reply

Marsh Posté le 09-08-2006 à 16:21:45    

Salut à tous !  
 
une petite question, quel est l'interet d'utiliser fprintf et stderr alors qu'en utilisant juste printf on fait la meme chose ?  
 
Aussi, pourquoi je lis \n\n alors que \n fait la meme chose ?  
 

Reply

Marsh Posté le 09-08-2006 à 16:26:06    

stephaninho a écrit :

une petite question, quel est l'interet d'utiliser fprintf et stderr alors qu'en utilisant juste printf on fait la meme chose ?


Ah bon , printf permet aussi d'écrire dans un stream ?
 

stephaninho a écrit :

Aussi, pourquoi je lis \n\n alors que \n fait la meme chose ?


Pour passer deux lignes ?  [:moule_bite]  


---------------
Töp of the plöp
Reply

Marsh Posté le 09-08-2006 à 16:28:20    

_darkalt3_ a écrit :

Ah bon , printf permet aussi d'écrire dans un stream ?


 
tu veux dire permet d'ecrire dans stderr ?

Reply

Marsh Posté le 09-08-2006 à 16:31:51    

skelter a écrit :

tu veux dire permet d'ecrire dans stderr ?


 

Code :
  1. int fprintf( FILE *stream, const char *format [, argument ]...);


 
Donc oui, dans stderr aussi ...


---------------
Töp of the plöp
Reply

Marsh Posté le 09-08-2006 à 16:50:58    

un stream c'est quoi ? pour finir la différence avec printf est ou ?
 
aussi, pourquoi il faut mettre main() sans rien dans les parentheses ?

Message cité 3 fois
Message édité par stephaninho le 09-08-2006 à 16:55:45
Reply

Marsh Posté le 09-08-2006 à 16:52:13    

stream : une structure de donnée de type FIFO
printf : pas de paramètre de type FILE* (stream)


Message édité par pains-aux-raisins le 09-08-2006 à 16:52:51
Reply

Marsh Posté le 09-08-2006 à 16:54:04    

stephaninho a écrit :

un stream c'est quoi ? pour finir la différence avec printf est ou ?


 
Tu te documentes jamais sur ce que tu utilises ?

Reply

Marsh Posté le 09-08-2006 à 17:06:26    

Remarque un peu hostile à mon goût et complètement inutile.  
 
Je ne viens pas sur un forum demander de l'aide pour qu'on me reponde comme ça, le titre est "débuter en C" pas "le plus doué en C"...  si je demande c'est par conséquent que je n'ai pas l'information. Il y surement des domaine ou tu es moins doué je suppose que tu n'aprécierai ce type de remarque, ça fait partie d'une certaine pédagogie.  

Message cité 2 fois
Message édité par stephaninho le 09-08-2006 à 17:09:13
Reply

Marsh Posté le 09-08-2006 à 17:10:17    

stream == flux
 
Voici quelques liens honteusement repris du site d'un forumeur d'ici :
http://mapage.noos.fr/emdel/init_c.htm#flux
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed