Új hozzászólás Aktív témák
-
don_peter
senior tag
válasz alapz@j #5500 üzenetére
Nem tudom, vagy csak véletlen elírtam vagy nem jól fogalmaztam és már nem akartam ezen rugózni.
Mivel mikrokontrollerekkel foglalkozom és azokat programozom, így tisztába vagyok az adattípusokkal.
Nem is értem hogy tartunk még itt.----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
mepet
addikt
itt feldobtak egy szuperegyszerű "mit ír ki" feladatot.
printf("%zu", sizeof('a'));
printf("%zu", sizeof(+'a'));A választ tudom, mert kipróbáltam. Csak tippelni tudok, mit csinálhat az a +. Jól tippelek, csak ennyi a megfejtés: 0(int)+akármi(char) = akármi(int), és ezért az a válasz, ami?
-
dobragab
addikt
C++-ban a character literal típusa char, mégpedig azért, hogy működjenek az overload-ok (pl. operator<<). Az unáris operator+ igazából semmit nem csinál, csakis azért van, hogy le tudd írni:
int i = +5;
Illetve mégis csinál valamit: minden egész művelet operandusai minimum int-re kasztolódnak fel, és a végeredménye is minimum int. Ezért +'a' már int típusú. Tehát az output C++-ban 14.C-ben a character literal típusa int, az unáris operator+ esetén ugyanúgy megvan az upcast, csak ugye int-ről int-re. C-ben a végeredmény 44.
%zu csak C99-ben és C++-ban van, így C-ben kell az -std=c99. MSVC-t ne használj C-re
Fogadjunk, hogy te a C++-os megoldást mondtad[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
mepet
addikt
válasz dobragab #5507 üzenetére
C++-ul nem értek, de legalább ma is tanultunk valamit. Kézzel pötyögtem a kódot, és én nem literal méretét néztem, az életben eszembe nem jutott volna ilyen, hogy "visszafelé kompatibilitás miatt" ugyanaz a típus több byte-ot foglalhat csak azért, mert literal...
char a='a';
printf("%zu", sizeof(a));
printf("%zu", sizeof(+a));Ez pedig 14-et dob C-ben, és itt az a magyarázat, amit én mondtam, de persze mint kiderült a két kód között is van különbség...
[szerk] PellesC built-in complier LCC alapokon, -std:C11
[ Szerkesztve ]
-
alapz@j
tag
A PellesC-vel nem volt gondod? Én akkor szedtem le a gépemről, amikor kiderült, hogy a totál ansi C forrásból készülő Lua.exe-t (a Lua nyelv értelmezője) csak a PellesC-vel fordítva nem működik rendesen, pedig azzal még a barebone Tiny C Compiler (tcc) is megbirkózott...
-
aleister
veterán
Sziasztok!
Most kezdtem el a C-vel foglalkozni. Tudnátok egy olyan fordítót ajánlani, ami 64 bites W10 alatt működik? Konkrétan az alap ANSI C-t nyúzom. Próbálkoztam online compilerekkel, de már egy sima scanf-nél sem működtek jól. Aztán leszedtem a miniGW-t, de el sem indult. Végül az MS Visual Studio 2015-öt, de abban meg csak C++ és C# lehetőséget találtam, mezei C-t nem.
Csak gyakorlásra kell. Nem kell semmi extra fícsör.
Eladó ÚJ Adata DDR4 2 GB so-dimm ram QNAP vagy Synology NAS-ba.
-
dobragab
addikt
válasz aleister #5511 üzenetére
Elvileg VS2015 már (!) támogatja a C99-et is. Lassan ideje volt, elvégre jövőre nagykorú lesz a szabvány. Ennek ellenére C-hez ne használj VS-t, pl. a scanf miatt tuti szívni fogsz, de a szabványt is máshogy értelmezi, mint kéne.
Én egy MinGW-t javaslok, CodeBlocks-szal együtt még kényelmes is.
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
aleister
veterán
Köszi szépen mindenkinek!
A PellesC-t kipróbáltam. Működik tökéletesen. Több nekem nem is kell.
Eladó ÚJ Adata DDR4 2 GB so-dimm ram QNAP vagy Synology NAS-ba.
-
nonsen5e
addikt
Sziasztok!
Egy program részeként olyasmit szeretnék létrehozni, hogy elindul egy visszaszámláló ciklus, ami vagy akkor lép ki amikor lejár az idő, vagy akkor ha lenyomok egy bizonyos billentyűt. Viszont a program tárolja is el annak a lenyomott billentyűnek az értékét, így ahogy néztem a khbit() függvény kiesik.
Ez a kód jelenleg működik is (addig fut amíg le nem telik az idő, vagy nem nem nyomok egy billentyűt), csak a while után én meg is szeretném valahogyan vizsgálni a leütött karaktert.
scanf() / getch() / getchar() pedig azért esik ki, mert a következő karakterleütésig szünetelteti a program futását.#include <stdio.h>
#include <time.h>
#include <conio.h>
int main ()
{
time_t seconds;
time_t seconds2;
seconds = time(NULL)+3;
seconds2 = 0;
while (!kbhit() && seconds2!=seconds){
printf("töltelékszöveg, hogy lássam, hogy működik.\n");
seconds2=time(NULL);
}
return 0;
}[ Szerkesztve ]
D4 klán: HunPH - invért privát rám
-
Karma
félisten
válasz nonsen5e #5518 üzenetére
Onnantól kezdve, hogy conio.h (brrr Borland), elég egyszerűen meg lehet oldani. A getch() visszaadja az utoljára lenyomott karaktert, ami a kbhit után nem fog várakozni, hanem visszaadja az utoljára lenyomottat.
Mondjuk szerintem gondold át egy kicsit, hogy mit csinál a != operátor abban az esetben, ha valamilyen okból túlszalad a seconds2 változód a seconds-on, és nem kéne helyette valami más operátor.
Harmadrészt egy középiskolai háziban mondjuk szódával elmegy a busy wait, de afölött már utána kéne nézni, hogy lehet várakozni while ciklusban 100%-on pörgetett CPU nélkül.
[ Szerkesztve ]
“All nothings are not equal.”
-
nonsen5e
addikt
Köszönöm, megnézem a getch(), meg átdolgozom a ciklust is kicsit.
Majd próbálok kitalálni / keresni valamit a várakoztatásra, rögtön az elején tudtam, hogy ez nem lesz jó, de jelenlegi "tudásom" alapján egyelőre ezt tudtam kigányolni belőle, addig is tudom folytatni a program többi részét.
Semmi házi, vagy beadandó vagy ilyesmi. Saját szórakoztatásomra tanulgatom a nyelvet, úgyhogy minden konstruktív kritikát szívesen fogadok!D4 klán: HunPH - invért privát rám
-
EQMontoya
veterán
int64_t g = 0;
do
{
int64_t wg_index = selected_wg[g];
if (wg_index >= num_workgroups)
wg_index -= num_workgroups;
source->serialised = ncmem_peek_nc (serialised, ncmem_remaining (serialised));
ncmem_flatten (source->serialised);
actor_senda (workgroups->actors[wg_index], send_msg, source, sizeof (fred_fix_source_t));
if (++g == num_selected_wg)
break;
} while (true);Csak az eleje meg a vége a lényeg.
Én röhögőgörcsöt kaptam, ilyen nincs. És van, baszd meg, benne a repoban.Same rules apply!
-
dobragab
addikt
válasz dabadab #5523 üzenetére
Az nem pont azt jelentené.
wg_index %= num_workgroups;
Ezzel ekvivalens:
while (wg_index >= num_workgroups)
wg_index -= num_workgroups;Bár szerintem is erre gondolt a "kolléga".
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
dobragab
addikt
válasz EQMontoya #5529 üzenetére
Volt nálunk két Morgan Stanley-s programozó C++ előadást tartani. Az egyik slide-on ez a szöveg volt.
It is not enough for the code to be correct. It needs to be obviously correct, and require little time to verify, and describe.
Ide pont passzol.
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
Gyb001
senior tag
Sziasztok.
Milyen IDE-ben a legjobb OpenGL GLUT programot írni? (C)
Most kezdem tanulni a nyelvet. Nincs semmi ajánlás hogy miben írjuk. Eddig a Code:locks-ot találtam. egyéb ötlet?[ Szerkesztve ]
A bus station is where a bus stops. A train station is where a train stops. On my desk, I have a work station
-
Gyb001
senior tag
Üdv ismét.
Lenne egy glut problémám. Nem jelenik meg egy textúra, csak az átlag színe, szerintetek mi lehet a probléma?glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[6]);
drawBox(100.0f,GL_QUADS);
drawBoxAkárhol próbálom a programon belül textúrázni, sehol nem működik, Viszont ugyanaz a textúra egy másik obijektumon megjelenik.
[ Szerkesztve ]
A bus station is where a bus stops. A train station is where a train stops. On my desk, I have a work station
-
aviator
tag
Sziasztok!
Valaki el tudja nekem magyarázni, hogy dinamikus tömbök esetén miután malloc-cal lefoglaltam a helyet az elemeknek és olvasom be őket scanf-fel, miért kell a változó neve elé & jel?
Most tanulom ezt a témakört, szóval lehet hülye kérdés volt, de azért nem értem, mert ha nem tömbről van szó, hanem csak egy sima pointernek adom értékül a malloc által lefoglalt helyet (x=malloc(sizeof(int))), akkor a scanf-ben nem kell az & jel (scanf("%d",x)), mivel már megvan, hogy hova fog kerülni a beolvasott érték.
Köszönöm, ha valaki segít.
-
buherton
őstag
válasz aviator #5539 üzenetére
A példádban az x az egy mutató, ami egy memória területre mutat. A scnaf csak pointereket vár paraméterként, így amikor memória területed van, akkor annak címét kell átadnod. A &-vel képezhetsz címet egy memória területről.
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
aviator
tag
Köszönöm a választ!
Amit írtál azt értem: a memóriaterület címét kell, hogy megkapja a scanf, ez alapján tudja, hogy hova írja a változó értékét. Azt nem értem, hogy ha ez így van, akkor miért NEM kell az & jel, ha az x nem egy dinamikus tömb, hanem egyetlen pointer.
[ Szerkesztve ]
-
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
-
ToMmY_hun
senior tag
válasz Jester01 #5546 üzenetére
Erre kérhetek valamilyen irodalomból származó referenciát? Amiket én néztem azokban sehol sem említik, hogy bármi egyebet csinálna a memóriacím visszaadásán kívül. Maga a létrehozott pointer nyilván nem csak egy számot tárol, azzal nem lehetne leírni egy struktúra belső szerkezetét.
[ Szerkesztve ]
C programmers never die, they are just cast into void.
-
zka67
őstag
válasz ToMmY_hun #5547 üzenetére
Szia, de igen, a pointerek csak és kizárólag egy darab memóriacímet tárolnak, ami egy darab szám. Az összes többit a fordító végzi el. Ha te pl. egy int típusú tömb címét adod át paraméterként egy függvénynek, az átadott paraméter csak a tömb címét tartalmazza. Amikor a függvényben a tömb következő elemére lépsz, a fordító által generált kód szerint lesz 4-el nagyobb a címed. Ha karakter tömb címét adod át, a fordító csak 1-el fogja növelni a címet. Ennél egyszerűbben nem tudom megfogalmazni.
-
dabadab
titán
És ha már itt pointerezünk, akkor érdemes megemlíteni, hogy vannak dolgok, amiknek nincs címe, pl. általában literáloknak (a stringek kivételek) vagy függvények visszatérési értékének vagy műveletek eredményének:
double x;
double *p;
double **pp;
x=1.0;
p=&x; // OK
pp=&p; // OK
pp=&(&x); // error
p=&1.0; // error
p=&sin(x); // error[ Szerkesztve ]
DRM is theft
-
dobragab
addikt
válasz dabadab #5549 üzenetére
Igen.
Kicsit off, de hátha segít valakinek, ezért inkább leírom, ha már eszembe jutott.
int temp = 1;
evil_api_function_call(fp, ptr, &temp);C99-ben tudod lokális változónak is képezni a "címét" egy trükkel. Pontosabban: tudsz compound literal segítségével temp tömböt létrehozni egy elemmel, ami viszont már konvertálódik pointerre.
evil_api_function_call(fp, ptr, (int[]){1});
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
Ú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!
- Sorozatok
- Tippmix
- xDefiant teszt
- Max
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- AMD Ryzen 9 / 7 / 5 7***(X) "Zen 4" (AM5)
- sziku69: Fűzzük össze a szavakat :)
- Kedvenc zene a mai napra
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- További aktív témák...
Állásajánlatok
Cég: Alpha Laptopszerviz Kft.
Város: Pécs
Cég: Ozeki Kft.
Város: Debrecen