Welcome, Guest. Please login or register.


Author Topic: C programozás (Aztec C / Hisoft C) (Read 13201 times)

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
C programozás (Aztec C / Hisoft C)
« on: 2015.December.20. 08:55:41 »
Tud segíteni valaki C-ben?
Most ismerkedek vele mérsékelt sikerrel....

Két kérdésem lennem első körben az alábbi két programmal kapcsolatban: miért nem adnak helyes eredményt?
Az első egy sima gyökvonás:

main()
{
  int c;
  c=2;
  printf("%f",sqrt((double)c));
}

a második az adott implementáció szóhosszúságát adná meg:

wordlength()
{
  int i;
  unsigned v=~0;
  for(i=1; (v=v>>1)>0; i++) ;
  return(i);
}

main()
{
  printf("%d\n",wordlength);
}

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #1 on: 2015.December.20. 09:39:08 »
Ez működik PC-n GCC-vel fordítva, EP-s fordítót nem próbáltam (az include hiánya probléma lehetett, implicit deklarációval a visszatérési érték típusa int):
Code: C
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void)
  4. {
  5.   int c;
  6.   c=2;
  7.   printf("%f\n",sqrt((double)c));
  8.   return 0;
  9. }

A második program javítva (a wordlength helyett wordlength(), az előbbi a függvény címe):

Code: C
  1. #include <stdio.h>
  2. int wordlength(void)
  3. {
  4.   int i;
  5.   unsigned v=~0;
  6.   for(i=1; (v=v>>1)>0; i++) ;
  7.   return(i);
  8. }
  9.  
  10. int main(void)
  11. {
  12.   printf("%d\n",wordlength());
  13.   return 0;
  14. }
« Last Edit: 2015.December.20. 09:50:25 by IstvanV »

Offline Mayer Gábor

  • EP fan
  • *
  • Posts: 216
  • Country: hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #2 on: 2015.December.20. 10:30:45 »
Ilyet még talán nem is láttam, hogy unsigned magában. Ez ilyenkor unsigned int lesz ugye?

Nekem az lenne a kérdésem, bár lehet, hogy ep-t nem érinti, miért kell linuxon de lehet, hogy máshol is hozzá linkelni az alábbiakat a programhoz:

crt1.o
crti.o
crtbegin.o
crtend.o
crtn.o

Melyik micsoda és honnan jönnek ezek? Úgy értem a linuxnak muszáj vagy ez a gcc működéséből fakad és lehet, hogy más fordító nem tenné ezeket oda?


Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #3 on: 2015.December.20. 10:48:06 »
Ilyet még talán nem is láttam, hogy unsigned magában. Ez ilyenkor unsigned int lesz ugye?

Igen.

Quote
Melyik micsoda és honnan jönnek ezek? Úgy értem a linuxnak muszáj vagy ez a gcc működéséből fakad és lehet, hogy más fordító nem tenné ezeket oda?

A GCC automatikusan linkeli ezeket, ezért a fordításhoz elég az alábbi parancsokat használni:

gcc -Wall -O2 sqrt.c -o sqrt -lm
gcc -Wall -O2 wrdlngth.c -o wrdlngth

Ugyanez működik például az itt található Windows-os fordítóval is. HISOFT C-vel egyelőre nem sikerült lefordítani. :oops:

Offline Mayer Gábor

  • EP fan
  • *
  • Posts: 216
  • Country: hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #4 on: 2015.December.20. 10:57:53 »
Ha tudjátok hogy mit csinálnak ezek az objectek az érdekelne.

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #5 on: 2015.December.20. 11:05:52 »
Ep-n két használható fordítót találtam (kint vannak nálam):

Hisoft-C 1.33 : egyszerű, gyors fordító, de nem ismeri sem a float, sem a double tpust(!) Csak egész számokkal dolgozik... :( Nem egészen világos, mi a különbség a .H és a .LIB kiterjesztésű file között?

Aztec-C: ez macerásabb, 3-lépésben (!) kell fordítani (BAT-ot célszerű hozzá csinálni...). Itt az utolsó lépésben kell hozzálinkelni a programhoz az M.LIB (matematikai könyvtár) - ha lebegőpontos számokat is használunk, és a C.LIB-et. Ezért nincs a gyökvonásos programban include. A program hibamentesen lefordul, futtatásor mégis hibás eredményt ad.
Ezt a letölthető csomagot átnézné valaki, melyik file micsoda? :oops:
« Last Edit: 2015.December.20. 11:32:28 by Lacika »

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #6 on: 2015.December.20. 11:06:32 »
Ha tudjátok hogy mit csinálnak ezek az objectek az érdekelne.

Engem is. Bár én Ep-specifikus nézőpontból közelítek a kérdéshez. :ds_icon_cheesygrin:

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #7 on: 2015.December.20. 11:08:26 »
Ilyet még talán nem is láttam, hogy unsigned magában. Ez ilyenkor unsigned int lesz ugye?

Itt már tartok. Erről konkrétan van említés itt.
Még kezdeti stádiumban van. Bármilyen észrevételt szívesen fogadok!

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1291
  • Country: hu
  • Stray cat from Commodore alley
Re: C programozás (Aztec C / Hisoft C)
« Reply #8 on: 2015.December.20. 12:48:43 »
Ilyet még talán nem is láttam, hogy unsigned magában. Ez ilyenkor unsigned int lesz ugye?

Nekem az lenne a kérdésem, bár lehet, hogy ep-t nem érinti, miért kell linuxon de lehet, hogy máshol is hozzá linkelni az alábbiakat a programhoz:

crt1.o
crti.o
crtbegin.o
crtend.o
crtn.o

Melyik micsoda és honnan jönnek ezek? Úgy értem a linuxnak muszáj vagy ez a gcc működéséből fakad és lehet, hogy más fordító nem tenné ezeket oda?
Keress leírásokat a C Runtime Library (magyarul C futásidejű könyvtár - talán) témakörben. Ezek alapvető szolgáltatásokat biztosítanak, ami lehetővé teszi a programnak az operációs rendszeren futtatását.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #9 on: 2015.December.21. 14:42:13 »
PC-ről Z80-ra fordító programokkal is lehet próbálkozni, ha érdekel valakit ez a téma. A z88dk támogatja az EP-t és az EXOS 5-ös fejlécű formátumát (egy kisebb bug javítása után), ezért viszonylag egyszerű a használata. Az SDCC nehézkesebb, és úgy látszik, az EP támogatást külön meg kell valósítani hozzá, de jobb minőségű Z80 kódot generál, mint a z88dk.

Egy minimális példa program SDCC-vel fordítva:
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

sdcc -mz80 --code-loc 0x0180 --data-loc 0x4000 --stack-loc 0xf800 test.c
ihx2ep test.ihx loader.bin test.com


Az EP-s betöltő készítéséhez használt forráskódok:
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #10 on: 2015.December.21. 20:00:18 »
Továbbfejlesztett loader.s, amely megnyit egy EDITOR: csatornát 40x24 karakteres szöveges módban, és megvalósítja a karakter kiírást (így már működik a printf()):

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

1 és 10 közötti egészek négyzetgyökének a kiírása (az SDCC-s printf() nem támogatja a float típust, így ehhez külön rutint kellett írni):

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

gcc -Wall -O2 ihx2ep.c -o ihx2ep
sjasm loader.s loader.bin

sdcc -mz80 --code-loc 0x0200 --data-loc 0x4000 --stack-loc 0xf800 sqrt.c
ihx2ep sqrt.ihx loader.bin sqrt.com

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14723
  • Country: hu
    • http://enterprise.iko.hu/
Re: C programozás (Aztec C / Hisoft C)
« Reply #11 on: 2015.December.21. 22:01:45 »
Na most lehet, hogy nagy hülyeséget kérdezek :oops:
Ezek a modern PC-s Z80 C-k tudnak kezelni többet mint 64K?

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #12 on: 2015.December.21. 22:08:54 »
Na most lehet, hogy nagy hülyeséget kérdezek :oops:
Ezek a modern PC-s Z80 C-k tudnak kezelni többet mint 64K?

Mivel az EP-t csak korlátozottan támogatják, valószínűleg nem tudnak automatikusan lefoglalni és lapozni több memóriát. Ezt a programnak kellene megoldania asm rutinok beépítésével.

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14723
  • Country: hu
    • http://enterprise.iko.hu/
Re: C programozás (Aztec C / Hisoft C)
« Reply #13 on: 2015.December.21. 22:53:25 »
Ez nyilvánvaló :-) De úgy általában tudnak-e Z80-on lapozva sok memóriát kezelni? Amihez nyilván kellene a megfelelő szabványosan hívható assembly rutinokat elkészíteni.
Ahogy pl a printf-nek is előkészítetted a terepet.
De ha megvannak a lapozó rutinok, onnantól el lehetne feledni a 64K korlátot? Itt van pl Endi editorának az esete, ahol BASIC-ben elérte az egyszerre kezelhető memória határát, ez egy ilyen modern C-vel elkerülhető lenne?

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: C programozás (Aztec C / Hisoft C)
« Reply #14 on: 2015.December.21. 23:09:03 »
Az a baj, hogy a C filozofiajaban, ha mindent ki akarsz hasznalni akkor alapvetoen a mutato (pointer) fogalma fog betegeskedni. Marmint, egy 16 bites ertek mint pointer problema. Am, ha 64K-t tul akarod lepni akkor kellene olyan pointer, ahol mondjuk szegmensszam stb van. Ehhez viszont ugye lapozgatas stb kell allandoan, nem tul hatekony. Ugyan C-vel en inkabb mar "flat cimzesu" rendszereken talalkoztam mar (ahol ez nem problema), remlik, hogy meg DOS-os idokben is volt C compiler ahol emiatt kulonbozo tipusu mutatok is voltak, am ez mas kerdeseket is felvethet. Szerintem inkabb azt kene megvizsgalni, hogy valoban szukseg van-e arra, hogy minden mukodjon 64K-s hatart attorve, vagy elfogadhato, ha adott esetben platform specifikus dolgok vannak, akar pl ugy, hogy a megfelelo C fuggvenynek valo entitassal az ember lapozgat, mintha asm lenne a dolog. Nem tul szep, az igaz. Am a telejesen generic implementaciohoz az kene, hogy maga a core compiler (sdcc) tudjon errol (nem tudom ez mennyire lenne bonyolult), az mar nem csak annyi, hogy irunk loader-t meg miegymast hozza, amit ugye egy masik topic-ban regebben en is csinalgattam egy darabig (csak eppen akkoriban volt egy kis gond az sdcc-vel ami nagyon elvette a kedvemet tole, le is adtam nekik hibara).