Demande 2 fois le caractère sinon ca plante. (ouf Résolu) [Pascal] - Delphi/Pascal - Programmation
Marsh Posté le 17-01-2004 à 18:59:52
j'ai fait plein de test avec writeln et il affiche un "vide" a la place du carac pr la première saisie.
c'est quoi flush?
Merci
Marsh Posté le 17-01-2004 à 19:04:27
tu veux dire que write ou writeln, tu as le même problème ? remplace tous tes write pas des writeln pour voir
Marsh Posté le 17-01-2004 à 19:13:19
C'est permit d'avoir un nom identique pour une constante globale et une variable dans le record " SENS " ???
Marsh Posté le 17-01-2004 à 19:29:21
Avec des writeln ca bugue pareil
Marsh Posté le 17-01-2004 à 19:46:06
ouias je viens de faire l'essai avec delphi 8 même chose. En attendant utilise un string et tu récupère la première lettre
Marsh Posté le 17-01-2004 à 20:08:02
mais si j'utilise un string, je ne peux plus mettre le upcase!
Marsh Posté le 17-01-2004 à 21:00:42
upcase(s[1])
pour s qui est un string non vide (si s = '' ça plantera)
Marsh Posté le 17-01-2004 à 21:41:21
(*Saisie de l'orientation du vent*)
Write('->Sens du vent: ');
Readln(tet[1]);
tet[1]:=upcase(tet[1]);
tabrel[i].sens:=tet[1];
while (tabrel[i].sens<>'E') and (tabrel[i].sens<>'O') and (tabrel[i].sens<>'S') and (tabrel[i].sens<>'N') Do
Begin
Write ('Sens du vent érroné: ');
Readln(tet);
tabrel[i].sens:=upcase(tet[1]);
end;
writeln;
Marche pas. var tet:string[1];
Marsh Posté le 17-01-2004 à 21:41:54
ca me tr**e le c*l
Marsh Posté le 17-01-2004 à 21:44:22
Pourquoi il m'envoie chier qd je fais la première saisie? ( c un autre pb que le précédent qui reste en suspend).
PROGRAM TP9_saisie;
USES Wincrt;
TYPE releve=Record
capteur:Record
dep,num:integer;
End;
temp:real;
sens:char;
end;
VAR nbrerel,i:integer;
fichier: file of releve;
rel: releve;
nomfichier:string[12];
BEGIN
(*Programme*)
BEGIN
(*Saisie du nom de fichier qui va sauvegarder les donnée*)
Writeln('Donnez le nom de fichier à créer');
Readln(nomfichier);
Assign(fichier,nomfichier);
Rewrite(fichier);
(*Saisie du nombre de relevés*)
Repeat
Writeln('Veuillez entrer le nombre de relevés à saisir?');
Read (nbrerel);
clrscr;
Until (nbrerel>0) and (nbrerel<=100);
(*Saisie des données du listing*)
(*Saisie du numéro de département*)
For i:=1 to nbrerel Do
Begin
Writeln('Donnée du relevé n°',i,'');
Writeln('Détails du code du capteur:');
Writeln;
Repeat
begin
Read(fichier,rel);
Write('->Code du département: ');
Read(rel.capteur.dep);
end;
Until (rel.capteur.dep>1) and (rel.capteur.dep<99);
(*Saisie du code de la zone*)
Repeat
begin
Read(fichier,rel);
Write('->Code de la zone: ');
Read(rel.capteur.num);
end;
Until (rel.capteur.num>0) and (rel.capteur.num<99);
(*Saisie de la température*)
Repeat
begin
Read(fichier,rel);
Write('->Température: ');
Read(rel.temp);
end;
Until (rel.temp>-50) and (rel.temp<70);
(*Saisie de l'orientation du vent*)
Read(fichier,rel);
Write('->Sens du vent: ');
Readln(rel.sens);
rel.sens:=upcase(rel.sens);
while (rel.sens<>'E') and (rel.sens<>'O') and (rel.sens<>'S') and (rel.sens<>'N') Do
Begin
Write ('Sens du vent érroné: ');
readln(rel.sens);
rel.sens:=upcase(rel.sens);
end;
writeln;
end;
Close(fichier);
end;
END.
Marsh Posté le 17-01-2004 à 21:53:35
c'est le même problème. je ne pige pas trop je dois dire quand tu lui demandes de lire une entrée alphanuméric, il continue comme si tu lui avais saisie du texte.
Je n'ai pas trop l'habitude des applications consoles sous delphi, mais franchement je ne comprend pas pourquoi le readln se comporte comme ça.
Marsh Posté le 17-01-2004 à 21:59:22
ok c'est bon j'ai peut être trouvé. en tout cas cela fonctionne sous delphi 8.
Au lieu de readln essaie "console.readline", mais j'ai bien peur que cela ne soit valide que pour le .net car cela ressemble trop au commande VB.net
Marsh Posté le 17-01-2004 à 23:10:25
mais console.readline ne marche pas sous mon compilo tpw. en + on ne l'a pas vu en cours. Il doit y avoir une solution cartésienne; pascal c pas de la magie que je sache?
Marsh Posté le 18-01-2004 à 14:55:13
Peut-être que ça n'a rien à voir et ça fait longtemps que je n'ai pas programmé en pascal mais j'avais pris l'habitude d'initialiser toutes les variables "texte" pour éviter les merdes aléatoires : essaie de mettre tabrel[i].sens:=' ' avant de débuter la saisie.
[Edit]
J'ai cru que j'allais y perdre mon pascal !
Le truc précédent ne marche pas mieux.
En fait, il suffit de remplacer le read(...) de la boucle précédente (saisie de la température) par un readln.
En effet, à la suite d'un read, le buffer-clavier contient le retour chariot et c'est celui-ci qui se retrouve dans .sens au lieu du caractère saisi.
Pascal est décidément très sensible avec la gestion des variables de type char !
A+
Marsh Posté le 18-01-2004 à 17:20:52
Merci bcp Itela, je n'aurais jamais pensé à ca.... MERCI
Marsh Posté le 18-01-2004 à 17:38:16
jijiz a écrit : Merci bcp Itela, je n'aurais jamais pensé à ca.... MERCI |
De rien...
Les fonctions de deboggage (point d'arrêt et visualisation des variables) m'ont aidé, sinon c'était à n'y rien comprendre !
Marsh Posté le 18-01-2004 à 18:18:02
je vais quand meme poser la colle a ma prof d'algo pour voir si elle trouve.
Marsh Posté le 17-01-2004 à 18:42:58
Lorsque le programme demande la direction du vent; il faut lui répéter 2 fois avant qu'il valide la saisie.
J'ai passé 2 heures sur ce bug sans rien trouver...
Merci de m'aider
(*Entete du programme*)
PROGRAM Meteo;
USES Wincrt;
CONST sens: string[4] = 'NSEO';
TYPE releve=Record
capteur:Record
dep,num:integer;
End;
temp:real;
sens:char;
end;
VAR i,nbrerel,cptdep:integer;
tabrel:array[1..100] of releve;
moytemp,somtemp,depmoy:real;
a:char;
(*Programme*)
BEGIN
(*Saisie du nombre de relevés*)
Repeat
Writeln('Veuillez entrer le nombre de relevés à saisir?');
Read (nbrerel);
clrscr;
Until (nbrerel>0) and (nbrerel<=100);
(*Saisie des données du listing*)
(*Saisie du numéro de département*)
For i:=1 to nbrerel Do
Begin
Writeln('Donnée du relevé n°',i,'');
Writeln('Détails du code du capteur:');
Writeln;
Repeat
begin
Write('->Code du département: ');
Read(tabrel[i].capteur.dep);
end;
Until (tabrel[i].capteur.dep>1) and (tabrel[i].capteur.dep<99);
(*Saisie du code de la zone*)
Repeat
begin
Write('->Code de la zone: ');
Read(tabrel[i].capteur.num);
end;
Until (tabrel[i].capteur.num>0) and (tabrel[i].capteur.num<99);
(*Saisie de la température*)
Repeat
begin
Write('->Température: ');
Read(tabrel[i].temp);
end;
Until (tabrel[i].temp>-50) and (tabrel[i].temp<70);
(*Saisie de l'orientation du vent*)
Write('->Sens du vent: ');
Readln(tabrel[i].sens);
tabrel[i].sens:=upcase(tabrel[i].sens);
while (tabrel[i].sens<>'E') and (tabrel[i].sens<>'O') and (tabrel[i].sens<>'S') and (tabrel[i].sens<>'N') Do
Begin
Write ('Sens du vent érroné: ');
readln(tabrel[i].sens);
tabrel[i].sens:=upcase(tabrel[i].sens);
end;
writeln;
end;
(*On demande à l'utilisateur le département dont il veut calculer la moyenne*)
clrscr;
Repeat
Begin
Writeln('Entrez le département dont vous voulez connaitre la température moyenne');
Readln(depmoy);
End;
Until (depmoy>0) and (depmoy<99);
(*Calcul pour un département donné de la température moyenne sur la journée*)
(*Calcul de la somme*)
cptdep:=0;
For i:=1 to nbrerel Do
Begin
If tabrel[i].capteur.dep=depmoy Then
begin
somtemp:=somtemp+tabrel[i].temp;
cptdep:=cptdep+1;
End;
End;
(*Calcul de la moyenne*)
If cptdep=0 Then
Begin
moytemp:=0;
End
Else
Begin
moytemp:=somtemp/cptdep;
End;
END.
Message édité par jijiz le 18-01-2004 à 17:22:28
---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561