Dobrý den,
dělám program panáček ve kterém bude panáček ovládanný příkazy zapsanými v textovém souboru.
Ale problém je že se mi nějak špatně načítají ty příkazy ze souboru.
procedure prikazy;
begin
radek:='';
hodnota_string:='';
hodnota_cislo:=0;
case prikaz of
'barva_panacka' : begin
str(hodnota_cislo,hodnota_string);
barva_panacka:=hodnota_cislo;
end;
end;
prikaz:='';
end;
procedure nacist_data;
var soubor : text;
l,m : integer;
znak : char;
begin
assign(soubor, '***cesta***');
reset(soubor);
while not eof(soubor) do
begin
readln(soubor, radek);
m:=length(radek);
l:=pos('=', radek);
prikaz:=copy(radek,1,l);
hodnota_string:=copy(radek,l+1,m);
prikazy;
end;
close(soubor);
end;
doufám že tento kód postačí :-)
Fórum › Pascal
Panacek
no jo... zase já :-)
mám pro vás novou verzi kódu a funguje akorat to mam fatalni chybu :-( a to ze nacte do promeny "hodnota_cislo" i "hodnota_string" nulu (text v souboru je: barva_panacka=7 ) to barva_panacka= je prikaz ktery se nacita do prom. prikaz a 7 je jeho hodnota nejprve nactená do prom. hodnota_string a pote prevedena do ciselne prom. hodnota_cislo. ale tak se mi ukaze akorat 0 :-(.
procedure prikazy;
begin
radek:='';
hodnota_string:='';
hodnota_cislo:=0;
if prikaz='barva_panacka=' then
begin
str(hodnota_cislo,hodnota_string);
barva_panacka:=hodnota_cislo;
end;
write(hodnota_cislo);
prikaz:='';
end;
procedure nacist_data;
var soubor : text;
l,m : integer;
znak : char;
begin
assign(soubor, 'C:\Documents and Settings\Premek\Desktop\pasaci\data.txt');
reset(soubor);
while not eof(soubor) do
begin
readln(soubor, radek);
m:=length(radek);
l:=pos('=', radek);
prikaz:=copy(radek,1,l);
hodnota_string:=copy(radek,l+1,m);
prikazy;
end;
close(soubor);
end;
Chápu dobře, že všechny příkazy mají tvar "příkaz=číslo"? Pak by šel program docela výrazně zjednodušit.
Krychlík má pravdu, ale máš tam ješte jednu chybu: potřebuješ převést číselnou hodnotu ze Radku na integer, ale na to je procedura Val, ne Str (zkontroluj si v helpu, jestli jsem správně napsal parametry - nejsem si jistý). V posledním parametru vrací buď nulu pří úspěchu nebo pozici případné chyby, kvůli které se řetězec nedá převést na číslo.
Pak ti tam chybí jakékoli ošetření chyb: vyhodnotíš všechny možné varianty příkazů, ale na konci musí být ještě jedno else pro neočekávané situace. Taky bys měl něco udělat, pokud v řádku chybí rovnítko.
Procedura Prikazy je zbytečná, protože se používá jenom na jednom místě, tak jsem ji rovnou rozepsal. Nakonec to dopadlo takhle:
procedure nacist_data;
var soubor:text;
delka,pozice,kontrola:integer;
znak:char;
Begin
assign(soubor,'C:\Documents and Settings\Premek\Desktop\pasaci\data.txt');
reset(soubor);
while not eof(soubor) do
begin
readln(soubor, radek);
pozice:=pos('=', radek);
if pozice=0 then prikaz:='Chybi "=".'; {co kdyby byl spatne vstup}
prikaz:=copy(radek,1,pozice);
hodnota_string:=copy(radek,pozice+1,delka-pozice); {kdyz uz jsme tu delku pocitali, tak proc ji nevyuzit}
val(hodnota_string,hodnota_cislo,kontrola); {prevod ze stringu na cislo}
if kontrola<>0 then prikaz='Hodnota neni cislo.'; {kdyz se prevod nepovedl, je to chyba}
if prikaz='barva_panacka=' then barva_panacka:=hodnota_cislo
else if prikaz=... then ...
else if ...atd., zpracovani dalsich prikazu...
...
else begin {osetreni chyb}
writeln('Chyba v prikazu ',radek);
writeln(prikaz);
end;
end;
close(soubor);
End;
Proměnnou Prikaz jsem využil zároveň pro předávání chybových hlášek a proměnné l a m jsem přejmenoval na Delka a Pozice, aby bylo na první pohled jasné, k čemu jsou (používání nic neříkajících názvů je nejrychlejší cesta k zabloudění ve vlastním kódu).
Snad ti to pomůže.
Moje stránka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Moderátoři diskuze