- DIGI Mobil
- Drágábban indíthat az új iPhone SE
- Megérkezett a Google Pixel 7 és 7 Pro
- Samsung Galaxy Watch4 és Watch4 Classic - próbawearzió
- Xiaomi 13 Lite - dögös vagy, Civi
- Drágább lett a Pixel 8a
- Apple iPhone 15 - a bevált módszer
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- iOS alkalmazások
- Fotók, videók mobillal
Hirdetés
-
AMD Radeon undervolt/overclock
lo Minden egy hideg, téli estén kezdődött, mikor rájöttem, hogy már kicsit kevés az RTX2060...
-
Sztori trailert kapott az Elden Ring: Shadow of The Erdtree
gp A DLC a tervek szerint jövő hónap végén debütál PC-n és konzolokon.
-
Céges verziót mutatott be a HMD a Pulse Plusból
ma Hosszabb szoftveres támogatás és garancia, az Android Enterprise ajánlott irányelvek kipipálása megvan.
Új hozzászólás Aktív témák
-
Jester01
veterán
Az értékadás mint kifejezés inkább feltételben szokott előfordulni, ilyesmiket lehet gyakrabban látni:
while ((c = fgetc(in)) != EOF) { ... }
vagy
while ((bytes = read(...)) > 0) { ... }Ezekben az esetekben olvashatóbbá teszi a kódot, artiny verziójában valóban fölösleges, inkább zavaró volt.
Jester
-
Jester01
veterán
-
Jester01
veterán
válasz Rickazoid #3085 üzenetére
Az i nem feltélten lesz 0. Egyszerűen csak nem változik az értéke. Mivel te semmivel sem inicializáltad, véletlen érték lesz, ami éppen a memóriában volt. Feladattól függően egyébként sem biztos, hogy a 0 hibás bevitel lenne.
Azért végtelen a ciklus mert ha a scanf elakad, akkor nem olvassa ki a pufferből a maradékot. A következő scanf hívás tehát pont ugyanúgy elakad. Neked kell takarítani, a következő sorvég jelig, például getchar használatával. EOF-ot is illik lekezelni.
A scanf amúgy visszaadja mennyi mezőt sikerült beolvasnia, de ettől még lehet szemét a pufferben. Nem véletlenül mondják, hogy nem ajánlott scanf-et használni. Bármennyire is nem szeretnéd, a korrekt megoldás általában teljes sor olvasása (fgets) után kézi feldolgozás (strtol, strtod).
Jester
-
-
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
-
Jester01
veterán
válasz ArchElf #3105 üzenetére
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
-
Jester01
veterán
válasz hruodnand #3117 üzenetére
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
-
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
-
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
-
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 runtimeVé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
-
Jester01
veterán
válasz shinodas #3206 üzenetére
A srand inicializálja a véletlenszám generátort valami kiinduló érték alapján. Azonos kiindulási értékből mindig azonos sorozat lesz (debuggoláshoz jó például). Hogy mindig más legyen, az aktuális idő van megadva.
A rand() az visszaad egy egész számot a [0, RAND_MAX] intervallumból. A % az nyilván a maradékképzés, tehát végül is a [0, 8] intervallumban fogsz számokat kapni.
[ Szerkesztve ]
Jester
-
Jester01
veterán
Jelzem, az fscanf(file, "%s", str) nem sorokat olvas hanem szavakat, ráadásul mérethatár nélkül tilos használni (túlcsordulás veszély). Sorok olvasására egyébiránt az fgets való.
Jester
-
Jester01
veterán
válasz shinodas #3318 üzenetére
A két return-nek nincs értelme.
A *magan_p++; pedig nem az értéket növeli, hanem a pointert. Helyesen (*magan_p)++; MOD: illetve a talán olvashatóbb *magan_p += 1; forma. Nyilván ugyanez vonatkozik a massal_p-re is.Érdemes a fordító figyelmeztető üzeneteit bekapcsolni és átgondolni. Jelen esetben például:
t.c: In function 'massal_magan':
t.c:86: warning: value computed is not used
t.c:89: warning: value computed is not used
t.c:96: warning: will never be executedJa egyébként nem minden mássalhangzó ami nem magánhangzó (például a szóköz, számok, írásjelek)
[ Szerkesztve ]
Jester
-
Jester01
veterán
-
Jester01
veterán
-
Jester01
veterán
Rögtön az elején kezdődnek a bajok:
open("/dev/input/uinput", O_WRONLY) = -1 ENOENT (No such file or directory)
Egész egyszerűen nincs ilyen eszköz, például nincs benne a kernelben vagy nincs betöltve a szükséges modul.A kód valóban gány, mert 0 ellenőrzés van benne, pedig az open nem nullát ad vissza hiba esetén, hanem -1-et.
ufile = open("/dev/input/uinput", O_WRONLY);
if (ufile == 0) {
printf("Could not open uinput.\n");Jester
-
Jester01
veterán
válasz Retekegér #3369 üzenetére
conio.h és getch nem szabványos, arra van a getchar amit mellesleg a csúnya scanf helyett is használhatsz.
Ha a while ciklus már elérte a végét, akkor a getch már amúgy is fölösleges.
A tömb elem növelésénél pedig nem i-t hanem c-t kellene használni indexeléshez.
Ezen felül ajánlott kapcsoszárójeleket és áttekinthetőbb struktúrát használni.
Ja és nem formázott kiíráshoz fölösleges a printf, arra van a puts.A ctrl+z pedig elképzelhető, hogy csak üres sorban fog működni (legalábbis a linuxos ctrl+d így van) tehát előbb enter kell az aktuális sor lezárásához majd jöhet az EOF.
#include <stdio.h>
int main ()
{
int c;
int i;
int tomb[10];
puts("Fajl vege jelig (Ctrl+Z) szabvanyos bementrol olvasva");
puts("megszamoljuk, hogy hany szamjegy van a szovegben.\n");
for (i=0; i<10; i++) {
tomb[i]=0;
}
while ((c = getchar()) != EOF) {
if (c>='0' && c<='9') {
tomb[c-'0'] += 1;
}
}
for (i=0; i<10; i++) {
printf("%d: %d\n",i,tomb[i]);
}
return 0;
}[ Szerkesztve ]
Jester
-
Jester01
veterán
Na nem azért nem szabványos
C szabvány, 6.5.2 bekezdés:Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.
This paragraph renders undefined statement expressions such as
i = ++i + 1;Márpedig az adott kódban ilyenek vannak.
Egyébiránt GCC meg is mondja:
ph.c: In function 'main':
ph.c:5: warning: operation on 'b' may be undefined
ph.c:5: warning: operation on 'a' may be undefined
ph.c:10: warning: operation on 'd' may be undefined
ph.c:10: warning: operation on 'c' may be undefined[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz sztanozs #3498 üzenetére
Azért, hogy a kezdőket ne vezessük félre megjegyzem, hogy ez a megoldás nem teljesen tökéletes. A baj nem a konverzióval van, hanem azzal, hogy a string literálok nem írhatók. Tehát ez rossz: char* binary = "0000|0000|0000|0000"; és persze ez is binary[counter] = '1';
Jester
-
Jester01
veterán
válasz Bobrooney #3523 üzenetére
Ez is több sebből vérzik.
1. puffer túlcsordulás
2. egyébként is a puffer tök fölösleges
3. a getchar visszatérési értéke nem char
4. fájl végét nem '0' jelziEsztétikai kifogások
1. az if/elseif/else szerkezetet úgy hívják, switch
2. a '\0' az olyan mint az "artist formerly known as Prince" ... az a karakter aminek a kódja 0 ... akkor már miért nem mondod hogy 0.Jester
-
Jester01
veterán
-
Jester01
veterán
válasz bandi0000 #3555 üzenetére
Jó lenne ez, csak a %d ugye addig olvas amíg tud, tehát egyben benyeli a számsorodat. Ezért kell karakterenként olvasni.
eriktoth: Igen, ha túlcsordul akkor elölről kezdi. Ezt ott kellene lekezelni ahol növeled, hogy ne növelje tovább ha már UCHAR_MAX
[ Szerkesztve ]
Jester
-
Jester01
veterán
Bár a fenti működik (és más esetben jó is lehet) de azért remélem senkiben nincs kétség, hogy a páros számokat úgy írjuk ki, hogy kettesével megyünk nem pedig úgy, hogy megnézzük melyik szám páros.
Jester
-
Jester01
veterán
mert a gets az stdin pufferben hagyja az újsor karaktert
Elvileg (és nálam gyakorlatilag) nem hagyja ott. De a scanf meg amúgy is megeszi automatikusan.Egyébként gets-et tilos használni, fővesztés terhe mellett. Helyette fgets ajánlott.
MOD: Konkrétan a település nevét bekérő scanf hagyja a pufferben a sorvéget, így a gets fog üreset adni és a közterület marad ki, nem a házszám.
[ Szerkesztve ]
Jester
-
Jester01
veterán
A scanf("%s") ugyanúgy nem ellenőrzi a hosszt, tehát túlcsordulás veszélyes.
Hogy a program miért nem működik azt már a #3603-ban leírtam. A scanf hagyja a pufferben a sorvéget ezért a rákövetkező fgets üres sort lát. A mostani kóddal ezért a település neve lesz üres.
Az ember azt hinné az adatbevitel egyszerű, de ez sajnos nem így van
Mivel mindenhol sorokat akarsz olvasni, mindenhol fgets kell és máris jó lesz. Persze igazából egy hibakezelős verzió kellene, ami észreveszi, ha több betűt ír be a lökött felhasználó.
Például valami ilyesmi jöhet szóba.
Jester
-
Jester01
veterán
válasz Frenky89 #3647 üzenetére
Arról nem tehetünk, hogy nem C99 kompatibilis a fordító amit használsz. A platformfüggetlenség olyan dolog, hogy meg kell mondani milyen közös nevezőre építesz.
Egyébiránt avr-gcc kiválóan tudja a 64 bites long long típust, azt hiszem avr-studio is azt használja.
Jester
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- JÉZUS EVANGÉLIUMA - bármi megtanulható, ha: akarom-hiszem-tanulom-csinálom-tapasztalom-megértem-élem
- Bontatlan iPhone 15 Pro 128GB White Titanium, gyárilag független
- GamePro Magyar nyelvű játék Gamer újságok 2005
- 3-tengelyes stabilizátor (gimbal)
- MSI P106 bányászkártya (GTX 1060 6GB) HDMI kimenettel(?)
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: Ozeki Kft.
Város: Debrecen