horukk Posted September 6, 2005 Posted September 6, 2005 Lex, ha nem nagy meló, nem csinálnád meg az egyik föggvényemmel a példa kedvéért? Elküldöm a forrást, ha kell. Azért kérem ilyen szájbarágósan, mert nem készítettem még moduláris programot, fogalmam sincs hogy álljak neki. Annyit tudok, hogy csak egy main() fv. lehet benne.
Lex Posted September 7, 2005 Posted September 7, 2005 Az eredeti verzió: ---- Saját.c void my_strcpy(char * ide, char* ezt) { for (int i=0; ide=ezt; i++); } ====================== A header file-os verzió: -------- Saját.c #include "fvtár.h" int main(void) { char alma[]="12345"; my_strcpy(alma, "korte"); return 0; } ---------- fvtár.h void my_strcpy(char * ide, char* ezt); ---------- fvtár.c #include "fvtár.h" void my_strcpy(char * ide, char* ezt) { for (int i=0; ide=ezt; i++); } ================= A linkelést neked kell beállítani, A MinGW Developer Studio-t nem ismerem, annak idején Dev C++-szal dolgoztam, amiben Mingw fordító volt. A lényeg, hogy a saját és fvtár is a projektedhez legyen rakva, ha projektekkel dolgozik a Mingw. Egy Developer Studio elnevezésbõl ennyi minimum dukál.
csutomi Posted September 7, 2005 Author Posted September 7, 2005 @horukk: Próbáld meg úgy elképzelni az #include "fajlnev.h"-t, hogy ugyanazt csinálja, mintha te a .c programodba ehelyett a sor helyett copy-paste-tel egyszerûen bemásoltad volna a falnev.h tartalmát. Ja, egyébként az #include "valami" és #include <valami> között az a különbség, hogy az elõbbinél a fordító a saját könyvtáradban keresi a fájlt, az utóbbinál pedig az include könyvtárban, ahol a többi is (pl: stdio.h) van.
horukk Posted September 7, 2005 Posted September 7, 2005 Kösz a segítségeket. Próbálok összehozni belõlük valamit. Másik kérdés: printf()-el nem tudok ékezetes betûket írni, de fprinf()-el igen. A fordító miatt lehet vagy a c nem tud ékezetet kezelni? Következõ: itt ez a végtelen ciklus. for(i=1;i<=35;i++){ printf("\n\t%2d",i); if(i==35){ i=0; } } Hogyan lehetne véget vetni neki billentyû lenyomásra? (pörögjön a számsor, majd mondjuk space lenyomására írja ki i értékét) Ha beleépítem a getch() fv.-t, úgy nem jó. Szerintem modulárisan lehetne csak megcsinálni.
horukk Posted September 7, 2005 Posted September 7, 2005 Tökéletesen mûködik a saját header fájl a project könyvtárból és a standard lib-bõl is. Annyiban módosítottam Lex helpjét, hogy fvtár.c-t nem használtam, hanem fvtár.h-ban van a fv.törzs is. Persze az eredeti help is tökéletesen mûködik. csutomi elõbbi hozzászólását azzal egészíteném ki, hogy #include"" esetén a saját könyvtárban és a standard lib-ben egyaránt keresi a fájlt, míg #include<> esetén csak a std lib-ben.
csutomi Posted September 7, 2005 Author Posted September 7, 2005 #include"" esetén a saját könyvtárban és a standard lib-ben egyaránt keresi a fájlt Igen, ez tökéletesen igaz, köszi a helyesbítést. Az ékezetes betûk a Windows miatt vannak. Linux vagy DOS alatt tökéletesen mûködnek. Próbáld meg egy DOS-os szövegszerkesztõvel beírni az ékezeteket. (pl: a dos parancssorba írd be, hogy edit, aztán töltsd be a fájlodat szerekeszd át és mentsd el) Így mûködni fog. Használj egy másik függvényt: int kbhit (void); Ha nincs billentyû leütés, akor nulla a visszatérési értéke. A conio.h-ban van benne, remélem olyanod van. A ciklusból való kilépéshez pedig a break; kifejezést. Egy tipp: A programkód idézéséhez használd a CODE gombot, így könnyebben el tudjuk olvasni a mûvedet.
Lex Posted September 7, 2005 Posted September 7, 2005 Ciklusváltozót a cikluson belül nem célszerû módosítani, mert késõbb hibákhoz vezethet. Ha végtelen ciklust akarsz, akkor a for 3. részét (i++) hagyd el, és akkor nem növeli i értékét. Mivel itt szükséged van i növelésére, ezért a for ciklus köré még egy ciklust (for, do, while) kell illeszteni, vagy i-t nem ciklus változóként használni, hanem sima változóként, amit egy billentyûzet vizsgáló ciklusba (lásd csutomi hsz-át) raksz és növelsz, ill. vizsgálsz. Az ékezetekhez. Gondolom, a Mingw mellett nem akarsz DOS-os szerkesztõt használni. Szerintem a szerkesztõdben be lehet állítani, hogy milyen kódlappal kezelje a szövegeidet. Attól függõen, hogy XP v. 98 parancssort használsz, ezt magyar Windows-ra kell állítani (1250) vagy 852-es DOS-ra. Ha ez sem segít, akkor a Win32 API-ban vannak konvertáló függvények (AnsiTo...ToAnsi). Nem tudom, van-e könyved C-rõl. Ha nincs célszerû beszerezni, mert alaposabb és jobb felépítésû ismereteket szerezhetsz belõle, mint a netrõl. Sima C (nem C++) alapmû a Brian W. Kernighan, Dennis M. Ritchie: A C programozási nyelv. Elég érthetõen és nem túl hosszan magyarázzák el a lényeget. Õk találták ki a C-t tehát elég kompetensek a témában.
arpsoft Posted September 7, 2005 Posted September 7, 2005 #include <conio.h> int i=0; void main(void) { while(!kbhit()) if(++i>35)i=0; printf("\n%2d\n",i); } Ez igazán C-ül van. A while addig fut, ameddig nem ütsz le egy bilentyût. A ciklusban egy if van, ami elõször megnöveli az i változó értékét, aztán összehasonlítja a 35-tel, ha nagyobb, akkor nullázza.
payskin Posted September 7, 2005 Posted September 7, 2005 Elég érthetõen és nem túl hosszan magyarázzák el a lényeget. Õk találták ki a C-t tehát elég kompetensek a témában. Hát, aki abból a könyvbõl megtanulja a C-t, megemelem a kalapom elõtte. Tudom, hogy az a Biblia a C programozók számára, és 15 éve ahányszor találkozom, mindig olvasgatok belõle, csak az a baj, hogy egy könyvnek nem lehet kérdéseket feltenni, a példák meg ANSI C-ben vannak, ami nem biztos, hogy lefordul azon a compileren, ami épp a kezed ügyében van. A könyv nyelvezete sem könnyíti meg a dolgot, elég gyorsan el lehet hagyni a fonalat. De ha van valaki, vagy egy Segélyvonal fórum, ahonnan választ kaphatsz a kérdéseidre, úgy egészen más.
arpsoft Posted September 7, 2005 Posted September 7, 2005 Én még nem láttam olyan compilert, amin az ANSI C ne fordult volna le.
horukk Posted September 7, 2005 Posted September 7, 2005 Köszönöm. int kbhit (void) fv.-nyel megtudtam csinálni. Az ékezeteket nem tudtam beállítani a MinGw-ben, de az legyen a legnagyobb bajom. Könyvem csak elektronikus formában van néhány, köztük az említett is megvan. De azokból nem kaptam választ ezekre a kérdésekre. Ez a fórum hatékonyabb Ha lesz kérdés, jövök még!
Lex Posted September 7, 2005 Posted September 7, 2005 @Balázs: Jössz nekem egy kalapemeléssel. Egy könyvnek valóban nem lehet kérdéseket feltenni, de ahhoz, hogy kérdezni tudj, szükségesek az alapok. A K&R könyv szerintem nem bonyolult. Igaz nem lehet olyan szaporán olvasni, mint a Nagy indiánkönyvet. A könyv sok kérdést tisztába tesz és megérthetõ belõle sok összefüggés. És jó példák vannak benne. Én se láttam még olyan fordítót, ami ne ismerte volna az ANSI C-t. Most nem a C++-ról beszélünk, aminek ANSI megvalósítását valóban nem sikerült tökéletesen megcsinálniuk a fejlesztõknek. A C++ sokkal elvontabb. A C elég egzakt, így könnyebb programozni.
horukk Posted September 7, 2005 Posted September 7, 2005 Lett kérdés. Mégpedig ez: fájlból milyen fv.-nyel lehet stringeket kiolvasni? Konkrétabban: fájlba kiírattam a különbözõ tipusú változók tartalmát (karaktertömbök és sima int változók). A fájlban ezek szóközzel vagy tabulátorral vannak elkülönítve egymástól. Több sorba kerültek. Vissza szeretném nyerni õket változókba az eredeti típusok szerint.
payskin Posted September 8, 2005 Posted September 8, 2005 @Balázs: Jössz nekem egy kalapemeléssel. Egy könyvnek valóban nem lehet kérdéseket feltenni, de ahhoz, hogy kérdezni tudj, szükségesek az alapok. Nincs kalapemelõs smiley-nk, kapsz helyette bravót. Tény, amikor nekem 90-ben ebbõl kellett volna megtanulnom C-ül, csak a C64-es BASIC és assembly volt a fejemben, és ez kevés volt ahhoz, hogy megértsem. Ráadásul senki nem volt, aki elmagyarázta volna, és a példaprogramok nem futottak az akkori Turbo C alatt. (ANSI nem ANSI, nem futott). Elég gyorsan feladtam. Aztán késõbb, amikor már belém vertek egy kis programozói szemléletet, és volt mögöttem néhány év tapasztalat, újra találkoztunk, de akkor sem lettünk barátok. Most az az érdekes szituáció állt elõ, hogy évente egyszer összefutunk: decemberben mikor kimegyek egy hétvégére az Bécsországban élõ barátokhoz, a vendégszobában fent van a polcon. Ezt szoktam olvasgatni elalvás elõtt. És még most is az az érzésem, hogy a 10. oldal után minden mondatot kétszer-háromszor el kell olvasnom ahhoz, hogy biztos legyek benne, értem, amit olvasok. Hát ilyen baráti viszonyt ápolok Kernighan és Ritchie urakkal. Elnézést kérek, ezért a kis intermezzóért.
arpsoft Posted September 8, 2005 Posted September 8, 2005 Lett kérdés. Mégpedig ez: fájlból milyen fv.-nyel lehet stringeket kiolvasni? Konkrétabban: fájlba kiírattam a különbözõ tipusú változók tartalmát (karaktertömbök és sima int változók). A fájlban ezek szóközzel vagy tabulátorral vannak elkülönítve egymástól. Több sorba kerültek. Vissza szeretném nyerni õket változókba az eredeti típusok szerint. Kéne a kód, amivel kiraktad a fájlba az adatokat.
csutomi Posted September 8, 2005 Author Posted September 8, 2005 @horukk: Gondolom, az fprintf megfelelõjét keresed. Én így csinálnám a visszaolvasást: fájlnév: FAJLOM.DAT tartalma: Ez az én 1 fájlom. ------------------------------- fájlnév: beolvas.c tartalma: #include <stdio.h> int main (void) { char ez[3], az[3], en[3], fajlom[7]; int egy; FILE *f; f = fopen("FAJLOM.DAT", "rt"); fscanf(f, "%s%s%s%d%s", ez, az ,en, &egy, fajlom); fclose(f); return 0; } (Nem kezeltük itt azt az esetet, amikor nem lehet megnyitni a fájlt.) Ezt már tudod általánosítani. Például többsoros fájlra. @Spányik Balázs: Nem vagy egyedül a könyvvel kapcsolatban. Szerintem sem földi halandóknak való, inkább olyan matematikus féléknek.
Lex Posted September 8, 2005 Posted September 8, 2005 Mostanában így lestrapálva én sem ilyesmit olvasok esténként. De délelõtt, frissen, lehet használni. Ez a könyv volt a C "tankönyvünk" a fõiskolán úgy 15 éve. Mivel akkor más nem volt, örültünk ennek is. Én Turbo C-ben írtam a szakdolgozatomat és mennek rajta a példák, legfeljebb beállítási gondok lehettek nálad. De - gondolom - így 15 év távlatából, ez már édes mindegy. Bocs az -ért!
horukk Posted September 8, 2005 Posted September 8, 2005 Köszi csutomi, ez alapján szerintem menni fog. arpsoft, íme a kód: #include<stdio.h> #include<conio.h> #include<string.h> #define SIZE 6 FILE *fp; struct utaslista{ char jarat_sz[9]; char datum[7]; char nev[33]; int km; int jelleg; }; struct utaslista utazas[SIZE]; struct utaslista* m_utazas; int beker(); int kiirat(); int beker(){ //utaslisra feltoltese. int i; m_utazas=utazas; for(i=0;i<SIZE;i++){ printf("\nKerem a jarat szamat: "); scanf("%s",(m_utazas+i)->jarat_sz); printf("\nKerem az utazas datumat (pl:050903): "); scanf("%s",(m_utazas+i)->datum); printf("\nKerem az utas nevet: "); scanf("%s",(m_utazas+i)->nev); printf("\nKerem az ut hosszat: "); scanf("%d",&(m_utazas+i)->km); printf("\nKerem az utazas jelleget (szolgalati=1, egyeni=2): "); scanf("%d",&(m_utazas+i)->jelleg); } return 1; } int kiirat(){ //utaslista kiirasa. int i; for(i=0;i<SIZE;i++){ printf("\n\t%8s\t%6s\t%12s\t%5d\t%2d",utazas[i].jarat_sz,utazas[i].datum,utazas[i].nev,utazas[i].km,utazas[i].jelleg); } fp=fopen("UTAZAS.DAT","wt"); fprintf(fp,"\n\t Jarat\t Datum\t Nev\t Km\tJelleg"); fprintf(fp,"\n\t--------------------------------------------------------"); for(i=0;i<SIZE;i++){ //utaslista UTAZAS.DAT fajlba irasa. fprintf(fp,"\n\t%8s\t%6s\t%12s\t%5d\t%2d",utazas[i].jarat_sz,utazas[i].datum,utazas[i].nev,utazas[i].km,utazas[i].jelleg); } fclose(fp); return 1; } int kiolvas(){ char c; char t[500]; int i=0; m_utazas=utazas; fp=fopen("UTAZAS.DAT","rt"); while (c != ' '){ c = fgetc (fp); t[i]=c; i++; } fclose (fp); printf("\n\n Az on altal beirt mondat %d karakterbol all.",strlen(t)); return 0; } int main(){ /* beker(); printf("\n\t Jarat\t Datum\t Nev\t Km\tJelleg"); printf("\n\t--------------------------------------------------------"); kiirat();*/ kiolvas(); getch(); return 0; } Benne pillanatnyilag a kiolvasás függvény aktív csak.
arpsoft Posted September 8, 2005 Posted September 8, 2005 Nos, mivel az fprintf-ben space helyett tab-ot használtál, ezért az fscanf nem fogja tudni olyan egyszerûen beolvasni a dolgokat. Ott is formázottan kell majd beolvasni! char cTab; . . . fscanf(%c%8s%c%6s%c%12s%c%5d%c%2d",&cTab,&utazas[i].jarat_sz,&cTab,&utazas[i].datum,&cTab,&utazas[i].nev,&cTab,&utazas[i].km,&cTab,&utazas[i].jelleg,myfile); . . .
horukk Posted September 8, 2005 Posted September 8, 2005 A segítségekkel be tudtam olvasni az adatokat fájlból. Köszi. Ez a kód: for(i=0;i<SIZE;i++){ fscanf(fp,"%s%s%s%d%d",(m_utazas+i)->jarat_sz,(m_utazas+i)->datum,(m_utazas+i)->nev,&(m_utazas+i)->km,&(m_utazas+i)->jelleg); } Most azt nem sikerül megoldani, hogy pozicionáljam a beolvasás kezdetét. Pl: ki szeretnék hagyni 2 sort és csak utána olvastatnám be az adatokat. Ha nem unjátok még, akkor ehhez is kérnék helpet.
arpsoft Posted September 8, 2005 Posted September 8, 2005 És ez mûködik? Így, ahogy ide leírtad? Milyen fordítóval dolgozol? Ha ki akarsz hagyni sorokat, akkor az fgets(char *s) függvénnyel olvastasd be õket egy tetszõleges string változóba. Ha csak bájtokat akarsz kihagyni, akkor fseek(FILE *f,long lWhence,int iOffset) a megoldás. Az f fájl aktuális olvasási pozícióját átállítja lWhence bájttal az iOffset-tõl, ami lehet SEEK_SET (eleje), SEEK_END (vége) és SEEK_CUR (a jelenlegihez képest).
csutomi Posted September 8, 2005 Author Posted September 8, 2005 És ez mûködik? Így, ahogy ide leírtad? @arpsoft: Gondolom, neked is ezzel a szerkezettel van a problémád: (proba+2)->x Ha nem, akkor bocs. Szerintem ezt inkább így használják gyakrabban: proba[2].x Azért, mert a proba->x nem más, mint (*proba).x, amibõl következik, hogy (proba+2)->x = (*(proba+2)).x = proba[2].x Legalábbis szerintem. Ennek alapján jó, amit horukk írt.
horukk Posted September 8, 2005 Posted September 8, 2005 arpsoft, a MinGW fordítóját használom. Úgy is mûködik, meg így is: for(i=0;i<SIZE;i++){ fscanf(fp,"%s%s%s%d%d",utazas[i].jarat_sz,utazas[i].datum,utazas[i].nev,&utazas[i].km,&utazas[i].jelleg); } csutomi jól következtetett. A sorkihagyást arpsoft helpje alapján így oldottam meg: char string[100]; int i=0; while(i<3){ fgets (string , 100 , fp); //puts (string); i++; } Így a negyedik sorra pozicionál, onnét folytatja az olvasást. Köszönöm.
arpsoft Posted September 9, 2005 Posted September 9, 2005 Nem, nekem azzal volt problémám, hogy nem figyeltem meg kellõ képpen az adatszerkezetet, ezért & jeleket hiányoltam. De rájöttem, hogy ahol hiányzik az &, azok stringek, tehát nem is kell. A pointer eltolással nem volt gondom, az teljesen világos volt.
horukk Posted September 10, 2005 Posted September 10, 2005 Az alábbi struktúra tömb másolás nem történik meg. Csak az elsõ betû másolódik át helyesen. *utas[i].neve=*utazas[i].nev; printf("\n%s",utas[i].neve); Mitõl lehet?
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now