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

Vytvoření vlastní knihovny - Pascal – Pascal – Fórum – Programujte.comVytvoření vlastní knihovny - Pascal – Pascal – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Gooo0
Newbie
29. 11. 2014   #1
-
0
-

Zdravím

Pokouším se pochopit vytváření vlastních knihoven v pascalu, ale nedaří se mi to. Chápu to takto:

Knihovna je rozdělena na dvě části. V první části Interface si nastavím název funkce, dále názvy proměnných, které bude používat zdrojový soubor a datový typ těchto proměnných.

V druhé části Iplementation je už nějaký kód, který chci řešit. Pro pochopení jsem si udělal knihovnu, která mi třeba bude počítat obsah kruhu (pomiňme jednoduchost).

Knihovna mi nyní vypadá takto:

Unit Geom; //Nazev knihovny

Interface //Verejne rozhrani

   Function Kruh_obsah (r: real): real;


Implementation

   Function Kruh_obsah(r: real): real; //Obsah kruhu
      Begin
         Kruh_obsah := (pi *( r * r )); //Samotny vypocet
      End;

End.

Nyní mám zdrojový soubor, kde chci tuto knihovnu použít:

Program Vypocty;
Uses crt, geom;

Var x, r, a, b, vysledek:Real;

Procedure ObsKr;
Begin
   WriteLn ('Vybrali jste volbu 1 - Obsah kruhu.');
   WriteLn ('Zadejte prosim polomer kruhu: ');
   ReadLn (r);
   WriteLn ('Obsah kruhu s vami zadanym polomerem je: ', vysledek);
End;

Begin
   clrscr;
   WriteLn ('Vyberte si geometricky obrazec a operaci, ktera vas zajima:');
   WriteLn ('');
   WriteLn ('1 - Obsah kruhu');

   WriteLn ('');
   WriteLn ('Zadejte prosim cislo vasi volby');
   ReadLn (x);

   If x = 1 Then ObsKr

End.

(mám tam použitu proceduru a ify. Těch voleb a procedurtam bude více, abych se naučil s tímto pracovat, ale pro znázorněí toho co mám jsem zatím smazal).

Nyní ale stojím na tom, že netuším, jak to propojit. Když spustím zdrojový soubor, tak mi to vyhodí chybovou hlášku. Když si ji nechám zobrazit co je za problém, otevře se mi moje knohovna a označí se mi řádek: 

         Kruh_obsah := (pi *( r * r )); //Samotny vypocet

Evidentně tedy někde dělám chybu. Podle skript jsem ji nenašel a jednoduše třetí den hledám  a pokouším se promazávat co se stane když...

Nahlásit jako SPAM
IP: 178.72.244.–
Kit+15
Guru
29. 11. 2014   #2
-
0
-

#1 Gooo
Tipuji, že by to do uses chtělo přidat název knihovny Geom.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gooo0
Newbie
29. 11. 2014   #3
-
0
-

#2 Kit
Zkoušel jsem a i si to hned opravil, ale nepomohlo. Provázání s knihovnou funguje, protože mám otevřen pouze program, kde knihovnu volám, kompiluji, vyhodí mi to chybu, kliknu na chybu, aby mi ukázal kde je a otevře se tato knihovna s právě vyznačeným řádkem:

         Kruh_obsah := (pi *( r * r )); //Samotny vypocet

Takže v propojení to asi nebude...

Nahlásit jako SPAM
IP: 178.72.244.–
Kit+15
Guru
29. 11. 2014   #4
-
0
-

#3 Gooo
Možná kdyby sis přečetl chybovou hlášku, zjistil bys, že nemáš definovánu proměnnou "pi".

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gooo0
Newbie
29. 11. 2014   #5
-
0
-

#4 Kit
Máš pravdu. Je to chyba. Jenž to situaci neřeší. Já to totiž měl včera s pi, která byla deklarovaná. Já to pi ale přepsal na 3,14, pak na 3.14 a házelo stejnou chybu. 

Chybovou hláškou se neumím řídit. Píše mi to:

"23 / 26 geom.pas  Fatal: Syntax error, ) expected but , found"

Hledá to konec závorky? Já ty kódy projel a neukončenou závorku jsem nenašel. Je to bu´d nějaká hloupost, kterou prostě nevidím, nebo to chápu úplně blbě.

Nahlásit jako SPAM
IP: 178.72.244.–
Kit+15
Guru
29. 11. 2014   #6
-
0
-

#5 Gooo
Říká to, že máš čárku někde, kde být nemá. Bohužel nevím, kde máš 23. řádek.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
29. 11. 2014   #7
-
0
-

#5 Gooo
Koukám, že v programu vypisuješ nedefinovaný obsah proměnné "vysledek".

Za voláním procedury ObsKr ti chybí závorky. Co to je za název "ObsKr"? To neumíš vymyslet lepší? Třeba ObsahKruhu? Mezi voláním procedury a závorkou se nepíše mezera.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gooo0
Newbie
29. 11. 2014   #8
-
0
-

#7 Kit
Ať udělám jakoukoli změnu, tak mi to vypíše stále stejnou chybu. Řádek 23 je právě:

         Kruh_obsah := (pi *( r * r )); //Samotny vypocet

Nebylo mi jasné, co předává ten výsledek z knihovny, tak jsem použil proměnnou Vysledek. Upravil jsem tedy zdrojáky takto:

   Function Kruh_obsah (r, Vysledek: real): real;
   Function Kruh_obsah (r, Vysledek: real): real; //Obsah kruhu
      Begin
         Vysledek := 0;
         Vysledek := (3.14 * ( r * r )); //Samotny vypocet
      End;

a v programu kde volám, jsem upravil:

Procedure ObsKr;
Begin
   WriteLn ('Vybrali jste volbu 1 - Obsah kruhu.');
   WriteLn ('Zadejte prosim polomer kruhu: ');
   ReadLn (r);
   Kruh_obsah (r, Vysledek);
   WriteLn ('Obsah kruhu s vami zadanym polomerem je: ', Vysledek);
End;
   If x = 1 Then
   Begin
    ObsKr;
   End

Závorky za voláním procedury? Koukám na návody a závorky nejsou uvedeny ani u procedur, ani u příkladu s If. Proč je tam dávám?

Nahlásit jako SPAM
IP: 178.72.244.–
Kit+15
Guru
29. 11. 2014   #9
-
0
-

#8 Gooo
Proměnná Vysledek je přece úplně k ničemu. Ty neumíš zavolat funkci?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gooo0
Newbie
29. 11. 2014   #10
-
0
-

#9 Kit
Popravdě, učím se pascal a mám za sebou 8 hodin, takže postupuji spíš podle nějakých návodů na internetu a systémem omyl pokus :o/.

Nahlásit jako SPAM
IP: 178.72.244.–
Gooo0
Newbie
29. 11. 2014   #11
-
0
-

Tak já nevěděl, jak přesně volat funkci, tak jsem to ještě předělal do procedury. Druhý den, ať dělám cokoli, tak se mi pořád vypisuje jedna a tatáž chyba. Netuším už, jak ji odhalit.

Raději zde postnu celý kód, protože možná už dělám chybu v tom, že jsem to zkracoval. Napadá někoho, proč mi tenhle kód vypisuje chybu:

23 / 26 geom.pas Fatal: Syntax error, ) expected but , found

Knihovna:

Unit Geom; //Nazev knihovny

{===Promenne, ktere budou pouzivany jak v knihovne, tak v samotnem programu ===}
Interface //Verejne rozhrani
   Procedure Kruh_obsah (r: real; Var Vysledek: real); //Pro vypocet bude zadana hodnota polomeru r v realnych cislech. Vysledek bude v ralnych cislech
   Procedure Kruh_obvod (r: real; Var Vysledek: real); //Pro vypocet bude zadana hodnota polomeru r v realnych cislech. Vysledek bude v ralnych cislech
   Procedure Obdelnik_obsah (a, b: real; Var Vysledek: real); //Pro vypocet budou zadany velikosti strany a a b v realnych cislech. Vysledek bude v realnych cislech
   Procedure Obdelnik_obvod (a, b: real; Var Vysledek: real); //Pro vypocet budou zadany velikosti strany a a b v realnych cislech. Vysledek bude v realnych cislech
   Procedure Ctverec_obsah (a: real; Var Vysledek: real); //Pro vypocet bude zadana velikost strany a v realnych cislech. Vysledek bude v realnych cislech
   Procedure Ctverec_obvod (a: real; Var Vysledek: real); //Pro vypocet bude zadana velikost strany a v realnych cislech. Vysledek bude v realnych cislech

{==================== Definice samotnych operaci s promennymi =================}
Implementation
   Procedure Kruh_obsah (r: real; Var Vysledek: real); //Obsah kruhu
      Begin
         Vysledek := (3.14 * ( r * r )); //Samotny vypocet
      End;

    Procedure Kruh_obvod (r: real; Var Vysledek: real); //Obvod kruhu
      Begin
         Vysledek := (2 * 3.14 * r); //Samotny vypocet
      End;

   Procedure Obdelnik_obsah(a, b: real; Var Vysledek: real); //Obsah obdelniku
      Begin
         Vysledek := (a * b); //Samotny vypocet
      End;

   Procedure Obdelnik_obvod(a, b: real; Var Vysledek: real); //Obvod obdelniku
      Begin
         Vysledek := ((a + b) * 2); //Samotny vypocet
      End;

   Procedure Ctverec_obsah(a: real; Var Vysledek: real); //Obsah ctverce
      Begin
         Vysledek := (a * a); //Samotny vypocet
      End;

   Procedure Ctverec_obvod(a: real; Var Vysledek: real); //Obvod ctverce
      Begin
         Vysledek := (4 * a); //Samotny vypocet
      End;
End.

Zdroj:

Program Vypocty;
Uses crt, Geom;

Var r, a, b, Vysledek, x: Real;

{==== Procedura Obsah kruhu ====}
Procedure ObsKr;
Begin
   WriteLn ('Vybrali jste volbu 1 - Obsah kruhu.');
   WriteLn ('Zadejte prosim polomer kruhu: ');
   ReadLn (r);
   Kruh_obsah (r, x);
   WriteLn ('Obsah kruhu s vami zadanym polomerem je: ', x);
End;

{==== Procedura Obvod kruhu ====}
Procedure ObvKr;
Begin
   WriteLn ('Vybrali jste volbu 2 - Obvod kruhu.');
   WriteLn ('Zadejte prosim polomer kruhu: ');
   ReadLn (r);
   Kruh_obvod (r, x);
   WriteLn ('Obvod kruhu s vami zadanym polomerem je: ', x);
End;

{==== Procedura Obsah obdelniku ====}
Procedure ObsOb;
Begin
   WriteLn ('Vybrali jste volbu 3 - Obsah obdelniku.');
   WriteLn ('Zadejte prosim delku strany a: ');
   ReadLn (a);
   WriteLn ('Zadejte prosim delku strany b: ');
   ReadLn (b);
   Obdelnik_obsah (a, b, x);
   WriteLn ('Obsah obdelniku s vami zadanymi stranami: ', x);
End;

{==== Procedura Obvod obdelniku ====}
Procedure ObvOb;
Begin
   WriteLn ('Vybrali jste volbu 4 - Obvod obdelniku.');
   WriteLn ('Zadejte prosim delku strany a: ');
   ReadLn (a);
   WriteLn ('Zadejte prosim delku strany b: ');
   ReadLn (b);
   Obdelnik_obvod (a, b, x);
   WriteLn ('Obvod obdelniku s vami zadanymi stranami: ', x);
End;

{==== Procedura Obsah ctverce ====}
Procedure ObsC;
Begin
   WriteLn ('Vybrali jste volbu 5 - Obsah cverce.');
   WriteLn ('Zadejte prosim delku strany a: ');
   ReadLn (a);
   Ctverec_obsah (a, x);
   WriteLn ('Obsah ctverce s vami zadanou stranou: ', x);
End;

{==== Procedura Obvod ctverce ====}
Procedure ObvC;
Begin
   WriteLn ('Vybrali jste volbu 6 - Obvod ctverce.');
   WriteLn ('Zadejte prosim delku strany a: ');
   ReadLn (a);
   Ctverec_obvod (a, x);
   WriteLn ('Obvod ctverce s vami zadanou stranou: ', x);
End;


Begin
   clrscr;
   WriteLn ('Vyberte si geometricky obrazec a operaci, ktera vas zajima:');
   WriteLn ('');
   WriteLn ('1 - Obsah kruhu');
   WriteLn ('2 - Obvod kruhu');
   WriteLn ('3 - Obsah obdelnika');
   WriteLn ('4 - Obvod obdelniku');
   WriteLn ('5 - Obsah ctverce');
   WriteLn ('6 - Obvod ctverce');
   WriteLn ('');
   WriteLn ('Zadejte prosim cislo vasi volby');
   ReadLn (x);

   If x = 1 Then ObsKr
   Else If x = 2 Then ObvKr
   Else If x = 3 Then ObsOb
   Else If x = 4 Then ObvOb
   Else If x = 5 Then ObsC
   Else If x = 6 Then ObvC;

   Writeln ('');
   Writeln ('Program ukoncete stisknutim klavesy Enter');
   ReadLn ();
End.
Nahlásit jako SPAM
IP: 178.72.244.–
Kit+15
Guru
29. 11. 2014   #12
-
0
-

#11 Gooo
To je divné. Kvůli tobě jsem si nainstaloval Pascal, abych zjistil, že program jde normálně přeložit a zdá se, že i funguje.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gooo0
Newbie
29. 11. 2014   #13
-
0
-

#12 Kit
V tom případě už nevím :o/. Zkouším to ve Free Pascal a v Dev-Pas. Oba mi vyhodí chybu na stejném místě. Problém by neměl být ani v tom, že bych se odkazoval na nějakou jinou knihovnu, protože jsem to včera dělal na jiném počítači a tam mi to vyhazovalo stejnou chybu. Asi mám problém v systému nějak.

Omlouvám se tedy, že jsem řešil a děkuji za rady

Nahlásit jako SPAM
IP: 178.72.244.–
Kit+15
Guru
29. 11. 2014   #14
-
0
-

#13 Gooo
Tohle fórum je určeno k řešení problémů, nemáš se zač omlouvat.

Stává se, že tazatel při přetahování zdrojáku do fóra nevědomky chybu opraví. Zkus si ty zdrojáky z fóra zkopírovat k sobě a znovu přeložit.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gooo0
Newbie
30. 11. 2014   #15
-
0
-

Tak jsem se včera naštval a zabalil to. Vypl PC a dnes jsem to zapl a aniž bych cokoli změnil, vážně to funguje. Takže asi nějaká záhada, ale na ty já jsem u sebe zvyklý, že to co všude funguje, u mě ne. Děkuji za rady. Cíl, že chci nějak pochopit funkci knihovny to snad díky tomu hledání chyby, byl snad tak nějak splněn :o).

Nahlásit jako SPAM
IP: 178.72.244.–
Kit+15
Guru
30. 11. 2014   #16
-
0
-

#15 Gooo
Možná v nějaké cache visela původní verze, kde jsi měl 3,14 místo 3.14

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Mircosoft+1
Věrný člen
2. 12. 2014   #17
-
0
-

Když to vezmu podle úvodního příspěvku: jednotku Geom máte v pořádku, jenom je pak špatně použitá. Má to být takhle:

Procedure ObsKr;
Begin
   WriteLn ('Vybrali jste volbu 1 - Obsah kruhu.');
   WriteLn ('Zadejte prosim polomer kruhu: ');
   ReadLn (r);
   WriteLn ('Obsah kruhu s vami zadanym polomerem je: ', kruh_obsah(r));
End;

Procedura se volá jako příkaz, funkce jako výraz - tedy něco, co ve výsledku dá nějakou hodnotu. Třeba zrovna to Pi - to je standardní předdefinovaná funkce, co vrací hodnotu čísla pí (definovat se už nikde nemusí, je přímo v základní jednotce System, kterou automaticky používá každý program).

Nahlásit jako SPAM
IP: 212.79.106.–
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, 2 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ý