Panacek – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Panacek – Pascal – Fórum – Programujte.comPanacek – Pascal – Fórum – Programujte.com

 

Přéma
~ Anonymní uživatel
34 příspěvků
1. 9. 2009   #1
-
0
-

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čí :-)

Nahlásit jako SPAM
IP: 195.113.123.–
Přéma
~ Anonymní uživatel
34 příspěvků
1. 9. 2009   #2
-
0
-

ěště sem zjistil že u týhle verze mi kompilátor (dev-pascal - pouziva free pascal kompilator) hlasi 4 chyby.

Nahlásit jako SPAM
IP: 195.113.123.–
Přéma
~ Anonymní uživatel
34 příspěvků
1. 9. 2009   #3
-
0
-

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;

Nahlásit jako SPAM
IP: 195.113.123.–
Krychlik
~ Anonymní uživatel
195 příspěvků
1. 9. 2009   #4
-
0
-

To Přéma : V procedure Prikazy si nulujes hodnota_cislo a pak to prevedes do toho stringu. Staci presunout "hodnota_cislo:=0; " a "hodnota_string:=''; " mimo tu proceduru, nebo treba uplne smazat.

Nahlásit jako SPAM
IP: 217.115.240.–
Mircosoft+1
Věrný člen
2. 9. 2009   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 19 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý