Chyba v konstatě - Pascal Vyřešeno

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Lynx.Lynx
Level 1
Level 1
Příspěvky: 53
Registrován: červenec 11
Pohlaví: Muž
Stav:
Offline

Chyba v konstatě - Pascal

Příspěvekod Lynx.Lynx » 14 úno 2012 19:02

Zdravím, rád bych si dal do kódu nějaké konstanty. Když ji zapíšu jako třeba a=15.5; nebo pi=3.14; tak se to správně zkompiluje, ale pak ve vlastním programu mi to píše Run time error 106 na adrese xxxx:yyyy. Což prý znamená špatnou číselnou hodnotu. Někde jsem se dočetl, že se to dá vyřešit přes řetězce, poradil by mi prosím někdo jak? Děkuji.

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Chyba v konstatě - Pascal

Příspěvekod faraon » 14 úno 2012 19:38

Chyba 106 by měla znamenat že je to neplatný formát, jako třeba když zadáš z klávesnice číslo s desetinnou čárkou místo tečky. Mohl bys sem hodit kód který ti tu chybu způsobuje? A také přesně v čem to vytváříš a kompiluješ.
Obvykle se to dá vyřešit použitím readln() místo read().
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Lynx.Lynx
Level 1
Level 1
Příspěvky: 53
Registrován: červenec 11
Pohlaví: Muž
Stav:
Offline

Re: Chyba v konstatě - Pascal

Příspěvekod Lynx.Lynx » 16 úno 2012 18:43

Vytvářím to v programu Pascal ED 1.02 (PasEd). A kód (v podstatě celý program) je následující:

Kód: Vybrat vše

program Pauzy;
uses crt;
const a = 19.75;
var zacatek, konec, pauza: real;
begin
 repeat
  Textcolor(white);
  Write ('Zadej konec: ');
  ReadLn (konec);
  Write ('Zadej zacatek: ');
  ReadLn (zacatek);
  pauza := zacatek - konec + 24;
  WriteLn;
  WriteLn ('Pauza je ',pauza:5:2,' hodin.');
  WriteLn ('----------------------------');
   Textcolor(132);
  if pauza<9 then WriteLn ('Mala pauza!');
 until konec=0;
end.

Zkušené programátory asi klepne, ale já to jinak neumím. Ale když to číslo zadám ručně, tak to funguje, jen přes tu konstatu nee.

Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Chyba v konstatě - Pascal

Příspěvekod domitea » 16 úno 2012 18:58

Nemá tam být nahodou něco jako const real = 19.75? Pascal jsem měl naposledy v devítce :lol:

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Chyba v konstatě - Pascal

Příspěvekod faraon » 17 úno 2012 18:26

V TurboPascalu mi to funguje bez problémů, akorát to počítá nějaké nesmysly, nemělo by v tom vzorci být ještě modulo? A navíc nemůžeš zadávat čas v šedesátkovém formátu, to načítání by chtělo vyřešit jinak. K čemu tam ta konstanta má být?
Nechceš zkusit spíš FreePascal?
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Lynx.Lynx
Level 1
Level 1
Příspěvky: 53
Registrován: červenec 11
Pohlaví: Muž
Stav:
Offline

Re: Chyba v konstatě - Pascal

Příspěvekod Lynx.Lynx » 17 úno 2012 18:53

No, zkusím popsat, co bych vůbec od toho výtvoru očekával. Možná, že jsem se dal špatnou cestou a někdo poradí lepší způsob.

Snažím se dát do kupy pro svoji potřebu (v práci) jednoduchý program, který mi spočítá přestávku mezi směnami pro řidiče. Zadal bych konec směny, ale ve formátu čísla turnusu, ne času (tady je asi kámen úrazu, potřeboval bych napsat třeba konečnou směnu "2" a ono by to dosadilo 18.5 nebo 18 hod. 30 min.). Pak bych zadal začátek následující směny a program by spočetl přestávku. Ideální by bylo, kdybych jako číslo (název) směny mohl zadat stejné pro začátek i konec a ono by to samo vybralo správnou hodnotu z nějakého seznamu začátků a konců turnusů, ale nevadilo by, kdyby se muselo zadat k2 a z2 pro začátek a konec. V podstatě je mi jedno, jestli to bude v Excelu, PHP, nebo Pascalu, důležité je, aby to fungovalo.

A teď k tomu výplodu nahoře. Asi bude chyba v tom, že ta konstanta se dá dosadit do nějakého vzorce, kde se počítá třeba proměnná * 2 * konstanta (třeba pí). A já to vlastně přímo cpu do proměnné, protože když se mne to dotáže na začátek směny, tak já chci zadat "a" místo čísla. Aby se "a" samo převedlo na 19.75. A proto to háže chybný číselný formát. A to asi takhle nejde ...

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Chyba v konstatě - Pascal

Příspěvekod faraon » 17 úno 2012 19:28

Tak takhle to v Pascalu opravdu nepůjde, tohle fungovalo akorát v Sinclair BASICu na historickém ZX Spectrum (jo, vzpomínky :D). Ale můžeš si pro ten vstup napsat vlastní funkci, která bude takovéhle činnosti provádět přesně tak jak potřebuješ. Prostě načítej vstup znak po znaku a podle toho co načteš něco proveď.
Stejně tak si můžeš vytvořit funkci, která ti bude vypisovat dobu s šedesátkovými minutami, místo setin hodiny. O to jednodušší pak bude vlastní hlavní program:

Kód: Vybrat vše

begin
  nacti(pocatek);
  nacti(konec);
  pauza=pocatek-konec+24;
  zobraz(pauza)
end.


To počítání by se dalo snadno udělat v Excelu, ale nevím jak tam provést tu záměnu "kódů" za časy. Napadají mě jen dost složité podmínky.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
memphisto
Guru Level 13
Guru Level 13
Příspěvky: 21113
Registrován: září 06
Bydliště: Zlín - České Budějovice
Pohlaví: Muž
Stav:
Offline

Re: Chyba v konstatě - Pascal

Příspěvekod memphisto » 17 úno 2012 20:53

domitea píše:Nemá tam být nahodou něco jako const real = 19.75? Pascal jsem měl naposledy v devítce :lol:


Kód: Vybrat vše

var a, b, c, x1, x2: real;
PRAVIDLA PC-HELP.CZ, PRAVIDLA sekce HijackThis, HijackThis návod, Memtest, CCleaner
Logy z programu HijackThis neposílejte prosím přes SZ, ale vkládejte je do patřičné sekce. Děkuji

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Chyba v konstatě - Pascal  Vyřešeno

Příspěvekod faraon » 19 úno 2012 18:57

Šlo by to provést takhle, s přímým zadáváním času (a zatím bez hrátek s barvičkami :smile:):

Kód: Vybrat vše

program Pauzy;

uses crt;

var zacatek,konec,pauza: real;
    i:integer;



function nacti(text:string):real;

         var hod,min,n,x,ok:integer;
             z:char;

         begin
         repeat begin
                hod:=0;
                min:=0;
                n:=1;
                x:=0;
                ok:=1;
                write(text);
                repeat begin
                       read(z);
                       case z of
                            '0'..'9': begin
                                      if x=0 then
                                         hod:=hod*10+ord(z)-48
                                      else
                                         if x=1 then
                                           min:=min*10+ord(z)-48;
                                      inc(n)
                                      end;
                            ':',',','.',' ': inc(x)
                                         end;
                       if (n=3) and (x=0) then
                          inc(x)
                       end until z=chr(10);
                if hod>23 then
                   begin
                   writeln('Hodiny mohou být jen v rozmezí 0 až 23!');
                   ok:=0
                   end;
                if min>59 then
                   begin
                   writeln('Minuty mohou být jen v rozmezí 0 až 59!');
                   ok:=0
                   end;
                end until ok=1;

         nacti:=hod+min/60
         end;



procedure zobraz(cas:real);

          var hod,min:integer;

          begin
          hod:=trunc(cas);
          min:=trunc(frac(cas)*60+0.5);
          write('Pauza byla ',hod,':');
          if min<10 then
             write('0');
          writeln(min,' dlouha.');
          if cas<9 then
             writeln('Mene nez 9 hodin!!!')
          end;



begin

repeat begin
       writeln('Zadej konec predchozi a zacatek nove jizdy,');
       writeln('napriklad   8:30   8,30   8.30   0830');
       writeln('pro ukonceni zadej same nuly:');
       konec:=nacti('Konec minule jizdy: ');
       zacatek:=nacti('Zacatek dalsi jizdy: ');

       if (zacatek<>0) and (konec<>0) then
          begin
          if zacatek<konec then
             zacatek:=zacatek+24;
          pauza:=zacatek-konec;
          zobraz(pauza);
          readln
          end
       end until (zacatek=0) and (konec=0)
end.


Když dodáš tabulku těch turnusů, tak to do toho můžu zkusit vtlačit, aby se daly zadávat kódem.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Chyba CPU na desce
    od petan320 » 24 bře 2025 15:29 » v Problémy s hardwarem
    16
    7667
    od petr22 Zobrazit poslední příspěvek
    02 dub 2025 21:50
  • Chyba hardware. Příloha(y)
    od Steage7717 » 10 lis 2024 16:29 » v Problémy s hardwarem
    4
    3267
    od Steage7717 Zobrazit poslední příspěvek
    12 lis 2024 18:49
  • Chyba příkazový řádek Příloha(y)
    od zik9 » 05 čer 2025 11:24 » v Windows 11, 10, 8...
    4
    1145
    od zik9 Zobrazit poslední příspěvek
    12 čer 2025 15:33
  • Sqlite - systémová chyba Příloha(y)
    od cindy the skull » 27 úno 2025 11:59 » v Vše ostatní (sw)
    6
    10182
    od atari Zobrazit poslední příspěvek
    16 bře 2025 11:11
  • prohližeč událostí id 1796 chyba Příloha(y)
    od walderan » 01 dub 2025 15:58 » v Problémy s hardwarem
    9
    3946
    od walderan Zobrazit poslední příspěvek
    04 dub 2025 15:42

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti