NepřihlášenKSP fórum
Fórum Hlavní stránka Nápověda Hledat Přihlásit
Nahoru Téma KSP / CodEx / 24-1-X Razitko a dlouhé řetězce
- - Dne 15. 10. 2011 21:26
[větev tématu přesunuto]
Nadřazený - - Od Dominik Macháček (Org) Dne 06. 10. 2011 22:30
Jaká je maximální šířka obrázku? Může být větší než 254? Myslím, že jsem napsal správný program, když ho testuju sám, vždycky odpoví správně, ale od CodExu stále dostávám 0 bodů za špatnou odpověď (přesněji test 1 je WA:Wrong answer, všechny ostatní Runtime error 201: Range check error). Každý řádek ukládám do jednotky string a nevím, jestli se tam vejdou a když ne, tak co s tím.  Používám Pascal.
Nadřazený - - Od Dominik Macháček (Org) Dne 15. 10. 2011 20:09
Prosím, odpovězte mi. Může CodEx zadat řetězec delší než 255 znaků? A jestli jo, jak ho má Pascal číst? Do jakého typu nebo jakým příkazem?
Nadřazený - Od Lukáš Lánský (Org) Dne 15. 10. 2011 21:26
Neznám kontext té úlohy (meze jsou asi dané jen vevnitř CodExu, kam se nechci protloukat), ale pokud jde čistě o možnosti jazyka, myslím, že CodEx překládá FreePascalem a tam jsou sice obyčejné řetězce omezené na 255 znaků, ale je tam taky ansistring (http://www.freepascal.org/docs-html/ref/refsu10.html).
Nadřazený - - Od Karel Tesař (Org) Dne 16. 10. 2011 00:42
Ano CodEx může zadat řetězec delší než 255 znaků. Ono vlastně je to jen N znaků na řádce.

Pascal dopodrobna neznám, ale stringy v něm jsou omezeny na pouhých 255 znaků, takže doporučuji buď použít nějaký jiný typ (třeba ten, který navrhuje Lukáš), a nebo celou matici znaků 'B' a 'W' načítat po znacích a ukládat do pole.

Pokud se rozhodneš vstup číst po znacích, tak pozor na znak konec řádku.

Kdybys měl ještě nějaké otázky, tak napiš. :-)
Nadřazený - - Od Dominik Macháček (Org) Dne 16. 10. 2011 14:03
Zkouším obojí. Ansistring i dvourozměrné pole sice jsou dosti dlouhé, ale příkaz readln přečte jen prvních 255 znaků, zbytek ne. Je nějaký příkaz, který by jich přečetl víc najednou?

Jinak díky za odpovědi.
Nadřazený - - Od Karel Tesař (Org) Dne 16. 10. 2011 15:37
Existuje příkaz read, který přečte jeden znak ze vstupu. Pomocí něj tedy můžeš přečíst celý řádek. Například tak, že budeš číst znak po znaku, dokud nepřečteš znak '\n'.
Nadřazený - - Od Dominik Macháček (Org) Dne 16. 10. 2011 16:53
Ten příkaz znám, ale je v unitě crt, a tu nesmím použít. Nebo můžu? Je i nějaký jiný?
Nadřazený - - Od Manipulující Martin B. (Org) Dne 16. 10. 2011 17:00
Read je normalne v jadru jazyka, IMHO. V Crt vidim podobne jenom ReadKey, ale to je neco jineho.
Nadřazený - - Od Tomáš Maleček (Org) Dne 16. 10. 2011 17:36
Rozhodně je tam. Odkazování se na standardy je zrovna u Pascalu trochu problém; v nejstarší normě je read() tady:

http://standardpascal.org/iso7185.html#6.9.1%20The%20procedure%20read

Ale pro nás je relevantní stejně FreePascal:

http://www.freepascal.org/docs-html/rtl/system/read.html

Ono "system" v cestě zcela jasně říká, jak na tom read() je.

Přehled, co za procedury a funkce umí Crt ve FreePascalu, je tady:

http://www.freepascal.org/docs-html/rtl/crt/index-5.html
Nadřazený - - Od Dominik Macháček (Org) Dne 16. 10. 2011 18:54
V těch odkazech je read v souboru, ale já soubor nemám. Hledám příkaz, který funguje stejně jako ReadKey v crt a přitom není v crt. Pořád ho nikde nemůžu najít.
Nadřazený - - Od Medvěd (Org) Dne 16. 10. 2011 19:00
Ten soubor je u read nepovinný. Když ho neuvedeš, read bude číst ze standardního vstupu, což je při obyčejném spuštění (bez přesměrování vstupu) klávesnice.
Nadřazený - - Od Dominik Macháček (Org) Dne 16. 10. 2011 20:08
To sice jo, ale přečte prvních 255 znaků řetězce. Já chci, aby z řetězce o délce w w-krát přečetl jeden znak a uložil ho do ansistringu nebo do matice.
Nadřazený - - Od Medvěd (Org) Dne 16. 10. 2011 20:11
Tak čti do proměnné typu char, to by mělo fungovat.
Nadřazený - - Od Dominik Macháček (Org) Dne 16. 10. 2011 20:15
Myslim, že jsem to zkoušel a myslim, že to nešlo. Zejtra to zkusim zas.
Nadřazený - - Od Medvěd (Org) Dne 16. 10. 2011 20:16
Pokud Ti to nebude chodit, pošli mi prosím zdroják na mj@ucw.cz.
Nadřazený - Od Dominik Macháček (Org) Dne 16. 10. 2011 20:19
Dobře.
Nadřazený - - Od Medvěd (Org) Dne 16. 10. 2011 18:08
Pozor, bys '\n' nikdy v Pascalu neměl dostat, i když čteš po znacích. Správně se to dělá tak, že pomocí eoln testuješ, jestli ještě nejsi na konci řádku, a až jsi, zavoláš readln bez parametrů, čímž konec řádku sežereš.
Nadřazený - - Od Dominik Macháček (Org) Dne 18. 10. 2011 19:54
Dneska jsem to konečně pochopil a zkusil. Funguje to dobře, ale jen  do 254 znaků. Víc to nevezme.
Nadřazený - Od Tomáš Maleček (Org) Dne 19. 10. 2011 00:26
Jak Medvěd někde psal, pošli zdroják. Z toho můžeme vykoukat nejlépe, proč ti to nechce brát víc. Můj mail je malecektomas@gmail.com.
Nadřazený - - Od Tomáš Maleček (Org) Dne 16. 10. 2011 16:17
Pokud čteš do Ansistring, měl by readln přečíst všechno až do prvního konce řádku. Aspoň tolik jsem si právě přečetl v téhle diskuzi:

http://acm.uva.es/board/viewtopic.php?f=15&t=1013

Mně ansistring funguje dobře. Jenom jsem zjistil, že se děsně pere s unitou crt. Hezky je to vidět na tomhle příkladu:

ansitest.pas
-----
uses crt;
var
  mystring: ansistring;
begin
  readln(mystring);
  write(mystring);
end.

shell
----
fpc ansitest.pas
perl -e 'print "x" x 50000;' | ./ansitest | less -N

Perlem vygeneruju 50000 znaků "x" za sebou a rourou je pošlu do zkompilovaného testovacího programu v Pascalu, který by měl svůj vstup přesně opsat na výstup. To se ale neděje. Jeho výstup pošlu do lessu (-N zapíná číslování řádek), který mi ukáže, jak se zkazil.

Crt zaláme text na výstupu na šířku 80 znaků (to ještě nejspíš bude feature) a od 26. řádky dál je na začátku každé řádky ^M (carriage return, céčkaři a vůbec unixáři znají jako \r). Zároveň to vypíše nějaká x navíc, jak se jde přesvědčit pomocí připojení tr -d '\r\n' | wc -c místo less (smaže to znaky \n a \r a zbytek spočítá). Prostě crt to rozbíjí. Čekal bych, že všechny starší unity budou mít také problém, přeci jenom na dlouhé stringy se při jejich psaní napamatovalo.
Nadřazený - Od Jan Maria Matějka (Org) Dne 16. 10. 2011 16:50

> Mně ansistring funguje dobře. Jenom jsem zjistil, že se děsně pere
> s unitou crt. Hezky je to vidět na tomhle příkladu:


Unitu CRT afaik zaakazujeme.
Nadřazený - - Od Medvěd (Org) Dne 16. 10. 2011 18:10
Pozor, Crt je potvora a předefinovává read/write a spol. tak, že pak nepracují se standardním vstupem, nýbrž s klávesnicí a obrazovkou. Ta se pod Linuxem simuluje pomocí std. vstupu a výstupu, ale dosti pochybně. Takže ačkoliv Crt v CodExu nejspíš půjde použít, nejspíš pak program nebude nikdy dělat to, co potřebuješ.
Nadřazený - Od Tomáš Maleček (Org) Dne 16. 10. 2011 18:54
Zajímavé. Tohle jsem nevěděl, díky.

Takže jak jsem ne úplně explicitně psal, řešením by mělo být zbavení se unit a používání ansistring + readln().
Nahoru Téma KSP / CodEx / 24-1-X Razitko a dlouhé řetězce

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill