turbo C vagy UNIX C ?

Fórumok

turbo C vagy UNIX C ?

Hozzászólások

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

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 balihb!

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:

/tmp/ccOHkIms.o(.text+0x7b): In function `main':
: undefined reference to `stdscr'

A /tmp/ccOHklms.o 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 gyu í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

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

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...