- Computex 2024: analóg árkád kontroller a Varmilo gondozásában
- Computex 2024: Mini-ITX alaplapokat vár a Fractal két új háza
- Computex 2024: szemrevaló madzag nélküli klaviatúrák a Varmilo portfóliójából
- Computex 2024: újfajta tápdizájn a Lian Li boszorkánykonyhájáról
- Új Philips Evnia monitorok érkeznek a játékosok asztalaira
- Nvidia GPU-k jövője - amit tudni vélünk
- Nem indul és mi a baja a gépemnek topik
- ASUS notebook topic
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Gaming notebook topik
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- NVIDIA GeForce RTX 3080 / 3090 / Ti (GA102)
- Bluetooth hangszórók
- ASUS ROG Ally
- Raspberry Pi
Hirdetés
-
Csinált valamit a Nokia: megváltoznak a telefonhívások
it Végrehajtotta a világ első „magával ragadó” telefonhívását a Nokia vezérigazgatója. 3D-s hangélményt ígér.
-
Retro Kocka Kuckó 2024
lo Megint eltelt egy esztendő, ezért mögyünk retrokockulni Vásárhelyre! Gyere velünk gyereknapon!
-
Ránézésre nem változik a Pixel Watch 3
ma A legfrissebb renderek alapján ránézésre nem lehet majd megkülönböztetni a Pixel Watch 3-at az elődjétől.
Ú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!
- Nvidia GPU-k jövője - amit tudni vélünk
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Futás, futópályák
- TheLázs: ADHS
- Társasjáték topic
- Óra topik
- Filmvilág
- Az Apple is mesterséges intelligenciával turbózza fel a teljes kínálatot
- Nem indul és mi a baja a gépemnek topik
- Autós topik látogatók beszélgetős, offolós topikja
- További aktív témák...
- Samsung Galaxy S23 Ultra 1TB + 12GB RAM Gyári független (Phantom Black) SM-S918 + 24 hó garancia
- Samsung Galaxy S23 Ultra 1TB + 12GB RAM Gyári független (Phantom Black) SM-S918 + 24 hó garancia
- LG 65" B3 OLED 4K HDR SMART 120HZ GAMING TV
- ThinkPad L380 fém fedlap - 13.3", I5-8350, 16 ddr4/ 512 NVMe, ujjl.olvasó, type-c +SZLA +GAR!
- Lenovo Thinkpad P70 , T470p , p52 , L14
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen