Petit probléme pour une suppresion d'enregistrement - C - Programmation
Marsh Posté le 15-10-2008 à 18:04:31
Oué, pas trop mal. Quelques pistes :
Quelques autres remarques :
Marsh Posté le 15-10-2008 à 19:01:25
tpierron a écrit : Oué, pas trop mal. Quelques pistes :
|
j'avais pas pensé à ca merci bien je vais essayer dès que je rentre
tpierron a écrit :
|
pour les deux premier point c'est comme ca que notre prof nous a apprit mais je vais essayer comme tu dis
et si non tu me dis que je peux pas modifier car je suis en read c'est bien çà ?
en tout cas merci bien pour ton aide
Marsh Posté le 15-10-2008 à 19:53:22
Poupou49 a écrit : |
Ton professeur est incompétent.
1. gets() est une fonction dépréciée depuis... pfiou... 20 ans ? Plus ? Elle n'existe encore que pour conserver une compatibilité avec les très vieux programmes. Elle NE DOIT PAS être utilisée, pour une raison très simple : il est impossible de contrôler la taille de ce qui est lu avec cette fonction, donc il est impossible de sécuriser un programme niveau gestion de la mémoire. N'importe quelle manpage ("man gets" sous Unix, sinon sous Google si tu n'es pas sous Unix) le dit d'ailleurs, en voici une au hasard sur google :
SECURITY CONSIDERATIONS |
Un prof qui suggère l'utilisation de cette fonction doit être pendu haut et court.
2. fflush(stdin) a un comportement non défini par la norme. Ce qui signifie que le comportement peut varier d'un système d'exploitation à un autre, puisqu'il n'est pas universellement défini. C'est complètement incontrôlable, il ne faut donc jamais utiliser fflush(stdin). Le plus souvent, d'ailleurs, cet appel ne fait rien du tout. Il y a une raison simple à cela : stdin, c'est un flux standard d'entrée. Habituellement c'est le clavier, mais... un simple pipe suffit à changer la donne, et du coup ça peut être n'importe quoi. Donc pas de fflush(stdin).
Vu ce que te recommande ton prof, achète un bouquin et potasse de ton côté, tu t'en sortiras mieux. Jette notamment un coup d'oeil sur "Le Langage C", de Kernighan&Ritchie, la référence pour ce langage. De toute façon c'est un achat utile.
Marsh Posté le 15-10-2008 à 19:54:50
Poupou49 a écrit : |
Pour la fonction "gets", ce n'est pas un drame dans un exercice comme ça. C'est juste qu'en utilisant fgets on prends conscience des problèmes de buffer overflow (très difficile à corriger en C, donc vaut mieux les éviter).
Pour fflush(stdin) je viens de me rendre compte que ça fonctionne sous Windows. Donc oublie la remarque.
Sinon d'autres trucs qui ne vont pas dans ton code :
Tes boucles ne sont pas tout à fait correcte. Tu fais:
lire(enregistrement)
tant que(pas fini)
{
imprime(enregistrement)
lire(enregistrement)
}
Bah ça ne t'imprimeras jamais ton dernier enregistrement. Un truc plus mieux (et plus court) :
tant que(lire(enregistrement) > 0)
{
imprime(enregistrement)
}
Aussi, spécificité Windows, tes fichiers sont binaires, donc rajoutes absolument le "b" dans le mode d'ouverture du fichier, sinon ça va coincer.
Marsh Posté le 15-10-2008 à 20:03:42
tpierron a écrit : Pour la fonction "gets", ce n'est pas un drame dans un exercice comme ça. C'est juste qu'en utilisant fgets on prends conscience des problèmes de buffer overflow (très difficile à corriger en C, donc vaut mieux les éviter). |
Aucun intérêt d'enseigner une fonction dépréciée et dangereuse, quand il est tout aussi facile d'en apprendre une autre.
Tout au plus on peut l'évoquer pour expliquer pourquoi il ne faut pas l'utiliser (ce qui est marqué partout, dans les bouquins, les manpages, les aides en ligne, etc).
Marsh Posté le 15-10-2008 à 20:08:56
Ouais, mais bon, pour un TP (très certainement sur les fichiers), que l'interface utilisateur soit pourrie, je ne pense pas que ça soit crucial dans ce contexte.
Bon toujours est-il que fgets(bleurp, sizeof bleurp, stdin), ce n'est pas beaucoup plus long que gets(bleurp).
Marsh Posté le 15-10-2008 à 21:40:04
Elmoricq a écrit :
|
merci pour le conseil du livre et je vais utilisé fgets dorénavant.Il s'utilise comme le gets?
tpierron a écrit : |
pourtant ca marche aussi bien ma boucle je ferrais un teste avec la tienne après avoir trouvé comment tu fais lire(enregistrement)>0 ^^
tpierron a écrit : Ouais, mais bon, pour un TP (très certainement sur les fichiers), que l'interface utilisateur soit pourrie, je ne pense pas que ça soit crucial dans ce contexte. |
je m'en fous de l'interface graphique c'est juste un PTI de fin de bts et on me demande pas d'interface utilisateur mirobolante pour çà
Marsh Posté le 16-10-2008 à 10:14:20
donc j'ai mis des fgets partout merci bien du conseil.Mais j'ai toujours un problème pour le stock
Code :
|
et le code d'erreur est :
In function `stock':
10[Warning] passing arg 1 of `strcmp' makes pointer from integer without a cast
In function `affichage':
48 [Warning] passing arg 2 of `stock' makes integer from pointer without a cast
Mais je vois pas comment résoudre ce problème :s
Marsh Posté le 16-10-2008 à 10:35:36
nomrech est un caractère, et non un tableau de caractère, donc il est normal que strcmp() te retourne cette erreur à la compilation (puisque la fonction admet 2 tableaux de caractères en paramètres).
La seconde erreur est liée.
Il suffit simplement de modifier le prototype de ta fonction stock() (ligne 2 du code que tu donnes) pour que ça fonctionne.
Marsh Posté le 15-10-2008 à 17:38:40
Voila un programme que je prépare pour un pti. J'ai deux problèmes majeur(j'ai mis des ICI pour les trouver plus facilement) dedans qui m'empêche de continuer.
Le premier et le calcul/affichage de jeux identiques en stocks avec la fonction stock.
Le deuxième et la modification de la référence d'un jeux.
Si quelqu'un a une petite idée pour me débloquer je suis preneur.
Merci d'avance
Message édité par Poupou49 le 15-10-2008 à 19:02:05
---------------
Tic !! Tac !! Boom !! \o/ !! - "Si les hommes pensent avec leur bite, faut croire que les femmes sont drôlement handicapé en en étant privé" _Tchip_