Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1540 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Besoin d'aide pour un exercice.

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Besoin d'aide pour un exercice.

n°933778
mcyrb
Mieux vaut tard que plus tard
Posté le 29-12-2004 à 19:10:27  profilanswer
 

Voila, j'ai un exo à faire en C et j'ai une fonction qui merde...
Mon programme se genere sans probleme mais au moment de l'execution j'ai une erreur qui me dit:
 
Exception non gérée à 0x00412083 dans monprog.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xccdfcb40.
 
Voila la fonction en question:
 

Code :
  1. int SIZEMOT(char *vers,int *ifmot)
  2. {
  3. char T[11]={' ','.','!','?','\'',',',';',':','(',')','"'};
  4. int idmot,i;
  5. do
  6. {
  7.  *ifmot--;
  8.  for(i=0;i<11 && vers[*ifmot]!=T[i];i++);
  9. }
  10. while(i!=11);
  11. idmot=*ifmot;
  12. do
  13. {
  14.  idmot--;
  15.  for(i=0;i<11 && vers[idmot]!=T[i];i++);
  16. }
  17. while(i==11);
  18. idmot++;
  19. *ifmot++;
  20. return(idmot);
  21. }


 
Et voila la partie de la fonction principale qui contient cette fonction:
 

Code :
  1. char vers[81];
  2. int idmot,ifmot;
  3. gets(vers);
  4. ifmot=strlen(vers);
  5. idmot=SIZEMOT(vers,&ifmot);


 
Merci pour votre aide  :hello:


Message édité par mcyrb le 29-12-2004 à 19:18:53
mood
Publicité
Posté le 29-12-2004 à 19:10:27  profilanswer
 

n°933791
lsdYoYo
gravity powered
Posté le 29-12-2004 à 19:28:51  profilanswer
 

Un réponse en vitesse, il faut faire attention à la priorité entre * et ++ : "*ifmot++;" ==> "(*ifmot)++;"
Sinon ton source est *vraiment* pas clair (IOCCC ? Non, je suis méchant).
Regarde aussi du côté de "strchr()", "strpbrk()" et autres...

n°933795
mcyrb
Mieux vaut tard que plus tard
Posté le 29-12-2004 à 19:33:55  profilanswer
 

lsdyoyo a écrit :

Un réponse en vitesse, il faut faire attention à la priorité entre * et ++ : "*ifmot++;" ==> "(*ifmot)++;"
Sinon ton source est *vraiment* pas clair (IOCCC ? Non, je suis méchant).
Regarde aussi du côté de "strchr()", "strpbrk()" et autres...


 
Merci, j'ai effectué cette correction, et maintenant j'ai une erreur similaire mais ailleurs, je vais faire un debuggage pas à aps pour voir ou exactement...
 
Euh... c'est pas clair à ce point la ?
 
strchr() et strpbrk() je connais pas, mais vu que c'est un exo si je sors ca mes profs ils vont me regarder comme ca:  :heink:
 
EDIT: lol j'arrive meme plus a generer mon prog sans les corrections alors qu'avant ca se faisait nickel  :lol:


Message édité par mcyrb le 29-12-2004 à 19:44:57
n°933870
pains-aux-​raisins
Fatal error
Posté le 29-12-2004 à 22:07:51  profilanswer
 

D'après ce que j'ai pu comprendre, la fonction SIZEMOT sert à calculer la position de debut (idmot) et de fin (ifmot) du dernier mot d'une chaine, en tenant compte des ponctuations.
 
Voici une solution alternative. A tester pour voir si c'est bien ce que tu recherches. ;)
 

Code :
  1. int SIZEMOT(char *vers,int *ifmot)
  2. {
  3. int idmot;
  4. do {
  5.  (*ifmot)--;
  6. } while(!ispunct(vers[*ifmot]));
  7. idmot = *ifmot;
  8. do {
  9.  idmot--;
  10. } while(!ispunct(vers[*idmot]));
  11. idmot++;
  12. (*ifmot)++;
  13. return idmot;
  14. }
  15. /* retourne 1 si un caractère est une ponctuation, 0 sinon */
  16. int ispunct(int car)
  17. {
  18. switch(car)
  19. {
  20.  case ' ' :case '.' :case '!' :
  21.  case '?' :case '\'':case ',' :
  22.  case ';' :case ':' :case '(' :
  23.  case ')' :case '"' : return 1
  24.  default  : return 0
  25. }
  26. }


Message édité par pains-aux-raisins le 29-12-2004 à 22:16:26
n°933887
Pillow
'cos the trees won't talk
Posté le 29-12-2004 à 22:39:35  profilanswer
 

pains-aux-raisins a écrit :


Code :
  1. int SIZEMOT(char *vers,int *ifmot)
  2. {
  3. int idmot;
  4. do {
  5.  (*ifmot)--;
  6. } while(!ispunct(vers[*ifmot]));
  7. idmot = *ifmot;
  8. do {
  9.  idmot--;
  10. } while(!ispunct(vers[*idmot]));
  11. idmot++;
  12. (*ifmot)++;
  13. return idmot;
  14. }



 
Le premier test ne serait pas à l'envers? Et avec une chaine du genre "foo" on va avoir des index négatifs  [:totoz]

n°933890
pains-aux-​raisins
Fatal error
Posté le 29-12-2004 à 22:52:01  profilanswer
 

nan, notre ami initialise la variable *ifmot avec strlen(vers)... va savoir pourquoi... [:spamafote]

n°933893
pains-aux-​raisins
Fatal error
Posté le 29-12-2004 à 22:59:46  profilanswer
 

pillow a écrit :

Le premier test ne serait pas à l'envers? Et avec une chaine du genre "foo" on va avoir des index négatifs  [:totoz]


j'ai compris ce que tu voulais dire... D'ailleurs ça doit être la cause de sa violation d'adresse ;)
 

Code :
  1. int SIZEMOT(char *vers,int *ifmot)
  2. {
  3. int idmot, lg = *ifmot;
  4. do {
  5.  (*ifmot)--;
  6. } while(*ifmot >= 0 && !ispunct(vers[*ifmot]));
  7. idmot = *ifmot;
  8. if (*ifmot > 0) { (*ifmot)++; }
  9. else { *ifmot = lg-1; return 0; }
  10. do {
  11.  idmot--;
  12. } while(idmot >= 0 && !ispunct(vers[*idmot]));
  13. if (idmot > 0)  { idmot++; }
  14. return idmot;
  15. }


Message édité par pains-aux-raisins le 29-12-2004 à 23:06:55
n°933895
mcyrb
Mieux vaut tard que plus tard
Posté le 29-12-2004 à 23:01:02  profilanswer
 

pains-aux-raisins a écrit :

nan, notre ami initialise la variable *ifmot avec strlen(vers)... va savoir pourquoi... [:spamafote]


 
Ben... pour partir de la fin ?  :whistle:  
(Puisque en effet je veux les indices de debut et de fin du dernier mot)

n°933899
pains-aux-​raisins
Fatal error
Posté le 29-12-2004 à 23:08:04  profilanswer
 

je viens de modifier le code de SIZEMOT pour gérer les cas limites. A toi maintenant de vérifier qu'ils n'en restent pas d'autres :D

n°933901
Pillow
'cos the trees won't talk
Posté le 29-12-2004 à 23:12:25  profilanswer
 

pains-aux-raisins a écrit :

j'ai compris ce que tu voulais dire... D'ailleurs ça doit être la cause de sa violation d'adresse ;)
 

Code :
  1. int SIZEMOT(char *vers,int *ifmot)
  2. {
  3. int idmot;
  4. do {
  5.  (*ifmot)--;
  6. } while(*ifmot >= 0 && !ispunct(vers[*ifmot]));
  7. idmot = *ifmot;
  8. do {
  9.  idmot--;
  10. } while(idmot >= 0 && !ispunct(vers[*idmot]));
  11. idmot++;
  12. (*ifmot)++;
  13. return idmot;
  14. }



 
 
Le premier test me semble toujours à l'envers  [:petrus75]  
Le but c'est qu'avec une chaine du type "foo:bar!!!", on récupère 4 et 7, non?
Dans ce cas, on commence par la fin, on boucle jusqu'a trouver la fin du dernier mot (donc tant que ispunc est vraie). Puis on boucle jusqu'a trouver le début du dernir mot (donc tant que ispunct est fausse) .  
 
Pour la violation d'accès je pense que ça venait plutot de la priorité entre * et --  [:petrus75]  
 
Ça devrait donner ça donc:  
 

Code :
  1. int SIZEMOT(char *vers,int *ifmot)
  2. {
  3.      int idmot;
  4.      while(ispunct(vers[--*ifmot]) && *ifmot>=0);
  5.      idmot = *ifmot;
  6.      if (!idmot) return 0;
  7.    
  8.      while(!ispunct(vers[--idmot]) && idmot>=0);
  9.      idmot++;
  10.      (*ifmot)++;
  11.      return(idmot);
  12. }


 
(Il y avait une * de trop dans le deuxième test  [:aloy] )

mood
Publicité
Posté le 29-12-2004 à 23:12:25  profilanswer
 

n°933909
mcyrb
Mieux vaut tard que plus tard
Posté le 29-12-2004 à 23:41:20  profilanswer
 

Merci bcp pour vos reponses !
 
En effet la violation d'acces venait de la priorité entre * et -- (que j'ignorais jusqu'à maintenant).
 
C'est vrai que j'avais pas pensé à faire une fonction avec un switch, merci aussi pour cette methode  :hello:

n°933915
mcyrb
Mieux vaut tard que plus tard
Posté le 30-12-2004 à 00:00:41  profilanswer
 

pillow a écrit :


Ça devrait donner ça donc:  
 

Code :
  1. int SIZEMOT(char *vers,int *ifmot)
  2. {
  3.      int idmot;
  4.      while(ispunct(vers[--*ifmot]) && *ifmot>=0);
  5.      idmot = *ifmot;
  6.      if (!idmot) return 0;
  7.    
  8.      while(!ispunct(vers[--idmot]) && idmot>=0);
  9.      idmot++;
  10.      (*ifmot)++;
  11.      return(idmot);
  12. }




 
Euh... c'est ptet pas une bonne idée de mettre --*ifmot dans vers[] parce que si *ifmot=0, on va s'aventurer dans un vers[-1]  :pt1cable:


Message édité par mcyrb le 30-12-2004 à 00:01:56
n°933928
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-12-2004 à 00:40:53  profilanswer
 

pains-aux-raisins a écrit :


Code :
  1. /* retourne 1 si un caractère est une ponctuation, 0 sinon */
  2. int ispunct(int car)
  3. {
  4. switch(car)
  5. {
  6.  case ' ' :case '.' :case '!' :
  7.  case '?' :case '\'':case ',' :
  8.  case ';' :case ':' :case '(' :
  9.  case ')' :case '"' : return 1
  10.  default  : return 0
  11. }
  12. }



ispunct() est une fonction standard (<ctype.h> ). Inutile de réinventer la roue...
 
http://dpobel.free.fr/man/html/affiche_man.php?id=1480


Message édité par Emmanuel Delahaye le 30-12-2004 à 00:41:42

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°933935
mcyrb
Mieux vaut tard que plus tard
Posté le 30-12-2004 à 01:38:17  profilanswer
 

Emmanuel Delahaye a écrit :

ispunct() est une fonction standard (<ctype.h> ). Inutile de réinventer la roue...
 
http://dpobel.free.fr/man/html/affiche_man.php?id=1480


 
D'apres la page que tu a envoyé ispunct() ne sépare que espace&alpha-numériques et autres, or la c un peu différent... Et puis dans mon exo c'était dit clairement quels caracteres servaient de separation entre les mots.
 
Sinon pourquoi int ispunct(int car) et pas int ispunct(char car) ?


Message édité par mcyrb le 30-12-2004 à 01:39:13
n°933942
fafounet
Posté le 30-12-2004 à 03:39:09  profilanswer
 

le int correspond au code ASCII

n°933959
Lam's
Profil: bas.
Posté le 30-12-2004 à 07:41:33  profilanswer
 

mcyrb a écrit :

D'apres la page que tu a envoyé ispunct() ne sépare que espace&alpha-numériques et autres, or la c un peu différent... Et puis dans mon exo c'était dit clairement quels caracteres servaient de separation entre les mots.
 
Sinon pourquoi int ispunct(int car) et pas int ispunct(char car) ?


 
Alors utilise un vieux:

Code :
  1. const char * ponctuation = "(),;.";
  2. if (strchr(ponctuation, car))
  3.     { /*blablabla*/ }


n°933962
pains-aux-​raisins
Fatal error
Posté le 30-12-2004 à 08:50:34  profilanswer
 

c'est la solution qu'on utiliserai dans la vraie vie, mais je crois me souvenir que les profs aiment bien réinventer la roue :whistle:

n°933964
pains-aux-​raisins
Fatal error
Posté le 30-12-2004 à 08:52:09  profilanswer
 

Emmanuel Delahaye a écrit :

ispunct() est une fonction standard (<ctype.h> ). Inutile de réinventer la roue...
 
http://dpobel.free.fr/man/html/affiche_man.php?id=1480


 [:franck1135] Merci Emmanuel Delahaye, tu viens de changer ma vie...

n°933967
pains-aux-​raisins
Fatal error
Posté le 30-12-2004 à 08:57:26  profilanswer
 

pillow a écrit :

Le premier test me semble toujours à l'envers  [:petrus75]  
Le but c'est qu'avec une chaine du type "foo:bar!!!", on récupère 4 et 7, non?


+1
Il était tard disons... :D

n°933968
pains-aux-​raisins
Fatal error
Posté le 30-12-2004 à 09:04:21  profilanswer
 

mcyrb a écrit :

Euh... c'est ptet pas une bonne idée de mettre --*ifmot dans vers[] parce que si *ifmot=0, on va s'aventurer dans un vers[-1]  :pt1cable:


Met les *ifmot>=0 et idmot>= avant le test ispunct. Ton compilateur étant un peu fainéant n'ira pas faire le test ispunct si *ifmot ou idmot est négatif.
Modifie le code posté pillow pour gérer le cas d'un vers ne contenant qu'un seul mot, sans ponctuation. ;)
(dans ce cas le début c'est 0 et la fin c'est la longueur de la chaine - 1)

n°934027
mcyrb
Mieux vaut tard que plus tard
Posté le 30-12-2004 à 11:54:34  profilanswer
 

pains-aux-raisins a écrit :

Met les *ifmot>=0 et idmot>= avant le test ispunct. Ton compilateur étant un peu fainéant n'ira pas faire le test ispunct si *ifmot ou idmot est négatif.
Modifie le code posté pillow pour gérer le cas d'un vers ne contenant qu'un seul mot, sans ponctuation. ;)
(dans ce cas le début c'est 0 et la fin c'est la longueur de la chaine - 1)


 
Ouais, mais meme en mettant *ifmot>=0 et idmot>=0 avant, la décrémentation va se faire apres ce test... ou alors faudrait remplacer >= par >

n°934032
pains-aux-​raisins
Fatal error
Posté le 30-12-2004 à 11:59:24  profilanswer
 

hmm, pour des raisons de simplicité, je mettrais tout bêtement la décrémentation dans le corps de la boucle...
J'aime pas me prendre la tête pour des trucs qui n'en valent pas la peine.
en gros je reprendrais le do...while que j'avais posté, corrigé par la remarque de pillow.


Message édité par pains-aux-raisins le 30-12-2004 à 12:00:37
n°934059
mcyrb
Mieux vaut tard que plus tard
Posté le 30-12-2004 à 12:59:43  profilanswer
 

pains-aux-raisins a écrit :

hmm, pour des raisons de simplicité, je mettrais tout bêtement la décrémentation dans le corps de la boucle...
J'aime pas me prendre la tête pour des trucs qui n'en valent pas la peine.
en gros je reprendrais le do...while que j'avais posté, corrigé par la remarque de pillow.


 
C'est ce que j'ai fait  :D

n°934060
mcyrb
Mieux vaut tard que plus tard
Posté le 30-12-2004 à 13:00:58  profilanswer
 

Lam's a écrit :

Alors utilise un vieux:

Code :
  1. const char * ponctuation = "(),;.";
  2. if (strchr(ponctuation, car))
  3.     { /*blablabla*/ }



 
Le probleme c'est que pour moi il est pas vieux, il est meme pas nouveau, il m'est encore (officiellement) inconnu  :whistle:

n°934083
ssou
Posté le 30-12-2004 à 14:03:44  profilanswer
 

salut,
g essayé ton code de la façon suivante et ça m'a pas posé de pbr, il est executable et il m'a affiché les valeurs de ifmot et idmot
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
 
int SIZEMOT(char *vers,int *ifmot)  
{  
    char T[11]={' ','.','!','?','\'',',',';',':','(',')','"'};  
    int idmot,i;  
 
    do  
    {  
        *ifmot--;  
        for(i=0;i<11 && vers[*ifmot]!=T[i];i++);  
    }  
    while(i!=11);  
    idmot=*ifmot;  
    do  
    {  
        idmot--;  
        for(i=0;i<11 && vers[idmot]!=T[i];i++);  
    }  
    while(i==11);  
    idmot++;  
    *ifmot++;  
    return(idmot);  
}
 
 
void main()
{
 
char vers[81];  
    int idmot,ifmot;  
 
    gets(vers);  
    ifmot=strlen(vers);  
    idmot=SIZEMOT(vers,&ifmot);
printf("%d  %d", ifmot, idmot);
getch();
 
}
 
 
dis moi est ce que ce que tu veux faire vraiment ça ou non. moi, bien que g pas bien lu le code, g une doute concernant le gets, est ce que t'es sûr qu'elle est entrain de vraiment lire la chaine de carctères, probalement le stdin est plein donc il n'est pas entrain de recevoir la  chaîne, je pense que tant qu'il y a une violation d'accès, il y a un pointeur NULL en jeux.
donc pour eviter ce prb , fais précéder l'instruction  gets(vers);
 par fflush(stdin);
 
 
j'attends ta réponse!!

n°934176
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-12-2004 à 15:33:46  profilanswer
 

ssou a écrit :

salut,
    char T[11]={' ','.','!','?','\'',',',';',':','(',')','"'};  


Une façon compliquée d'écrire  
 
    char T[11] = " .!?',;:()\"";  

Citation :

void main()


main() retourne int. Toujours.

Citation :

   gets(vers);


gets() est un bug. Son utilisation est formellement déconseillé.

Citation :

donc pour eviter ce prb , fais précéder l'instruction  gets(vers);
 par fflush(stdin);


gets() n'est pas une instruction mais un appel de fonction.
fflush() n'est défini que pour les flux sortants.


Message édité par Emmanuel Delahaye le 30-12-2004 à 17:28:40

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°934206
ssou
Posté le 30-12-2004 à 16:09:10  profilanswer
 

salut,
je sais bien que gets est une fonction de lecture de chaine de caractères, mais toute la ligne gets(chaine); est une instruction en soi.  
elle n'est pas déconseillée, je suis désolée, car pour la lecture d'une chaine de caractères il n'y a pas mieux, sinon quelle sont les autres alternatives? tu vas me dire scanf, et ben, scanf elle est "forte" pour le faite qu'elle permet de lire tt type de données mais son problème majeur avec les chaînes de caractères c qu'elle ne lit qu'une chaine qui ne contient pas d'espace blanc (elle s'arrête dès qu'elle trouve un espace blanc),et donc son utilisation devient limitée.  
concernant le fflush, desolée aussi, elle est utilisable pour les flux d'entrée ainsi que les flux de sortie
fflush(stdin); pour les flux d'entrée
fflush(stdout); pour la sortie
main ne retourne pas tjr un int comme tu le dis, elle peut retourner un void.
et tu peux expériementer ça!

n°934209
Lam's
Profil: bas.
Posté le 30-12-2004 à 16:15:20  profilanswer
 

[:cupra]

n°934215
nraynaud
lol
Posté le 30-12-2004 à 16:22:08  profilanswer
 

\o/ IWH

n°934228
cricri_
Posté le 30-12-2004 à 16:36:12  profilanswer
 

:whistle:

n°934231
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-12-2004 à 16:46:47  profilanswer
 

ssou a écrit :


<gets()... > elle n'est pas déconseillée, je suis désolée, car pour la lecture d'une chaine de caractères il n'y a pas mieux, sinon quelle sont les autres alternatives?


fgets()
 
http://mapage.noos.fr/emdel/notes.htm#saisie

Citation :


concernant le fflush, desolée aussi, elle est utilisable pour les flux d'entrée ainsi que les flux de sortie
fflush(stdin); pour les flux d'entrée
fflush(stdout); pour la sortie


Non. La norme est claire:

Citation :


ISO/IEC 9899:1999 (E) ©ISO/IEC
 
7.19.5.2 The fflush function
Synopsis
1 #include <stdio.h>
int fflush(FILE *stream);
Description
2 If stream points to an output stream or an update stream in which the most recent
operation was not input
, the fflush function causes any unwritten data for that stream
to be delivered to the host environment to be written to the file; otherwise, the behavior is
undefined
.
<...>


Citation :


main ne retourne pas tjr un int comme tu le dis, elle peut retourner un void.


http://mapage.noos.fr/emdel/notes.htm#typemain
 
Essayons :


void main (void)
{
}


Borland C 3.1


Compiling MAIN.C:
Error MAIN.C 2: main must have a return type of int


Dev-C++


gcc.exe -c main.c -o dexe/main.o -W  -Wall  -ansi  -O2
 
main.c:2: warning: return type of `main' is not `int'



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°934258
mcyrb
Mieux vaut tard que plus tard
Posté le 30-12-2004 à 17:24:37  profilanswer
 

ssou a écrit :

salut,
g essayé ton code de la façon suivante et ça m'a pas posé de pbr, il est executable et il m'a affiché les valeurs de ifmot et idmot
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
 
int SIZEMOT(char *vers,int *ifmot)  
{  
    char T[11]={' ','.','!','?','\'',',',';',':','(',')','"'};  
    int idmot,i;  
 
    do  
    {  
        *ifmot--;  
        for(i=0;i<11 && vers[*ifmot]!=T[i];i++);  
    }  
    while(i!=11);  
    idmot=*ifmot;  
    do  
    {  
        idmot--;  
        for(i=0;i<11 && vers[idmot]!=T[i];i++);  
    }  
    while(i==11);  
    idmot++;  
    *ifmot++;  
    return(idmot);  
}
 
 
void main()
{
 
char vers[81];  
    int idmot,ifmot;  
 
    gets(vers);  
    ifmot=strlen(vers);  
    idmot=SIZEMOT(vers,&ifmot);
printf("%d  %d", ifmot, idmot);
getch();
 
}
 
 
dis moi est ce que ce que tu veux faire vraiment ça ou non. moi, bien que g pas bien lu le code, g une doute concernant le gets, est ce que t'es sûr qu'elle est entrain de vraiment lire la chaine de carctères, probalement le stdin est plein donc il n'est pas entrain de recevoir la  chaîne, je pense que tant qu'il y a une violation d'accès, il y a un pointeur NULL en jeux.
donc pour eviter ce prb , fais précéder l'instruction  gets(vers);
 par fflush(stdin);
 
 
j'attends ta réponse!!


 
 
Je n'ai plus aucun probleme avec cette fonction, elle execute exactement ce que je lui demande, merci quand meme.
(Le but de mon programme n'est pas d'afficher les positions de debut et de fin du dernier mot, mais juste de cette fonction, enfin j'ai d'autres problemes dans mon prog mais qui n'ont plus rien à voir avec cette fonction).

n°934259
pains-aux-​raisins
Fatal error
Posté le 30-12-2004 à 17:25:32  profilanswer
 

cool ;)

n°934262
mcyrb
Mieux vaut tard que plus tard
Posté le 30-12-2004 à 17:28:31  profilanswer
 

Sinon en rapport avec votre discussion, moi pour le moment on m'a toujours dit de déclarer le main avec void main(), d'utiliser un gets() pour saisir une chaine de caracteres et d'utiliser un fflush(stdin); lorsque je veux faire un gets apres avoir fait un scanf() et/ou un getchar().
Pour cette histoire de norme j'en entends beaucoup parler, enormément meme, dapres ce que j'entends, je ne fais que des choses déconseillées voire interdites, mais bon pour l'instant je fais comme on me l'apprend et tant qu'il y a pas de probleme... :whistle:
 
EDIT: Et ca fonctionne tres bien sous Dev C++ (que j'ai utilisé) et Visual  C++ 6.0 et .NET (que j'utilise actuellement).


Message édité par mcyrb le 30-12-2004 à 17:40:08
n°934279
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-12-2004 à 17:41:06  profilanswer
 

mcyrb a écrit :

moi pour le moment on m'a toujours dit de déclarer le main avec void main(), d'utiliser un gets() pour saisir une chaine de caracteres et d'utiliser un fflush(stdin);  


Je ne sais pas qui est ce 'on', mais moi, et d'autres (y compris ceux qui écrivent les compilateurs) nous te disons ce qui est défini dans la norme. Bien sûr il existe des tonnes de bouquins et des masses de soi-disant profs se copiant les uns les autres pour soutenir le contraire, mais les professionels, notamment les nombreux contributeurs du forum Usenet news:comp.lang.c savent de quoi ils parlent et ont dénoncé ces pratiques douteuses depuis la nuit des temps.
 
Quelques liens:
 
http://membres.lycos.fr/cultc/liens_prog.htm
 

Citation :


lorsque je veux faire un gets apres avoir fait un scanf() et/ou un getchar().
Pour cette histoire de norme j'en entends beaucoup parler, enormément meme,  


Ben oui. Le langage C est normalisé. La moindre des choses si on utilise se langage est au, moins de savoir ce qui est spécifié et ce qui ne l'est pas.

Citation :


dapres ce que j'entends, je ne fais que des choses déconseillées voire interdites, mais bon pour l'instant je fais comme on me l'apprend et tant qu'il y a pas de probleme...


Tu fais ce que tu veux, mais en connaissance de cause.  
 
Ne fait pas ça si des vies sont en cause (automobile, médical, avionique, nucléaire, spatial). Tous ces domaines utilisent de l'informatique embarquée, principalement écrite en C ou en Ada...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°934288
mcyrb
Mieux vaut tard que plus tard
Posté le 30-12-2004 à 17:48:12  profilanswer
 

Emmanuel Delahaye a écrit :

Je ne sais pas qui est ce 'on', mais moi, et d'autres (y compris ceux qui écrivent les compilateurs) nous te disons ce qui est défini dans la norme.


 
Ben 'on' ce sont mes profs d'algo, mais en meme temps je ne suis qu'au premier trimestre de 1re année donc je pretends pas du tout etre capable de programmer pour le professionnel... peut etre que cette histoire de norme viendra plus tard, mais c'est dommage que ce serait dommage quece soit ignoré dans une formation professionnelle  :whistle:


Message édité par mcyrb le 30-12-2004 à 17:48:54
n°934295
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-12-2004 à 17:57:11  profilanswer
 

mcyrb a écrit :

Ben 'on' ce sont mes profs d'algo, mais en meme temps je ne suis qu'au premier trimestre de 1re année donc je pretends pas du tout etre capable de programmer pour le professionnel... peut etre que cette histoire de norme viendra plus tard, mais ce serait dommage que ce soit ignoré dans une formation professionnelle


L'enseignement est malheureusement très mauvais... Tout ce que j'ai appris, c'est par 15 ans de formation autodidacte et de pratique personnelle et professionelle, une semaine de stage intensif de C (sur 8 mois de stage d'informatique de gestion), et 5 ans de pratique des forums C pointus comme clc et flc.


Message édité par Emmanuel Delahaye le 30-12-2004 à 18:18:38

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°934299
pains-aux-​raisins
Fatal error
Posté le 30-12-2004 à 18:10:24  profilanswer
 

Pour une fois on est d'accord ;)

n°934300
nraynaud
lol
Posté le 30-12-2004 à 18:14:48  profilanswer
 

je suppose que tout le monde est d'accord pour taper sur l'éducation.
 
Mais on est combien à avoir envoyé chier tout ce bordel et à en subir les conséquences (notament salariales) ?

n°934307
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-12-2004 à 18:24:13  profilanswer
 

nraynaud a écrit :

je suppose que tout le monde est d'accord pour taper sur l'éducation.
 
Mais on est combien à avoir envoyé chier tout ce bordel et à en subir les conséquences (notament salariales) ?


Je pense sincèrement que le travail bénévole que font les intervenants sérieux des forums techniques sont une réponse 'citoyenne et responsable' aux manquements graves de l'enseignement.  
 
Personnellement, mon but est que les gens programment mieux. J'ai été confronté à trop de code poubelle que j'ai du réécrire de A à Z pour ne pas essayer d'améliorer les choses...  
 
Alors SVP, plus de gets(), ni de fflush(stdin)...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Besoin d'aide pour un exercice.

 

Sujets relatifs
Principes d'héritage et de polymorphisme... à l'aide !Aide sur une contrainte d'integrité...
aide pour création forcée d'un fichier txt (et écriture)...aide de créaion de formulaire
Besoin d'aide requête MySQLbesoin d'aide pour convertion html-->css
Expressions régulieres un peu d'aide ...SQBDR besoin d'aide amateur
Plus de sujets relatifs à : Besoin d'aide pour un exercice.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR