- Visszatérne a PC-s kliensbizniszbe az NVIDIA
- AMD Ryzen 9 / 7 / 5 7***(X) "Zen 4" (AM5)
- VR topik (Oculus Rift, stb.)
- Melyik tápegységet vegyem?
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Amlogic S905, S912 processzoros készülékek
- Kormányok / autós szimulátorok topicja
- Milyen TV-t vegyek?
- MSI blog: válasszunk notebookot akciósan!
- NVIDIA GeForce RTX 4080 /4080S / 4090 (AD103 / 102)
Hirdetés
-
Hauntii teszt
gp Ki gondolta volna, hogy az élet és halál közti rés ennyire élvezetes lehet? Igaz, szín nem sok fért ebbe a birodalomba, de a Hauntii hangulatával, harcaival és apró fejtörőivel is képes elvarázsolni.
-
Összemoshatja a Google és a Magic Leap a valódi és a digitális világokat
it Együttműködésbe kezdett a Google és a Magic Leap nevű AR-startup.
-
A hajlíthatók kedvence lehet a Dimensity 7300X 5G
ma Átcímkézés helyett csíkszélességet váltott a MediaTek, népszerű Motorolában debütálhat.
Új hozzászólás Aktív témák
-
Jester01
veterán
-
Jester01
veterán
válasz don_peter #4841 üzenetére
Mikrokontrolleren számíthat, hogy >> i vagy >> 1 mert előbbi lehetséges, hogy csak egy ciklusban, egyesével valósítható meg. A kiírást tehát célszerű úgy csinálni, hogy csak egyet léptetsz, az értéket (ha módosítható) vagy a maszkot.
for(i=0; i<8; i++, bitek >>= 1) {
if (bitek & 1) {
...
}
}Bizonyos esetekben a visszafelé futó ciklus is kisebb/gyorsabb lehet.
Jester
-
Jester01
veterán
-
Jester01
veterán
válasz #68216320 #4894 üzenetére
A forrásfájl kódolása tetszőleges lehet és független a futásidejű kódolástól. Az aktuális locale beállításból jön, alapértelmezése pedig utf8. Persze meg is lehet adni a fordítónak, gcc esetén a -finput-charset kapcsolóval.
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main()
{
const wchar_t* text = L"árvíztűrő tükörfúrógép";
wchar_t buf[40];
setlocale(LC_ALL, "");
wprintf(L"Írd be, hogy %ls: ", text);
fgetws(buf, 40, stdin);
buf[wcslen(buf) - 1] = 0;
wprintf(L"Ezt írtad be: \"%ls\", %ls\n", buf,
wcscmp(text, buf) ? L"nem egyezik" : L"egyezik");
return 0;
}$ file test-utf8.c
test-utf8.c: C source, UTF-8 Unicode text
$ gcc -finput-charset=utf8 test-utf8.c
$ ./a.out
Írd be, hogy árvíztűrő tükörfúrógép: árvíztűrő tükörfúrógép
Ezt írtad be: "árvíztűrő tükörfúrógép", egyezik
$ iconv -f utf8 -t iso8859-2 < test-utf8.c > test-latin2.c
$ gcc -finput-charset=iso8859-2 test-latin2.c
$ ./a.out
Írd be, hogy árvíztűrő tükörfúrógép: árvíztűrő tükörfúrógép
Ezt írtad be: "árvíztűrő tükörfúrógép", egyezikMégegyszer, röviden: a forrás tetszőleges kódlappal lehet, ha azt megmondod a fordítónak. Futásidőben pedig a setlocale megfelelő használata szükséges. Ennyi.
Jester
-
Jester01
veterán
1. nem lehet tudni mit ír ki, mert nem definiált működés
2. itt nem kell az L, akkor kellene esetleg ha műveleteket végzel vele ami túlcsordulhat
3. nem tudjuk ennyiből megállapítani
5. a C ilyen buta
+1. ha nem az eredetit akarod módosítani, akkor foglalj dinamikusan memóriát (malloc)buherton:
[ Szerkesztve ]
Jester
-
Jester01
veterán
A beolvasás egyszerű feladatnak tűnik, mégis meglepően bonyolult jól csinálni.
Az fflush(stdin) nem szabványos, vagy működik vagy nem. Az ajánlott módszer teljes sorok olvasása fgets használatával, majd a beolvasott sor számmá alakítása strtol segítségével. A helyes megoldás a sor olvasásnál kezeli a túl hosszú sorokat, és az átalakítás után ellenőrzi, hogy maradt-e még feldogozatlan karakter.
Ennél egyszerűbb megoldás, ha az fflush(stdin) helyett egy fgetc(stdin) ciklussal kiolvasol mindent a sor (vagy a bemenet) végéig.
Az is rossz a kódban, hogy a scanf visszatérési értékét nem ellenőrzöd. Ha ugyanis nem számot írnak be, akkor nem tud mit konvertálni és az i értéke változatlan marad. Azt pedig nem is inicializáltad, tehát bármi lehet. Ha véletlenül 1 és 5 közé esik akkor a programod kilép a ciklusból.
[ Szerkesztve ]
Jester
-
Jester01
veterán
Azért mondja a nullára, hogy páros, mivel az A sorrend a rossz, először a nullát ellenőrizd és csak utána a paritást.
Egyébként a feladatnak nem felel meg a programod, hiszen van kiírás a (csodaszép nevű) e függvényben is. A visszatérési érték pedig mindig nulla.
Annak sem sok értelme van, hogy else if (a%2!=0), hiszen az else már magában is ezt jelenti, tekintve, hogy az előző feltétel if (a%2==0) volt.
Jester
-
Jester01
veterán
-
Jester01
veterán
válasz DrojDtroll #5036 üzenetére
Elvileg a SetConsoleMode függvénnyel ki kell kapcsolni az ENABLE_LINE_INPUT beállítást. De nem tudom, nekem linuxom van
Jester
-
Jester01
veterán
-
Jester01
veterán
-
Jester01
veterán
válasz dabadab #5196 üzenetére
Attól függ mi a feladat pontosan. Mert ha a transzponált mátrixot oda kell adni valami másik függvénynek az boldogtalan lesz ha nem transzponálod ténylegesen mert nem tudja, hogy fel kell cserélni a koordinátákat. Persze ha van valami társított flag ami mutatja és ezt minden tudja is kezelni, akkor jó megoldás.
A kérdésre válaszolva: végig kell iterálni az alsó vagy a felső hárömszögön és cserélgetni. Már ha nem kell új helyre másolni, mert akkor az egészen végig kell menni és felcserélve kiírni.
[ Szerkesztve ]
Jester
-
Jester01
veterán
Viszont ez minden elem elérésnél egy indirekt függvényhívás amit nem tud a fordító inline beágyazni. Bizonyos mennyiség fölött garantáltan sokkal lassabb lesz, mintha ténylegesen transzponáltad volna.
A másik, hogy a cache hatékonyságát nagyban befolyásolja a bejárás. Egy sorfolytonos bejárás sokkal gyorsabb lehet mint egy oszlopok szerinti. Az algoritmust ennek megfelelően választhattad meg, de ha a hívó egy függvénypointeresen transzponált mátrixot ad be, akkor amire a kód azt hiszi, hogy hatékony sorfolytonos az valójában nem az. Ugye bizonyos műveleteknél ezért éri meg ténylegesen transzponálni a mátrixot, a bejárás megváltoztatása helyett, még akkor is ha amúgy nincs függvénypointeres trükközés. Lásd még What every programmer should know about memory: "Through the simple transformation of the matrix we can achieve a 76.6% speed-up! The copy operation is more than made up. The 1000 non-sequential accesses really hurt. "
Virtuális mátrixokhoz viszont kétségkívül jó megoldás lehet.
Jester
-
Jester01
veterán
-
Jester01
veterán
válasz aviator #5542 üzenetére
Mindenképp egy pointer kell. Ha eleve pointered van akkor nyilván már semmi dolgod
Ha tömböd van akkor is írhatod például így: x + 3 vagy &x[3]
Ugye az a[b] definíció szerint egyenértékű a *(a+b) kifejezéssel, és az & jel arra kell hogy a *-ot kiüsse.[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz ToMmY_hun #5545 üzenetére
Pedig éppenséggel pointer készítő, mivel nem csak egy számot (a címet) adja vissza hanem konkrétan egy megfelelő típusú pointert (aminek a belső reprezentációja lehet, hogy nem is csak egy szám). Arra a valamire mutató pointert gyárt neked amit operandusként megadtál. (Igen, tudom, hogy amúgy address operator a neve.)
"The result is a pointer to the object or function designated by its operand"
Jester
-
Jester01
veterán
memóriacímet tárolnak, ami egy darab szám
Ez persze nem igaz, a pointerek belső szerkezete implementációs kérdés. Például szegmentált memóriamodellben van ugye far pointer is, amiben 2 szám is van, vagy harvard architektúrán a szám mellé még azt is tudni kell adat vagy program memória stb.
Nyilván ha akarom akkor ez 1 szám mivel csak egy halom bit azt meg bármikor felírhatom számként Az is igaz, hogy a hétköznapi rendszerekben valóban elég egy szám.
Ezzel együtt az eredeti kiindulás az volt, hogy az & operátor nem egy számot ad vissza, hanem egy megfelelő típusú pointert. Emiatt aztán (int)&x + 1 és (int)(&x + 1) az nem ugyanaz (kivéve ha véletlenül x mérete 1 byte)
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz aviator #5570 üzenetére
Ez meg a híres tömb-pointer ekvivalencia. C-ben a tömb automatikusan konvertálódik az első elemére mutató pointerré:
Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type "array of type" is converted to an expression with type "pointer to type" that points to the initial element of the array object and is not an lvalue.
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz dobragab #5575 üzenetére
a címét nem képezhetjük, hiszen ahhoz először pointerré konvertálódik,
Szerinted. A szabvány szerint meg de. Idéztem ott feljebb kicsivel:
Except when it is the operand of the sizeof operator or the unary & operator
Tehát ha & operátort alkalmazol a tömbre akkor nem konvertálódik pointerré.
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!
- TicWatch Pro 2020 okosóra
- Eladó Palit RTX 4070 Dual 12GB GDDR6X videokártya
- Fujitsu Lifebook E546 , 14" Kijelző, I3-6100U, 8GB DDR4, 128GB SSD, WIN 10, Számla, garancia
- Fujitsu Lifebook E544 , 14" Kijelző, I7-4712QM, 16GB DDR3, 128GB SSD, WIN 10, Számla, garancia
- Dell Latitude E6430, 14" HD+ Kijelző, I7-3720QM, 8GB DDR3, 320GB HDD, Nvidia 1GB, WIN 10, Számla,
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Alpha Laptopszerviz Kft.
Város: Pécs