Fontos linkek a C-ről:
Prog.hu-s cikkek
Prog.hu-s tudástár témák
The C Library Reference Guide
Standard C
Wikipedia
C Tutorial
Programming in C
Bevezetés a C programozási nyelvbe
Gyorskeresés
Legfrissebb anyagok
- Bemutató Spyra: akkus, nagynyomású, automata vízipuska
- Bemutató Route 66 Chicagotól Los Angelesig 2. rész
- Helyszíni riport Alfa Giulia Q-val a Balaton Park Circiut-en
- Bemutató A használt VGA piac kincsei - Július I
- Bemutató Bakancslista: Route 66 Chicagotól Los Angelesig
Általános témák
LOGOUT.hu témák
- [Re:] [Sub-ZeRo:] Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- [Re:] [plevips:] Építkezünk 3. rész (2024)
- [Re:] [bb0t:] Gyilkos szénhidrátok, avagy hogyan fogytam önsanyargatás nélkül 16 kg-ot
- [Re:] [gban:] Ingyen kellene, de tegnapra
- [Re:] [Luck Dragon:] Asszociációs játék. :)
- [Re:] [sziku69:] Fűzzük össze a szavakat :)
- [Re:] [btz:] Internet fejlesztés országosan!
- [Re:] [sziku69:] Szólánc.
- [Re:] [Luck Dragon:] MárkaLánc
- [Re:] [antikomcsi:] Való Világ: A piszkos 12 - VV12 - Való Világ 12
Szakmai témák
PROHARDVER! témák
Mobilarena témák
IT café témák
Téma összefoglaló
- Utoljára frissítve: 2014-04-25 14:12:00
LOGOUT.hu
Hozzászólások
ArchElf
addikt
Ha tényleg az optimalizáció vágta ki, akkor a fordítónak kutya kötelessége minél gyorsabb és rövidebb kód gyártása (ha úgy állítottad be) - a nem kívánt kódrészeket meg ugye a fordító nyugodtan "kioptimalizálhatja" a kódból...
Próbáld meg úgy fordítani, hogy a kódban kezdesz is valamit a tömbök adataival...
AE
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
kispx
addikt
De akkor miért nullázza ki az egyiket és miért nem a másikat? Főleg, hogy ha a két változódeklarálást felcserélem akkor pont a másikat nem nullázza ki, azaz mindig a második tömb az inicializálatlan.
(Megjegyzem a MinGW ritkán fent nálam, most is csak azért mert beadandót kell készíteni, szóval nem ismerem ezt a fordítót)
Egyébként ott a pont
hruodnand
senior tag
Csak, azt nem értem, hogy használom, mert ha debugoltok, akkor az u3-as tömbbel dolgozik a program. Szóval 0-val kellene dolgoznia.
Jester01
veterán
Mondjuk azért mert egyiket sem nullázza ki, csak a memória egy része véletlen pont nulla. Attól függően melyik tömb kerül oda, lesz nulla vagy nem.
hruodnand: ami kódot mutattál az csak írja a tömböt. Tehát mindegy mi a kezdőértéke. A debuggolásról meg a fordító előre nem tud.
[ Szerkesztve ]
Jester
ArchElf
addikt
Pontosabban a rendes fejlesztő-környezetek a debug-módba való fordításnál nem szokták szokták engedélyezni az (ilyen szintű) optimalizációt...
AE
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
hruodnand
senior tag
Igen, de nekünk vizsgán debuggolással kell igazolni, hogy működik a program rendesen. Na most, ha nem ad nekem kezdőértéket, amit ugye beállítok, akkor onnantól kezdve karó! Szóval nincs benne printf, meg ilyenek. Csak debuggolás. Windows alatt ugye nem ad értéket, gondolom az előbb említett fordítóbeli különbségek miatt, de Linux alatt meg ad.
Gondolom, "az csak írja a tömböt" alatt, azt értetted, hogy nem fogok kiíratni az értékét
[ Szerkesztve ]
Jester01
veterán
Igen, lehet hogy az egész arról szól, hogy a kolléga elfelejtette kikapcsolni az optimalizációt.
hruodnand: úgy értettem, hogy ha a program működése szempontjából lényegtelen a kezdőérték, akkor a fordítónak nem muszáj nulláznia.
Mellesleg aggresszívabb optimalizáció mellett (linuxon!) az egész ciklus eltűnik a fenébe tömböstül mindenestül - mivel nincs használva. Ellenőrizd az optimalizációs beállításokat.
[ Szerkesztve ]
Jester
hruodnand
senior tag
Értem, köszönöm. Akkor ennek jobban utána járok!
kispx
addikt
hruodnand
senior tag
Az tény, hogy nekem sincs semmilyen optimalizáció bekapcsolva ezeken a füleken.
Jester01
veterán
Érdekes (bár továbbra sem hiba). A codeblocks alatt is gcc van, ugye? Milyen verzió?
Jester
hruodnand
senior tag
4.4-es van Ubuntu és Windows alatt is.
kispx
addikt
Konkrétan MinGW van alatta. A verziója
mingw32-gcc.exe (TDM-2 mingw32) 4.4.1
kispx
addikt
Viszont nem optimalizációs hiba, mert ha adunk neki egy -O vagy egy -Os -et akkor az egész kódot "eltünteti". Legalábbis debugger alatt semmilyen változó nem látszik, és a debugnál ha a next line-ra kattintok, akkor a program végéhez ugrik.
Jester01
veterán
Nekem 4.2.1 van, az látszólag nem csinálja ezt.
MOD: felraktam 4.4.4-et az se. Igaz mind a kettő cross-compiler, de mingw.
[ Szerkesztve ]
Jester
modder
aktív tag
Helló,
próbálj meg eléjük rakni volatile kulcsszót. ha fv-en belül nem engedi, akkor globális namespace-ben deklaráld. illetve az u1 és u3-as tömböt írasd ki a program futása végén, hogy használva legyen. Szerintem így már nem fogja kioptimalizálni.
hruodnand
senior tag
volatile -al már jó! Köszönöm.
Jester01
veterán
Eddig is "jó" volt, még mindig nem láttam olyan kódot ami rosszul működött volna.
Mostantól viszont minden egyes írás/olvasás a memóriába megy, akár optimalizálsz akár nem (megkötötted a fordító kezét). Ez jelen helyzetben gondolom nem probléma, de azért ezt ne tanuld meg. Azt viszont tanuld meg, mit csinál a volatile, hátha megkérdezik miért tetted oda
Jester
hruodnand
senior tag
Köszönöm! Pont most van a laborom és sikerült egy 5-öst szerezni.
Bitoperátoros, tömbös, ciklusos (elől-hátul tesztelős) vegyes felvágott program volt, sok kritériummal.
Sikerült.
modder
aktív tag
Én sem voltam tisztában a volatile kulcsszó hatásáról belső működésben, csak azzal, hogy mire használják.
Szóval igen, ebben az esetben debuggolásnál hasznodra válik majd, de ne szokd meg a használatát. Lehet, hogy jobb, ha valamilyen formában kiírod az outputra a tömböket. akkor nyilván békén hagyja a tömböket, mert tudni fogja, hogy szükség van rájuk.
kmisi99
addikt
Szeretnék c-t tanulni kicsit komolyabban mit ajánlanátok iskolán kívül? Most az iskolába C-t tanulok de hát semmit se tudok max ilyen tömb feltöltés stb az alapismereteim nagyon rosszak és az egyik tanárom se tanít a leg fényesebben így önerőből szeretnék fejlődni ha lehet mert így eléggé le vagyok maradva jópár oszt társammal együtt (2 csoport van az egyik semmit nem tud programozni a másik meg egész jó én a rosszabba vagyok)
modder
aktív tag
én azt ajánlom, hogy gyakorolj
itt rengeteg forrást találsz, sok gyakorlati példát.
http://infoc.eet.bme.hu/
[ Szerkesztve ]
artiny
őstag
C - Mi történik ha egy tömbre mutató pointner értékét eggyel növelem, majd kiíratom?
Mi történik ha egy tömbre mutató pointner értékét eggyel növelem,majd kiíratom .Ezután egy új értéket adok a tömbnek.
Szerintem:
Ha eggyel növelem a mutatót eggyel tovább ugrik a memóriában ahol el van mentve a pointner.
Ha új értéket adok utána - nos nem tudom ,uj értéket adtam a pointernek,de nem változott meg az értéke teljesen - maradt a régi értékéből és az újból is ? de viszont a memoria cime nem változott a pointernak
#include <stdio.h>
#include <conio.h>
int main()
{
char str1[ ] = "abc";
char *p;
p = str1;
printf("1. ertek{pointnera}: %p\n",p);
printf("1. ertek{pointnera}: %s\n\n",p);
p++;
printf("2. ertek{pointnera}: %p\n\n",p);
*p='df';
printf("uj erteke : %s\n",p);
printf("uj erteke: %p\n\n",p);
return 0;
}
modder
aktív tag
Szerintem:
Ha eggyel növelem a mutatót eggyel tovább ugrik a memóriában ahol el van mentve a pointner.
Nem egyel tovább ugrik a memóriában, ahol el van mentve a pointer, hanem:
A pointer értéke (egy memória cím, egy szám) nő annyival, ahány byte-os az adatstruktúra, amire a pointert deklaráltad.
Ha új értéket adok utána - nos nem tudom ,uj értéket adtam a pointernek,de nem változott meg az értéke teljesen - maradt a régi értékéből és az újból is ? de viszont a memoria cime nem változott a pointernak
Nem a pointernek adtál új értéket, hanem annak a memóriának, amire mutat a pointered.
A programod elvileg azt csinlája, hogy 'b'-t kicseréli 'd'-re (gondolom az f az csak elírás, mert aposztrófok közé csak karaktert lehet írni)
kingabo
őstag
Ne stringgel teszteld, vagy ha azzal, akkor karakterként irasd ki, illetve írd a végére a string lezáró \0 karaktert is. Egy int tömbbel sokkal látványosabb a dolog.
Az elmélethez: azt is érdemes megmondani, hogy mi történik, ha egy n elemű tömb n+1-edik elemére hivatkozol/írod.
Coconut's
csendes tag
Sziasztok!
Lenne egy kis problémám, C kóddal szeretnék törölni egy .txt fájlból sorokat, amiket a programban kérek be, változókba. Az első hiba, hogy amikor átmeneti fájlba másolok, egymás után rakja a sorokat, nem új sorba, tehát 1 sorban lesz az egész, +hát ugye a törlés sem működik, itt a kód, amire jutottam eddig, köszönöm szépen a segítségeket előre is!
void torol(MUSIC zene, FILE *f)
{
fflush(stdin);
char celpont1, celpont2, celpont3, celpont4;
char s[10]="";
printf("Add meg, melyik eloado zenejet szeretned torolni!");
fgets(&celpont1,MAX_STR,stdin);
printf("Add meg, melyik szerzo zenejet szeretned torolni!");
fgets(&celpont2,MAX_STR,stdin);
printf("Add meg, milyen hosszusagu zenet szeretnel torolni!");
fgets(s,99,stdin);
celpont3=atoi(s);
printf("Add meg, melyik mufaju zenet szeretned torolni!");
fgets(&celpont4,MAX_STR,stdin);
FILE *tmp = fopen("tmp.txt", "wb");
// Másolás az átmeneti fájlba
char tmp2[TMP];
do
{
tmp2[TMP] = getc(f);
if(tmp2 == &celpont1 || tmp2 == &celpont2 || tmp2 == &celpont3 || tmp2 == &celpont4)
{
fprintf(tmp, " ");
}
putc(tmp2[TMP], tmp);
}while(!feof(f));
// Visszamásolás
do
{
tmp2[TMP] = getc(tmp);
putc(tmp2[TMP], f);
}while(!feof(tmp));
fclose(tmp);
}
Ui.: Az f file-t miután visszatér az eljárásból, ott zárom be(a main()-ben), az f-ben vannak a sorok beolvasva így:
adat1 // char típusú(előadója)
adat2 // char típusú(szerzője)
adat3 // int típusú(hossza)
adat4 // char típusú(műfaja)
Ez egy zeneszámos progi, 4 adat vonatkozik 1 zenére, de ez végülis nem számít, mert a sorokat egyenként is tudom törölni, mert 4 külön változóba kérem be a sorok tartalmát. Az első probléma mindenképpen az, hogy nem rak új sorokat a tmp fájlba másoláskor, pedig az f-ben úgy vannak.
Chipi333
csendes tag
Nem vagyok nagy C-s, de valszeg a beolvasás lenyeli a sorvégét, azt most nem tudnám megmondani ezzel mit kell művelni.
A torlés viszont azért nem megy szerintem, mert az if-esle nek lefelejtetted az else ágát és a sort mindenképpen kiírod az átmeneti fájlba.
if(tmp2 == &celpont1 || tmp2 == &celpont2 || tmp2 == &celpont3 || tmp2 == &celpont4)
{
fprintf(tmp, " ");
}
else
{
putc(tmp2[TMP], tmp);
}
Szóval ezt így kéne.
[ Szerkesztve ]
Jester01
veterán
Továbbá stringeket nem a címükkel hasonlítunk össze, hanem mondjuk strcpy-vel.
Jester
Chipi333
csendes tag
Thx, valóban De az strcpy az a másolás, összehasonlítás az strcmp.
Jester01
veterán
Huppsz, valóban
Jester
Coconut's
csendes tag
Köszönöm szépen a segítséget, és Jester01-nek is, de sajnos nem jöttem rá még, hogy miért rakja egy sorba a dolgokat az átmeneti fájlban. Valahogy ez a törlés nem fekszik nekem, itt a jelenlegi kódom, az észrevételeket szívesen fogadom továbbra is, és köszi előre is
void torol(MUSIC zene, FILE *f)
{
fflush(stdin);
char celpont1, celpont2, celpont3, celpont4;
char s[10]="";
printf("A torles funkciot hasznalod, a kovetkezokben add meg, pontosan melyik zenet szeretned torolni!\n");
system("pause");
printf("Add meg, melyik eloado zenejet szeretned torolni!");
fgets(&celpont1,MAX_STR,stdin);
printf("Add meg, melyik szerzo zenejet szeretned torolni!");
fgets(&celpont2,MAX_STR,stdin);
printf("Add meg, milyen hosszusagu zenet szeretnel torolni!");
fgets(s,99,stdin);
celpont3=atoi(s);
printf("Add meg, melyik mufaju zenet szeretned torolni!");
fgets(&celpont4,MAX_STR,stdin);
FILE *tmp = fopen("tmp.txt", "wb");
/*// Másolás az átmeneti fájlba
char tmp2;
while(!feof(f))
{
tmp2 = getc(f);
if(strcmp(tmp2, celpont1) != 0 || strcmp(tmp2, celpont2) != 0 || strcmp(tmp2, celpont3) != 0 || strcmp(tmp2, celpont4) != 0)
{
fprintf(tmp, " ");
}
else{
putc(tmp2, tmp);
};
}
// Visszamásolás
while(!feof(tmp))
{
tmp2 = getc(tmp);
putc(tmp2, f);
}; */
fclose(tmp);
}
[ Szerkesztve ]
Jester01
veterán
A celpont illetve tmp2 változóid mind csak 1 karakterek, azokba nem nagyon tudsz fgets-sel hosszabb szövegeket beolvasni.
Jester
shinodas
tag
Sziasztok!
Egy egyszerű kis programocskát írok, és lenne egy olyan problémám, hogy van két tömbböm, össze akarom hasonlítani őket, egy ciklusban. Az egyes elemeket. Na, szóval 6 elemű a tömb, de csak 5 elemet akar nekem vizsgálni. A tömbbök jól vannak feltöltve, és már ötletem elfogyott, valaki segítsen mán ki
#include <stdio.h>
#include <stdlib.h>
int main()
{
int tomb_user[5]; //tomb_user tippje tömbbe alakítva
int tipp=0; //tomb_user tippje
int i=0; // tömb indexek
int j=0;
srand(time(NULL)); //random számhoz kell
int tomb[5]; //random számokat ide töltöti
while(i<6) //feltöltöm a tömbböt
{
tomb[i]=rand()%9; //%9 az a limit
i++;
}
for(i=0;i<6;i++) printf("%d ", tomb[i]);
//adatok bekérése
printf("Kerek egy tippet, hat darab szamot: ");
scanf("%d", &tipp);
if(tipp>999999){
printf("Hat szamjegyet adjon meg!\n");
printf("Kerek egy tippet, hat darab szamot: ");
scanf("%d", &tipp);
}
//user tipp tombbe alakítása
tomb_user[0]=tipp/100000;
tomb_user[1]=tipp%100000/10000;
tomb_user[2]=tipp%100000%10000/1000;
tomb_user[3]=tipp%100000%10000%1000/100;
tomb_user[4]=tipp%100000%10000%1000%100/10;
tomb_user[5]=tipp%100000%10000%1000%100%10;
//===megvizsgálom az egyes elemeket
printf("\nTalálat: ");
i=j=0;
for(i=0;i<6;i++)
{
if(tomb[i]==tomb_user[j]) {printf("H " );}
j++;
}
return 0;
}
[ Szerkesztve ]
Korcsii
őstag
Nem tudom feltűnt-e, de 5 elemű tömböket hozol létre, és mindenhol 6 elemet akarsz belőle használni - mondjuk azt nem értem, hogy miért nem dob erre semmilyen warningot.
[ Szerkesztve ]
shinodas
tag
0-5 az hat elem, nem?
Korcsii
őstag
int tomb_user[5];
int tomb[5];
Az meg öt.
shinodas
tag
Kifejtenéd mire gondolsz? 0 1 2 3 4 5 az hat elemű tömb, de lehet rosszul tudom
Korcsii
őstag
Rég C-ztem már, de úgy rémlik, hogy amikor létrehozod a tömböt, akkor a zárójelbe a méretét írod, tehát int tomb[5] egy 5 elemű int tömb lesz. A sorszámozás persze 0-tól indul. Így for-ban 0-tól <méret-ig lehet számolni, ami pont jó, mert szép, megjegyezhető, és mindent elárul - pl azt is, hogy 6 eleműnek akartad definiálni.
[ Szerkesztve ]
shinodas
tag
hmm, btw kipróbáltam 5 helyett hattal, így már lehet jó is lesz.
Köszönöm!
WonderCSabo
félisten
mondjuk azt nem értem, hogy miért nem dob erre semmilyen warningot
A túlindexelést semmilyen fordító nem ellenőrzi, csak futásidő alatt derül ki, vagy exception/segfault, rosszabb esetben csak a furcsa viselkedés miatt.
uraga
csendes tag
Sziasztok,
Lehet nem ez a legmegfelelőbb topik, de gondban vagyok egy algoritmussal kapcsolatban. Van ez a spreadsort nevű hibrid rendezési algoritmus http://en.wikipedia.org/wiki/Spreadsort itt található a leírása. Na most a baj az, hogy a rövid kis leírásból nem lehet rájönni, hogy pontosan, hogy is rendezi ez a sorozatot. Alatta van egy gyönyörű C/C++-ban írt kód, ami elvileg a rendezés algoritmusa, de abból meg nem sokan értek, mivel java, C#-on nevelkedtem és itt jobbra balra bitshiftelnek ha jól látom. Az a baj, hogy nekem be kéne mutatnom, hogy hogy működik ez a rendezés, de nem értem egészen pontosan. Légyszi valaki aki jó C-ben vagy algoritmusokban vessen rá egy pillantást és magyarázza el nekem hogy működik ez az algoritmus.
Köszönöm előre is.
Jester01
veterán
mivel java, C#-on nevelkedtem és itt jobbra balra bitshiftelnek ha jól látom
Ez aztán a jó kifogás
Mintha azokban a nyelvekben nem lenne bit shift.
A rövid kis leírás pont elmeséli hogyan működik. Veszi a tömböt, megkeresi a legkisebb és legnagyobb elemeket. Az így megkapott intervallumot elosztja egyenlő részekre majd ezeket a részeket rekurzívan rendezi. A rekurzió során bizonyos elemszám alatt már másfajta rendezést használ.
Jester
uraga
csendes tag
Igen, eddig én is eljutottam, abból ha az intervallumokat rendezed, nem lesz rendezett listád. Akkor sem ha a végén n elemszámú listában n darab intervallumod lesz. Max akkor lenne a végén rendezett ha még a rendezett intervallumokat összefésülnénk, ami igen hatékony de egy TimSort nevű rendezés sokkal jobban csinálja, szóval itt nem ez a lényeg. A lényeg ott lenne, hogy a min és max elemek közé úgy pakoljuk be az elemeket, hogy valamilyen csoportosításba kerüljenek mint a BucketSortnál pl 10-20, 20-30, 40-50- ig stb. Ezután az intervallumok rendezésével akár rekurzivan egy rendezett sorozatot kapnánk a végén. De mivel a leirásban az is szerepel hogy egyenlő elem számú intervallumokra osztja, tényleg nem értem hogy csinálja, hogy a végén rendezve is legyen az egész lista, ne csak az intervallumok.
Chipi333
csendes tag
A leírás elég egyértelmű. Gyakorlatilag egy quicksort, csak nem egy hanem több pivotot használ -> 2 helyett több partíciót csinál az elemekből aztán rekurzívan azokat is rendezi, és így tovább. Ha nem ismered a quicksortot akkor először azt nézd meg, és utána érteni fogod.
Aműgy ebbe a topicba szerintem jobban illene a téma: http://itcafe.hu/tema/programozas_forum/hsz_1-50.html
[ Szerkesztve ]
Jester01
veterán
A lényeg ott lenne, hogy a min és max elemek közé úgy pakoljuk be az elemeket, hogy valamilyen csoportosításba kerüljenek mint a BucketSortnál pl 10-20, 20-30, 40-50- ig stb.
Igen, ez így történik. Mivel az értéktartományt osztja szét részekre és az elemeket szétdobálja. Utána pedig az egyes részeket is berendezi. A két rendezésből az egész rendezve lesz. Az intervallumok viszont nem lesznek egyenlő számosságúak.
Jester
Chipi333
csendes tag
"Mivel az értéktartományt osztja szét részekre és az elemeket szétdobálja. Utána pedig az egyes részeket is berendezi. A két rendezésből az egész rendezve lesz. "
Ehhez annyit még hozzátennék, hogy nem két rendezésről hanem n darab rekurzióról beszélünk. A részekre ugzanez a rendezés lesz ráeresztve, majd azoknak a részeire is egészen addig amíg egy-egy részben nem 0-1 elem marad ami már rendezett, és akkor elkezdenek visszatérni.
Jester01
veterán
Lásd #3142
Jester
Chipi333
csendes tag
Ohh.. my bad De ebben a hszben rosszul nézett ki
uraga
csendes tag
Ismerem az összes rendezést köztük a quicksortot is mert ezelőtt, már 4 másik hibrid rendezést megvalósítottam amiben benne volt a quicksort is egyikben.
DE!
A leírás azt írja equal-sized bins! Az equal sized az azonos méretű. ha választok véletlenszerűen pivot elemeket és szétdobálom közöttük, baromira nem biztos hogy equal sized -ok lesznek, és akkor minek kerestem meg a min és max elemet. Itt olyan intervallumokra kell osztani amiben egyenlő számú elemek vannak, ez nem egy quicksort több pivottal, mert akkor azt írná.
Jester01
veterán
Equal-sized az értékkészletben. Nem azonos elem számosságú. Legalábbis a mellékelt kód szerint. Pl itt látszik:
// Calculating the size of each bin; this takes roughly 10% of runtime
Végigmegy az elemeken és megnézi melyik bin-be kerülnek, aztán a bin-ek kezdőpozíciót a számosságok alapján számolja ki.
Jester
Téma tudnivalók
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!