MissSixty
Messages postés18Date d'inscriptionmardi 10 août 2004StatutMembreDernière intervention25 août 2004
-
12 août 2004 à 21:33
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
22 août 2004 à 02:12
Salut !
Je cherche à comprendre le bogue dans un programme tout simple qui me permet de récupérer la position du curseur (en nombres de lignes) en fin de fichier. Le nombre de lignes retournées par mon code est plutôt bizarre, il est de -9 !?!?! Alors qu'il devrait me retourner 35441 !?!
Est-ce que quelqu'un peut m'aider??? Si vous avez d'autres suggestions, n'hésitez pas!
Pour votre information le fichier toto.txt est composé de 35441 lignes dont chacune comprend 3 nombres décimaux espacés par un tab (la 35441ème ligne du fichier est vide).
MissSixty
Messages postés18Date d'inscriptionmardi 10 août 2004StatutMembreDernière intervention25 août 20041 13 août 2004 à 01:14
s'cuser moi l'ignorance, mais n'étant pas une pro de la prog, ça me dit absolument rien de mettre ça dans un buffer. Est-ce qu'il y a quelqu'un qui pourrait m'expliquer comment je peux incorporer ça à mon code ???? Ça serait vraiment gentil !
MissSixty
Messages postés18Date d'inscriptionmardi 10 août 2004StatutMembreDernière intervention25 août 20041 12 août 2004 à 22:39
Ouain... je viens de cogiter sur mon problème !!! Ça faisait aucun sens ! Finalement, voici le programme que j'ai ajouté à mon code.
C'est en code C, j'aurais préféré l'avoir en C++ pcq tout le reste de mon code est en C++, mais j'ai pas trouvé comment le modifier... L'important c'est que là, ça marche !!!
Si vous avez des suggestions pour transformer ce code en C++, je les attends avec impatience !!!
Merci =)
--------------------------
Voici le code :
int nb_lignes = 0;
char c;
FILE *fichier;
fichier = fopen("toto.txt", "r");
if (fichier == NULL)
{
cout << " Aucun fichier detecte ! " << endl;
exit(1);
}
else
{
do
{
c = fgetc(fichier);
if (c == '\n')
{
nb_lignes ++;
cout << nb_lignes << endl;
}
} while ( !feof(fichier) );
}
cout << " Nombre de lignes totales du fichier = " << nb_lignes << endl;
Vous n’avez pas trouvé la réponse que vous recherchez ?
jeromedu94
Messages postés83Date d'inscriptionmardi 24 février 2004StatutMembreDernière intervention10 mars 2006 21 août 2004 à 21:26
salut,
faut faire gaffe aussi au type que t'utilises pour calculer le nombre de lignes, parce que si la variable est sur 16 bits ça peut faire un dépassement et tu auras un nombre négatif comme dans ton cas où tu devais avoir 35441 lignes.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 22 août 2004 à 00:30
ah ok, me semblait bizzare ton affaire.
Faut utiliser 'int' qui sera 32 bits sur processeur 32 bits et ne souffrira d'aucune penalite en temps d'acces, l'octet non plus d'ailleurs mais le 'short' SI, tu y perdrais donc en vitesse comme en quantite stockable.
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 22 août 2004 à 01:05
BruNews > sur les docs des processeur (x86), il est dit (pour les entiers) d'utiliser au maximun des unsigned pour les compteur, indexer un tableau, et autres operations de bases sur les entiers (surtout division et modulo)
j'utilise moi meme des unsigned mais j'ai fais le teste sur l'indexation d'un tableau et il se trouve que c'est 2 fois plus rapide avec un signé, c'est normal ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 22 août 2004 à 01:14
Je ne pense pas que soit la doc des 'processeurs' mais des compilos. Un processeur (ASM) ignore la difference signed unsigned, il n'y a que des registres, la diff est seulement comment on le regarde (EFLAGS) a un certain moment. Il est certain que le compilo doit generer des instructions plus longues (en taille) pour recupere le bit haut s'il est positionne et que tu declares int au lieu de DWORD, il n'y a par contre aucune raison que soit plus lent avec l'un ou l'autre dans le cas d'une variable compteur incrementee, tout dependra de la forme de l'algo.
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 22 août 2004 à 01:43
donc en regle generale il n'y a aucune raison de preferer les non signés aux signés ?
est-ce que l'alu d'un processeur x86 considere le signe d'un entier?
dans la doc ils disent egalement qu'un entier signé sera converti en float plus rapidement qu'un entier non signés car les processeur dispose d'une instruction (asm) qui convertit un entier signé en float, mais j'ai pas vu de difference
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 22 août 2004 à 01:55
Prefere les non signes si tu peux dans le cas de nombreuses divisions, c'est la pire operation qu'on puisse infliger au processeur.
Un entier en asm n'a pas de signe:
int i;
i-- sera: dec edi
DWORD i;
i-- sera toujours: dec edi
le prob va se poser quand on analysera le positionnement EFLAGS resultant, encore une boucle si != 0 alors 'jnz boucle' mais il n'y a pas de difference fondamentale.
Aucune diff non plus en chargement dans la fpu, utilisera 'fild' si tu as dit 'int' sinon 'fld', tous les 2 chargent depuis un emplacement memoire et jamais direct depuis un registre, une grande partie de la perte de temps est la, pas dans le fait que soit signe ou non.