turbo C vagy UNIX C ?

 ( Bali | 2003. augusztus 24., vasárnap - 17:46 )

turbo C vagy UNIX C ?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

hali, full kezdo vagyok ezert par alapkerdest szeretnek tisztazni.
nem ertem mi kulonbseg turbo es unix c kozott alapvetoen. aztan veszem csak eszre, hogy turbo c-ben tobb fuggveny alkalmazhato a tobb deklaracios file miatt...??
tovabba, ha en mcedit-ben irom a programcsokamat es olyan fuggvenyre van szuksegem, amit unix C nem tartalmaz alapbol, akkor ossze kell csipegetnem a megfelelo deklaracios fileokat es bevagni /usr/include -ba es ennyi? vagy hogy is van ez?
egyzseru pelda: ha en egy getch fuggvenyt akarok futtatni es ahhoz a conio.h dekfile kell, akkor csipegessek conio.h-t ahonnan tudok, vagy van vmi csomag ami ezeket tartalmazza?
biztos lamer kerdes, bocsesz, orommel varom a segitsegeket! :oops:

jo, azt mar latom, hogy ez kimondottan windozhoz van a conio.h, viszont olvastam, hogy getch megtalalhato curses.h-ban is, de akkor hibasan fordul le viszont...

/tmp/ccOHkIms.o(.text+0x7b): In function `main':
: undefined reference to `stdscr'
/tmp/ccOHkIms.o(.text+0x80): In function `main':
: undefined reference to `wgetch'
collect2: ld returned 1 exit status

coval akkor folteszem a kerdest ugy hogy a getch fugvenyt, milyen ANSII standardekkel lehet helyettesiteni?

#include <curses.h>

aztan ne felejtsd el hozzalinkelni libncursest.

--
vili

nem vagom :oops:
#include <curses.h> bent van termeszetesen

amugy kiegeszites keppen: azt szeretnem, ha a program addig ismetelne magat (do/while) amig nem nyomok le egy meghatarozott billentyut, erre lenne a getch, de se cursessel nem megy, se ha conio-nak adom meg a pontos helyet, meg amugyis jo lenne a ha multiplatform lenne, ugyhogy erre kene egy ANSI C standard megoldas
barmihez barmilyen infot zabalni tudnek 8O
thx

[quote:df673150bc="Bali"]
amugy kiegeszites keppen: azt szeretnem, ha a program addig ismetelne magat (do/while) amig nem nyomok le egy meghatarozott billentyut, erre lenne a getch, de se cursessel nem megy, se ha conio-nak adom meg a pontos helyet, meg amugyis jo lenne a ha multiplatform lenne, ugyhogy erre kene egy ANSI C standard megoldas
[/quote:df673150bc]
Ha standard megoldást akarsz, akkor felejtsd el a getch-t.
Akkor használj scanf()-t, az standard.
Ha meg a curses.h -t beinclude-olod, ne felejtsd el, hogy akkor a curses libet is hozzá kell linkelni. De ha meg curses-al akarsz programozni, akkor nem ártana némi felkészültség, és pl. tedd fel a libncurses5-dev csomagot, és nézd meg benne a programozói leírását, mielőtt bénázol vele...
Nagyon jó tutorialja van ne degradáljuk már le avval, hogy lámázunk vele...

Hi!

A kollega arra gondolt, hogy a linkernek meg kell adni, hogy honnan vegye a getch() fuggveny kodjat. A definicios allomany ugyanis csak a fuggveny deklaraciojat tartalmazza, a kod mar leforditott allapotban egy kulon object fileban van, amirol szolni kell a linkernek.

Valami ilyesmivel kell probalkoznod (gcc fordito eseten):

gcc <a te programod.c> -lncurses

A windows alatt hasznalatos conio.h allomany olyan fuggvenyek deklaraciojat is tartalmazza, amelyek nem hordozhatoak a kulonfele operacios rendszerek kozott, ezert fordulhat elo olyan, hogy bizonyos fuggvenyeket nem talalsz meg Linuxon. Pl. Emlekeim szerint nem lehet a kurzort sem tetszoleges xy koordinatara vinni (a conio-ban talan gotoxy() neven fut). Ilyenkor keresni kell olyan Linuxos konyvtarakat, amikben a megfelelo funkcionalitas benne van, de felo, hogy a kodod igy mar nem lesz hordozhato, ha nem figyelsz ra oda.

Gino

Hali [b:90325b9e89]balihb[/b:90325b9e89]!

Ha már találkoztál az alábbiakkal akkor bocs, de a kérdésedbõl azt érzem, hogy talán nem haszontalan:

A C nyelv összvissz csak pár utasítást tartalmaz, valamint az egész számokon tud különbözõ mûveleteket végezni. Alap utasítások pl.: for, while, goto, switch, if, return... Alap mûveletek pl.: +, -, =,..

Az összes többi mind elõre megírt függvények szubrutinok, amiket a különbözõ u.n. library-kban találhatsz. Tehát pl. a printf függvény a szó szoros értelemben nem a C nyelv része, hanem egy a C nyelv konvekcioi alapján használható "külsõ" függvény.
Ezeket a függvényeket a már elõbb említett library-k (könyvtárak) tartalmaz(hat)ják. Az természetesen, hogy milyen függvény van egy adott lib-ben, és hogy az pontosan hogy mûködik, természetesen környezet függõ. Mint már tapasztaltad, windows alatt más és másként mûködõ függvényeid vannak, mint Un*x alatt, sõt az egyik Unix is különözik a másiktól (hát még a GNU-tól :-)).

A gét (talán) legfontosabb könyvtár Un*x (és más C) alatt a standard és a math. A C fordítók úgy mûködnek, hogy ha olyan függényt, szubrutint találnak fordítás alatt, ami nincs a fordítandó programba, akkor a linker-re bízzák a hivatkozás feloldását. Ugyanis egy C (és általában más nyelveken írt programok) fordítás a következõ lépéseket tartalmazza:
1. A forrásból elkészül egy majdnem futtatható u.n. object-file. Itt már szinte minden lefordítódott gépi kódra, csak a fel nem oldott hivatkozások, meg a relocal-ások nincsenek meg.
2. Az obj-file-okból elkészül a futtatható program (ha csak egy obj file-od volt, C esetén akkor is össze kell fûzni a start.o-val :-)) Itt már minden hivatkozás feloldásra került, egyedül a reloca-lások vannak hátra.

No, ami hibát írtál az épp egy ilyen hivatkozás feloldási probléma volt. A fordító lefordította a forrásodat, viszont a link-er nem tudta feloldani a hivatkozást:
[quote:90325b9e89]/tmp/ccOHkIms.o(.text+0x7b): In function `main':
: undefined reference to `stdscr' [/quote:90325b9e89]

A [b:90325b9e89]/tmp/ccOHklms.o[/b:90325b9e89] az az object file, amit a gcc készített a forrásodból. A linker pedig azt mondja, hogy a 'main' függvényben lévõ 'stdscr'-re történõ hivatkozást nem tudja feloldani. Azaz az összefüzendõ object-fileokban nincs ilyen függvény (változó), valamint a megadott könyvtárakból sem tud elõbányászni ilyet. Ha nem adsz meg könyvtárt, akkor csak a stdlib-ben keres. Amúgy a könyvtárakban is tulajdonképpen az object file-ok vannak elhelyezve, amiket szükség szerint elõrángat (static link) a fordító, vagy futáskor meghív (dinamikus link) a program...

Programozástechnikailag ez mit jelent? Ha valamilyen függvényt akarsz használni, amit nem te írsz (emelsz át) a forrásba (vagy a függvény a hivatkozási pont UTÁN található), akkor a C fordítónak meg kell mondani a függvény paramétereit. Milyen argumentumai vannak, mit ad vissza. Ezt a függvény deklarálásával lehet megtenni. Mikor beraksz egy #include ... sort, akkor a forrás elõfeldolgozásakor a cpp beszúrja az adott 'header' file-t, ami a legtöbb esetben egy csomó függvény deklarációját tartalmazza. Ez után a fordító már tudja, hogy az adott függvénnyel mit kell csinálni, ha hivatkozol rá, azaz hogy kell meghívni, mi jön tõle vissza...
Ezzel persze, még magát a függvényt nem raktad a programod mellé, csak azt, hogy milyen az a bizonyos függvény. A függvény valamilyen lib-ben lakik. Azt, hogy a link-eléskor melyik lib-eket kutassa át a linker, külön meg kell adni a fordítás során. Ahogy [b:90325b9e89]gyu[/b:90325b9e89] írta ezt pl. a gcc-nél egy -lxxxx parancssori kapcsolóval teheted meg. Az stdlib-et nem kell megadni, mivel alapesetben ezt MINDIG átnézi a linker.

Összefoglalva: a #include <xxxx.h> nem elég, kell a hozzá való könyvtár is (-lxxxx), hacsak nem az stdlib-et használod (figyelem, egy könyvtárhoz több header file is tartozhat, pl. az stdlib.h és stdio.h is az stdlib könyvtár függvényeit deklarálja, csak egyik egyik részét, másik másik részét...)

Zsiráf

koszi mindenkinek a reszletes magyarazatot!!
vegul scanffel csinaltam meg, de ertem vegre hogy lehetett volna barmelyik masik getchet tartalmazo headerrel es objecttel is!

szaszg: meghogy haszontalan? :) nagyon kezdo vagyok, ugyhogy megvilagitottal szamomra par dolgot! thx
egyebkent en nem balihb vagyok, lattam o is C-vel (is) bajlodott.

Bali

[quote:cba50129da="szaszg"]
Az stdlib-et nem kell megadni, mivel alapesetben ezt MINDIG átnézi a linker.

Összefoglalva: a #include <xxxx.h> nem elég, kell a hozzá való könyvtár is (-lxxxx), hacsak nem az stdlib-et használod (figyelem, egy könyvtárhoz több header file is tartozhat, pl. az stdlib.h és stdio.h is az stdlib könyvtár függvényeit deklarálja, csak egyik egyik részét, másik másik részét...)

Zsiráf[/quote:cba50129da]
Egy apró kiegészítés: Az már akár disztrótól, meg fordítótól, csillagok állásától meg mindentől függ, hogy mit néz át alapban libet. Pl. a g++ az a libm-et is hozzászerkeszti, csakúgy, mint pl. a RedHat-os gcc.
Ugyanúgy pl. anno szívtunk ilyennel, hogy kernel modult akartunk forgatni, és RedHat-on lefordult jól, Debian-on meg az elkészült .o -ra állandóan undefined symbol-ok lettek, csak azért, mert a redhaton vmilyen optimákolás defaultban be volt kapcsolva, és Debianon meg nem. Ha egy -O2 -t is mondtunk, akkor a Debianon is jó lett :-)
Ezek még szabályozhatók a /usr/lib/gcc-lib/<architektúrád>-linux/<gccverziója>/specs nevű fájlban, pl. /usr/lib/gcc-lib/i386-linux/2.95.4/specs

Bár belenéztem én is ebbe a specs fájlba, és nem látom rajta, hogy a g++ miért is linkeli hozzá a -lc -n felül a -lm -et is.
Írtam most gyorsan egy mezei kis programot ami kiírja 2.0*asin(1.0) értékét, de gcc -re, plusz paraméter nélkül (jogosan) panaszkodik, hogy nem tudja meglinkelni, míg ugyanezt a forrást a g++ lefordítja, és szépen ki is írja ezt a mindenki által oly jól ismert számot :-)

te gyu! :D

mitol lenne inkabb standard a scanf() mint a getch()?

amugy en soha nem hasznalom a scanf()-et, rengeteg hibalehetoseg van,
inkabb egy fgets(), es utana parse-olom az inputot ;D

http://docs.linux.cz/c-faq_comp.lang.c/q12.20.html

--
vili

[quote:92528d93cb="Anonymous"]
mitol lenne inkabb standard a scanf() mint a getch()?

amugy en soha nem hasznalom a scanf()-et, rengeteg hibalehetoseg van,
inkabb egy fgets(), es utana parse-olom az inputot ;D
[/quote:92528d93cb]
A scanf() annyival standardabb a getch()-nál, hogy a scanf() az minden standard libc-ben van, akármilyen ANSI-t betartó C implementáció, a saját libc-jében biztosít ilyet, míg a getch()-t, azt a turbo pascal az ncurses hiánya miatt adja, a butább conio()-ban, vagy unicsokon a curses lib-ben találsz getch()-t, de az már nem a standard függvények része.

Egyébként nekem is eszembe jutott, hogy ha nem akarsz sokat ****kodni a scanf() paraméterezésével, akkor javaslom az fgets()-et, az az adott feladatra egyszerűbb, csak nem akartalak vele megkavarni :-)

Hali!!!

Izé :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: ezer bocsánat....

ezer ezer ezer (ezerhuszonnégy) bocsánat...

:oops: :oops: :oops: :oops: :oops: :oops: :oops:
:oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops:
:oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops:
:oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops:

Zsiráf

Ui.: Ne haragudj...