- One mobilszolgáltatások
- Xiaomi 17 - még mindig tart
- Fotók, videók mobillal
- Google Pixel topik
- Huawei Watch Fit 5 Pro - jó forma
- A Sony bemutatta eddigi legjobb és legdrágább zajszűrős fejhallgatóját
- Szívós, szép és kitartó az új OnePlus óra
- Xiaomi 17 Ultra - jó az optikája
- Yettel topik
- Xiaomi Watch 5 - kínai időszámítás
-
5600 - 5501
6397 - 6301 6300 - 6201 6200 - 6101 6100 - 6001 6000 - 5901 5900 - 5801 5800 - 5701 5700 - 5601 5600 - 5501 5500 - 5401 5400 - 5301 5300 - 5201 5200 - 5101 5100 - 5001 5000 - 4901 4900 - 4801 4800 - 4701 4700 - 4601 4600 - 4501 4500 - 4401 4400 - 4301 4300 - 4201 4200 - 4101 4100 - 4001 4000 - 2001 2000 - 1
-
Fórumok
Mobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokPROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Tabletek, E-bookok Nyomtatók, szkennerek PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
-
Frissítve: 2014-04-25 14:12 Téma összefoglaló
Új hozzászólás Aktív témák
-
dobragab
addikt
Sziasztok!
Ha valaki segít megoldani az alábbi feladatot, hálám örökké üldözni fogja. A szombati vizsgámhoz kellene megírnom sima C-ben, úgymond "egyetemes" programozással, nem összebarkácsolva, inputellenőrzésekkel stb. Nekifeküdtem már sokszor a programozásnak, de egyszerűen nem áll rá az agyam.
A feladat a következő:
400 nál nagyobb egész számokat kellett bekérni és azokat vizsgálni. Tömb méret nem volt megadva. Csak a példában 5 helyiértékes szám volt a legnagyobb azért azt vettem alapul. A számnak páratlan számjegyűnek kellett lennie , és tükrösnek (Pl:12321). A feladat hogy addig kérd be a helyes számot amíg 2 helyes számot nem kapsz. Hiba üzenetetek:
-nem szám a bemenet
-400nál kisebb a bemenet
-Nem páratlan számjegyű.
-Nem tükrös számÉletet mentene a segítség, ha tudom, viszonoznám!

Megírni nem fogom helyetted, de azért ötleteket adok.
Dönthetsz, hogy szövegként dolgozol-e vele, vagy számként. Előbbi esetben a karaktereket egyszerű összehasonlítani és a hosszát meghatározni. Ha számként használod, akkor egy kicsit több matek kell hozzá, de szebb a megoldás.
-
feketeg5
csendes tag
Sziasztok!
Ha valaki segít megoldani az alábbi feladatot, hálám örökké üldözni fogja. A szombati vizsgámhoz kellene megírnom sima C-ben, úgymond "egyetemes" programozással, nem összebarkácsolva, inputellenőrzésekkel stb. Nekifeküdtem már sokszor a programozásnak, de egyszerűen nem áll rá az agyam.
A feladat a következő:
400 nál nagyobb egész számokat kellett bekérni és azokat vizsgálni. Tömb méret nem volt megadva. Csak a példában 5 helyiértékes szám volt a legnagyobb azért azt vettem alapul. A számnak páratlan számjegyűnek kellett lennie , és tükrösnek (Pl:12321). A feladat hogy addig kérd be a helyes számot amíg 2 helyes számot nem kapsz. Hiba üzenetetek:
-nem szám a bemenet
-400nál kisebb a bemenet
-Nem páratlan számjegyű.
-Nem tükrös számÉletet mentene a segítség, ha tudom, viszonoznám!

-
EQMontoya
veterán
Ó én mindent, és meg is van az értelme.
Elsődlegesen Win8.1 + Classic Shell.
Ezen kívül:
arch linux + gnome3
ubuntu 14.04 + cinnamon
linux mint + cinnamon (már nem használom)
ubuntu 16.04 + kde5 (csak kipróbáltam, lassan kuka)
win7
win10 + classic shellMindez egy gépen. Amúgy az egyik cinnamonra kifejezetten büszke vagyok

Notin win7, nason (hp n54l) ubuntu, szerveren (bixben dell rack) debian.
Multiboot a kezdőknek való!![;]](//cdn.rios.hu/dl/s/v1.gif)
-
dobragab
addikt
Ó én mindent, és meg is van az értelme.
Elsődlegesen Win8.1 + Classic Shell.
Ezen kívül:
arch linux + gnome3
ubuntu 14.04 + cinnamon
linux mint + cinnamon (már nem használom)
ubuntu 16.04 + kde5 (csak kipróbáltam, lassan kuka)
win7
win10 + classic shellMindez egy gépen. Amúgy az egyik cinnamonra kifejezetten büszke vagyok

-
EQMontoya
veterán
-
dobragab
addikt
Köszi, ezt nem tudtam

Igen, és először csak virtuális gépre, hacsak nincs a közeledben veterán linuxos. Talán a Linux Mint-et mondanám kezdőknek, de Arch-ot semmiképp

-
dabadab
titán
A Cygwinben van fork() (elég munkás lehetett megcsinálni, mert a Win32 API-ban csak CreateProcess() van, az meg eléggé máshogy működik).
Ezzel együtt felrakni egy virtuális gépre Linuxot meg azzal játszogatni javasolt, mert elég komoly pedagógia értékkel bír

-
dobragab
addikt
Köszi a segítséget, közben nekem is sikerült úgy ahogy összedobnom, csak akadtak problémák, nevezetesen elkezdett sírni a program, hogy pipe meg a fork funkciók nincsenek definiálva...aztán leesett (meg utána olvastam), hogy ez valószínűleg a windows-os compiler miatt van, ami a linuxos dolgokat természetesen nem nagyon tudja lekezelni
szóval leszedtem egy elvileg működő compilert (cygwin), azzal már nem sír, konkrétan annyira nem csinál semmit, hogy még hibát se dob ki...mindegy, van egy elvileg működő kódom, a többit meg kimagyarázom, de azért köszi a helpet! 
Vagy gyártasz egy virtuális Ubuntut.
Windowson ez pont sose fog rendesen menni, még cross compilerrel sem (asszem, nem vagyok benne biztos), mert a fork-nak nincsen windowsos megfelelője. De valaki javítson ki, ha tévedek.
-
EQMontoya
veterán
Köszi a segítséget, közben nekem is sikerült úgy ahogy összedobnom, csak akadtak problémák, nevezetesen elkezdett sírni a program, hogy pipe meg a fork funkciók nincsenek definiálva...aztán leesett (meg utána olvastam), hogy ez valószínűleg a windows-os compiler miatt van, ami a linuxos dolgokat természetesen nem nagyon tudja lekezelni
szóval leszedtem egy elvileg működő compilert (cygwin), azzal már nem sír, konkrétan annyira nem csinál semmit, hogy még hibát se dob ki...mindegy, van egy elvileg működő kódom, a többit meg kimagyarázom, de azért köszi a helpet! 
Hát gondolom, valami egyetemi házihoz kell.
Szóval beputtyolsz valami egyetemi gépre, gcc-vel lefordítod, és... tádám! -
huwil
csendes tag
Köszi a segítséget, közben nekem is sikerült úgy ahogy összedobnom, csak akadtak problémák, nevezetesen elkezdett sírni a program, hogy pipe meg a fork funkciók nincsenek definiálva...aztán leesett (meg utána olvastam), hogy ez valószínűleg a windows-os compiler miatt van, ami a linuxos dolgokat természetesen nem nagyon tudja lekezelni
szóval leszedtem egy elvileg működő compilert (cygwin), azzal már nem sír, konkrétan annyira nem csinál semmit, hogy még hibát se dob ki...mindegy, van egy elvileg működő kódom, a többit meg kimagyarázom, de azért köszi a helpet! 
-
EQMontoya
veterán
-
huwil
csendes tag
-
EQMontoya
veterán
Hello! Szeretnék egy kis segítséget kérni. Holnap (szerda) délelőttre kellene ezt a két egyszerűnek tűnő programot megcsinálni és kellene hozzá segítség (konkrétan megcsinálni):
Irjon C nyelvu programot, ami
letrehoz ket csovezeteket (ket file deszkriptor part)
elforkol
a szulo elkuldi a sajat pidjet a gyerkmeknek az egyik csovon
a gyermek kiirja a kepernyore es visszkuldi egy az ovet a masik csovon
megszunnek a processzek (a szulo megvarja a gyereket)
és
Irjon C nyelvu programokat, ami
letrehoz egy nevesitett csovezeteket (bejegyzes az fs-en)
megnyitja
beleir valamit
kozben egy masik program kiolvassa a csovezetekbol
ezutan az elso program szinten ir bele valamit
a masik program ujbol kiolvassa
a processzek megszunnek es az elso program eltunteti a nevesitett csovezeteket
Előre is köszönöm, ha valaki tud és segít is benne!
Ha gyorsan utalsz paypalon...
![;]](//cdn.rios.hu/dl/s/v1.gif)
-
dabadab
titán
Nem akartam untatni a népet a teljes feladattal, illetve én is csak egy részét próbáltam megcsinálni első körben. Arról van szó, hogy van egy függvény, ami bekér három koordinátát, azaz csúcsonként hármat, tehát egy for ciklussal feltölti a csucsok tömböt 3x3 koordinátával, majd ezután visszaadja a haromszog típusú triangle struktúra címét. (Ezért kell, hogy pointer legyen a tömb típusa.) Ezt a címet veszi át egy másik függvény, ami elvégzi a lefoglalt terület felszabadítását. Eközben a főfüggvényben meg kell még oldani azt, hogy háromszög struktúrából (háromszögekből) is többet lehessen bevinni, méghozzá előre nem meghatározott darabot (dinamikus tömb).
A magyarázatod egyszerűsíthető úgy, hogy azért szállt el a program mert a tömb tele volt null pointerekkel, illetve a hiba a foglalással azért oldódott meg, mert a foglalás után a pointereknek már lett értékük? Tehát inicializálatlan pointerekkel nem dolgozunk?
"A magyarázatod egyszerűsíthető úgy [..]"
Igen.
-
aviator
tag
"Azért lett pointer a tömb típusa mert később a koordináták címeire lesz szükség."
Ez a hiba. Ha szükség van a koordináták címeire, akkor veszed a címüket a & operátorral

Azzal, hogy az a tömb koordinata* típusú, azt mondtad, hogy ez egy pointert tartalmaz egy koordinata structra - és ez ezt is jelenti. Amikor létrehozod a haromszoget, akkor az létrejön, lesz benne három pointer, amik nem mutatnak sehova (pontosabba valami tök véletlenszerű helyre mutatnak), persze, hogy úgy elszáll a program.
Kénytelen leszel feltölteni ezeket a pointereket kézzel, pl. úgy, hogy foglalsz három koordinata structot, aztán azoknak a pointereit berakod (és amikor nem kellenek, akkor majd nyomsz rájuk egy free-t is). Ez remek dolog, ha valamiért te szeretnéd foglalni ezeket vagy más helyen lefoglalt structok pointerét akarnád felhasználni, viszont úgy tűnik, hogy egyáltalán nem ezt akarod, hanem azt, hogy a fordító hozzon létre neked három koordinata structot, meg aztán majd szabadítsa is fel a megfelelő időben.Szóval ez kell neked:
typedef struct haromszog
{
koordinata csucsok[3];
}haromszog;
haromszog triangle;
scanf("%d %d %d", &(triangle->csucsok[0].x),&(triangle->csucsok[0].y),&(triangle->csucsok[0].z));Nem akartam untatni a népet a teljes feladattal, illetve én is csak egy részét próbáltam megcsinálni első körben. Arról van szó, hogy van egy függvény, ami bekér három koordinátát, azaz csúcsonként hármat, tehát egy for ciklussal feltölti a csucsok tömböt 3x3 koordinátával, majd ezután visszaadja a haromszog típusú triangle struktúra címét. (Ezért kell, hogy pointer legyen a tömb típusa.) Ezt a címet veszi át egy másik függvény, ami elvégzi a lefoglalt terület felszabadítását. Eközben a főfüggvényben meg kell még oldani azt, hogy háromszög struktúrából (háromszögekből) is többet lehessen bevinni, méghozzá előre nem meghatározott darabot (dinamikus tömb).
A magyarázatod egyszerűsíthető úgy, hogy azért szállt el a program mert a tömb tele volt null pointerekkel, illetve a hiba a foglalással azért oldódott meg, mert a foglalás után a pointereknek már lett értékük? Tehát inicializálatlan pointerekkel nem dolgozunk?
-
dabadab
titán
Tisztelt Szakértő Urak!
Újabb kérdésem lenne:
typedef struct koordinata
{
int x;
int y;
int z;
}koordinata;
typedef struct haromszog
{
koordinata* csucsok[3];
}haromszog;Tehát létre lett hozva egy koordináta struktúra három int mezővel, illetve egy háromszög struktúra egy háromelemű pointertömbbel: A háromszög struktúra egy 3D-s háromszöget tárol amelynek három csúcsa van, egy csúcsnak pedig három koordinátája. Azért lett pointer a tömb típusa mert később a koordináták címeire lesz szükség.
A továbbiakban egy egyszerű koordinátabekérést szeretnék csinálni a 0 indexű csúcsra a következő módon:
haromszog triangle; //struktúra típusú változó létrehozása
scanf("%d %d %d", &(triangle.csucsok[0]->x),&(triangle.csucsok[0]->y),&(triangle.csucsok[0]->z))Nem árulok el szerintem nektek újdonságot: ez így nem működik. Lefut, a fordító jónak látja de nem működik. Ti már biztos tudjátok az okát én még nem, viszont a megoldást igen:
haromszog* triangle=(haromszog*)malloc(sizeof(haromszog));
triangle->csucsok[0]=(koordinata*)malloc(sizeof(koordinata));
scanf("%d %d %d", &(triangle->csucsok[0]->x),&(triangle->csucsok[0]->y),&(triangle->csucsok[0]->z))Amit nem értek: miért nem működik lefoglalás nélkül? Miért kell a csúcsoknak is külön helyet foglalni? Azt hiszem sajnos ez már az a szint amikor nagyon összefüggéseiben kéne látnom a dolgokat, úgy tűnik ezzel hadilábon állok.
A válaszokat előre is köszönöm, aki esetleg érez némi motivációt arra, hogy egy kicsit részletesebben elmesélje ezt nekem, felépítve egy gondolatmenetet ami alapján érthetőbbé válik, hogy mi miért van, mi miből következik azzal sokat segítene...akár privátban is, hogy ne terheljük másoknak triviális dolgokkal a fórumot.
"Azért lett pointer a tömb típusa mert később a koordináták címeire lesz szükség."
Ez a hiba. Ha szükség van a koordináták címeire, akkor veszed a címüket a & operátorral

Azzal, hogy az a tömb koordinata* típusú, azt mondtad, hogy ez egy pointert tartalmaz egy koordinata structra - és ez ezt is jelenti. Amikor létrehozod a haromszoget, akkor az létrejön, lesz benne három pointer, amik nem mutatnak sehova (pontosabba valami tök véletlenszerű helyre mutatnak), persze, hogy úgy elszáll a program.
Kénytelen leszel feltölteni ezeket a pointereket kézzel, pl. úgy, hogy foglalsz három koordinata structot, aztán azoknak a pointereit berakod (és amikor nem kellenek, akkor majd nyomsz rájuk egy free-t is). Ez remek dolog, ha valamiért te szeretnéd foglalni ezeket vagy más helyen lefoglalt structok pointerét akarnád felhasználni, viszont úgy tűnik, hogy egyáltalán nem ezt akarod, hanem azt, hogy a fordító hozzon létre neked három koordinata structot, meg aztán majd szabadítsa is fel a megfelelő időben.Szóval ez kell neked:
typedef struct haromszog
{
koordinata csucsok[3];
}haromszog;
haromszog triangle;
scanf("%d %d %d", &(triangle->csucsok[0].x),&(triangle->csucsok[0].y),&(triangle->csucsok[0].z)); -
aviator
tag
Tisztelt Szakértő Urak!
Újabb kérdésem lenne:
typedef struct koordinata
{
int x;
int y;
int z;
}koordinata;
typedef struct haromszog
{
koordinata* csucsok[3];
}haromszog;Tehát létre lett hozva egy koordináta struktúra három int mezővel, illetve egy háromszög struktúra egy háromelemű pointertömbbel: A háromszög struktúra egy 3D-s háromszöget tárol amelynek három csúcsa van, egy csúcsnak pedig három koordinátája. Azért lett pointer a tömb típusa mert később a koordináták címeire lesz szükség.
A továbbiakban egy egyszerű koordinátabekérést szeretnék csinálni a 0 indexű csúcsra a következő módon:
haromszog triangle; //struktúra típusú változó létrehozása
scanf("%d %d %d", &(triangle.csucsok[0]->x),&(triangle.csucsok[0]->y),&(triangle.csucsok[0]->z))Nem árulok el szerintem nektek újdonságot: ez így nem működik. Lefut, a fordító jónak látja de nem működik. Ti már biztos tudjátok az okát én még nem, viszont a megoldást igen:
haromszog* triangle=(haromszog*)malloc(sizeof(haromszog));
triangle->csucsok[0]=(koordinata*)malloc(sizeof(koordinata));
scanf("%d %d %d", &(triangle->csucsok[0]->x),&(triangle->csucsok[0]->y),&(triangle->csucsok[0]->z))Amit nem értek: miért nem működik lefoglalás nélkül? Miért kell a csúcsoknak is külön helyet foglalni? Azt hiszem sajnos ez már az a szint amikor nagyon összefüggéseiben kéne látnom a dolgokat, úgy tűnik ezzel hadilábon állok.
A válaszokat előre is köszönöm, aki esetleg érez némi motivációt arra, hogy egy kicsit részletesebben elmesélje ezt nekem, felépítve egy gondolatmenetet ami alapján érthetőbbé válik, hogy mi miért van, mi miből következik azzal sokat segítene...akár privátban is, hogy ne terheljük másoknak triviális dolgokkal a fórumot.
-
huwil
csendes tag
Hello! Szeretnék egy kis segítséget kérni. Holnap (szerda) délelőttre kellene ezt a két egyszerűnek tűnő programot megcsinálni és kellene hozzá segítség (konkrétan megcsinálni):
Irjon C nyelvu programot, ami
letrehoz ket csovezeteket (ket file deszkriptor part)
elforkol
a szulo elkuldi a sajat pidjet a gyerkmeknek az egyik csovon
a gyermek kiirja a kepernyore es visszkuldi egy az ovet a masik csovon
megszunnek a processzek (a szulo megvarja a gyereket)
és
Irjon C nyelvu programokat, ami
letrehoz egy nevesitett csovezeteket (bejegyzes az fs-en)
megnyitja
beleir valamit
kozben egy masik program kiolvassa a csovezetekbol
ezutan az elso program szinten ir bele valamit
a masik program ujbol kiolvassa
a processzek megszunnek es az elso program eltunteti a nevesitett csovezeteket
Előre is köszönöm, ha valaki tud és segít is benne!
-
Jester01
veterán
sizeof(&tomb) <= sizeof(void*)
Ez sem feltétlenül igaz, de eléggé mesterségesen kitalált rendszer kellene hozzá. A valóságban nem hiszem, hogy lenne olyan. De logikailag a kompatibilitásból nem következik a méret. -
dobragab
addikt
És tényleg. Tegnap nem voltam toppon

Viszont mivel a void* mindenfajta pointerrel (kivéve függvényre mutató pointerekkel) kompatibilis, ezért sizeof(&tomb) <= sizeof(void*). Tény, hogy nem feltétlenül adja ugyanazt elvadult architektúrákon.
-
EQMontoya
veterán
Nem a típustól függ, hanem az elhelyezkedéstől.
nyilván sizeof((void*)tomb) == sizeof(&tomb).Viszont két, azonos típusra mutató ptr nem feltétlen ugynaakkora. Persze x86-on nem lesz különbség, de amúgy, főleg embedded rendszerek esetén lehet. (mondjuk stack, heap és static között)
-
dobragab
addikt
Mindig tanul az ember valamit

Tudomásom szerint sizeof(void*) ugyanazt adja, de tény, hogy ronda hack, szebb az a sizeof(&tomb).
Ebből majd csinálok egy mitírkit C++ topikba, aki olvassa, majd ne lője le pls.
Persze azért kicsavarom rendesen. -
EQMontoya
veterán
És ennek egyetlen értelme, hogy ha a tömb kezdetére mutató pointer méretét akarod megnézni, azt meg tudd tenni sizeof(&tomb) formában.

-
dobragab
addikt
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é.
Benéztem, tényleg van a tömbnek & operátora. Ha & operátort alkalmazol a tömbre, akkor előtte nem konvertálódik pointerré: az maga a konverzió.
int tomb[10];
printf("%p\n%p\n", tomb, &tomb); -
Jester01
veterán
Jól mondod.
Az egyszerűség kedvéért úgy is lehet definiálni, hogy a tömbön mint típuson két művelet értelmezett:
- sizeof
- automatikus konverzió, ami a tömb első elemére mutató pointerré konvertáljaEbből minden más, tömbökre jellemző tulajdonság levezethető:
- indexelni is "csak" a pointert tudjuk, az indexelés meg ugye ekvivalens egy címszámítással és egy dereferálással
- a tomb + 5 kifejezés nem azt jelenti, hogy a tömbhöz adunk ötöt, hanem az elejére mutató pointerhez, azaz a tömb ötödik elemére mutató pointert jelenti
- *tomb egy dereferálás, mégpedig a tömb első elemét jelenti
- a címét nem képezhetjük, hiszen ahhoz először pointerré konvertálódik, az így keletkezett temporális objektumnak nem képezhető a címe
- tömbnek nem adhatunk értéket, hiszen a konverzió eredménye temporális objektum, ami C-ben nem balérték
- függvényparaméterként csak úgy adhatjuk át, hogy előtte pointerré konvertálódik
- ha struktúrába rakod, a neki lefoglalt hely természetesen sizeof(tomb) lesza 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é.
-
dobragab
addikt
"A tömb pedig ekvivalens a pointerrel"
Na na! Csak óvatosan! Pointernek adhatsz értéket, tömbnek nem. Ez egy igen lényeges különbség. A tömb, mint cím, fordítás idejű konstans, míg a pointer egy változó, ami futás időben kap értéket. Pointernek veheted a címét (hiszen változó), tömbnek pedig nem (mármint char array[10]; char **p=&array; utasításoknak nincs értelme, míg char *p; char **pp=&p; -nek pedig van). Az, hogy a C-ben és C++ -ban szemantikailag nincs eléggé megkülönböztetve a pointer és a tömb, az a nyelv egyik hiányossága, amellett, hogy nagyfokú rugalmasságot is biztosít.
C++ -ban például teljesen helyénvaló származtatott osztály pointert (D *) publikus ősosztály pointerként (B *) használni, míg D ** pointer B ** pointerként való használata tiltott, nyilvánvaló okok miatt. Ugyanakkor nyugodtan meg lehetne engedni D *[] típusú változó B *[]-ként való használatát, azonban ezt mégsem lehet, mivel nincs eléggé megkülönböztetve a pointer és a tömb.Jól mondod.
Az egyszerűség kedvéért úgy is lehet definiálni, hogy a tömbön mint típuson két művelet értelmezett:
- sizeof
- automatikus konverzió, ami a tömb első elemére mutató pointerré konvertáljaEbből minden más, tömbökre jellemző tulajdonság levezethető:
- indexelni is "csak" a pointert tudjuk, az indexelés meg ugye ekvivalens egy címszámítással és egy dereferálással
- a tomb + 5 kifejezés nem azt jelenti, hogy a tömbhöz adunk ötöt, hanem az elejére mutató pointerhez, azaz a tömb ötödik elemére mutató pointert jelenti
- *tomb egy dereferálás, mégpedig a tömb első elemét jelenti
- a címét nem képezhetjük, hiszen ahhoz először pointerré konvertálódik, az így keletkezett temporális objektumnak nem képezhető a címe
- tömbnek nem adhatunk értéket, hiszen a konverzió eredménye temporális objektum, ami C-ben nem balérték
- függvényparaméterként csak úgy adhatjuk át, hogy előtte pointerré konvertálódik
- ha struktúrába rakod, a neki lefoglalt hely természetesen sizeof(tomb) lesz -
jattila48
aktív tag
"A tömb pedig ekvivalens a pointerrel"
Na na! Csak óvatosan! Pointernek adhatsz értéket, tömbnek nem. Ez egy igen lényeges különbség. A tömb, mint cím, fordítás idejű konstans, míg a pointer egy változó, ami futás időben kap értéket. Pointernek veheted a címét (hiszen változó), tömbnek pedig nem (mármint char array[10]; char **p=&array; utasításoknak nincs értelme, míg char *p; char **pp=&p; -nek pedig van). Az, hogy a C-ben és C++ -ban szemantikailag nincs eléggé megkülönböztetve a pointer és a tömb, az a nyelv egyik hiányossága, amellett, hogy nagyfokú rugalmasságot is biztosít.
C++ -ban például teljesen helyénvaló származtatott osztály pointert (D *) publikus ősosztály pointerként (B *) használni, míg D ** pointer B ** pointerként való használata tiltott, nyilvánvaló okok miatt. Ugyanakkor nyugodtan meg lehetne engedni D *[] típusú változó B *[]-ként való használatát, azonban ezt mégsem lehet, mivel nincs eléggé megkülönböztetve a pointer és a tömb. -
Jester01
veterán
-
aviator
tag
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.
Nagyszerű! Köszönöm.
A kiíratás problémában is segítesz légyszi? Printf-ben egy pointer szerepel és string-et ír ki. Hogy van ez? -
Jester01
veterán
char szoveg[101];
char*szpt;
scanf("%s",szoveg);
szpt=(char*)malloc(sizeof(char)*((strlen(szoveg))+1));
strcpy(szpt,szoveg);
printf("%s",szpt);
free(szpt);Újabb hasonló probléma. A strcpy itt elméletileg egy char típusú tömböt másol egy char* típusú tömbbe, ami nem lenne lehetséges. Sejtem, hogy az előző "indexelés megeszi a pointert" dolognak lesz itt is jelentősége, gondolom itt az indexelés a string-ben áll annak ellenére, hogy nem látszik az indexelő [] operátor. Kiíratáskor pedig látszólag string-ként íródik ki a pointer típus.
Amit nem értek az az, hogy a strcpy két paramétere hogy lesz azonos típusú, melyiknek változik meg a típusa (ha egyáltalán megváltozik) és miért, illetve, hogy a kiíratáskor hogy lesz a pointerből kiíratható string.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.
-
aviator
tag
char szoveg[101];
char*szpt;
scanf("%s",szoveg);
szpt=(char*)malloc(sizeof(char)*((strlen(szoveg))+1));
strcpy(szpt,szoveg);
printf("%s",szpt);
free(szpt);Újabb hasonló probléma. A strcpy itt elméletileg egy char típusú tömböt másol egy char* típusú tömbbe, ami nem lenne lehetséges. Sejtem, hogy az előző "indexelés megeszi a pointert" dolognak lesz itt is jelentősége, gondolom itt az indexelés a string-ben áll annak ellenére, hogy nem látszik az indexelő [] operátor. Kiíratáskor pedig látszólag string-ként íródik ki a pointer típus.
Amit nem értek az az, hogy a strcpy két paramétere hogy lesz azonos típusú, melyiknek változik meg a típusa (ha egyáltalán megváltozik) és miért, illetve, hogy a kiíratáskor hogy lesz a pointerből kiíratható string. -
aviator
tag
-
Jester01
veterán
typedef struct koordinata
{
int x;
int y;
int z;
} koordinata;
void beolvas(koordinata* pont)
{
scanf("%d %d %d",&(pont->x),&(pont->y),&(pont->z));
}
int main()
{
int a,i;
printf("Kerem a koordinatak szamat");
scanf("%d",&a);
koordinata* koord = (koordinata*) malloc(sizeof(koordinata)*a);
for(i=0;i<a;i++)
{
beolvas(&koord[i]);
}
for(i=0;i<a;i++)
{
printf("(%d;%d;%d)",koord[i].x,koord[i].y,koord[i].z);
}
free(koord);
return 0;
}Üdv!
A feladat itt az volt, hogy függvénnyel töltsek fel egy koordinátákat tároló struktúrát ahol a struktúrák egy dinamikus tömb elemei. A feladatot sikerült megoldani, a kód így működőképes, egy dolgot viszont nagyon nem értek: A nyíl operátort ha jól tudom akkor használjuk, ha pointeren keresztül akarjuk elérni egy struktúra mezőit. Ha pointer nélkül hivatkozunk akkor a pont operátort használjuk. Ha ez így van, akkor miért van az, hogy a függvény definíciójában a pointer típusú, pont nevű paraméteren keresztül nyíllal hivatkozok a mezőkre, alul a kiíratásnál pedig már ponttal, annak ellenére, hogy a koord változó még mindig koordináta típusú pointer?
Azért mert az indexelés [] már megette a pointert

Ugyebár definíció szerint x[i] = *(x + i) -
aviator
tag
typedef struct koordinata
{
int x;
int y;
int z;
} koordinata;
void beolvas(koordinata* pont)
{
scanf("%d %d %d",&(pont->x),&(pont->y),&(pont->z));
}
int main()
{
int a,i;
printf("Kerem a koordinatak szamat");
scanf("%d",&a);
koordinata* koord = (koordinata*) malloc(sizeof(koordinata)*a);
for(i=0;i<a;i++)
{
beolvas(&koord[i]);
}
for(i=0;i<a;i++)
{
printf("(%d;%d;%d)",koord[i].x,koord[i].y,koord[i].z);
}
free(koord);
return 0;
}Üdv!
A feladat itt az volt, hogy függvénnyel töltsek fel egy koordinátákat tároló struktúrát ahol a struktúrák egy dinamikus tömb elemei. A feladatot sikerült megoldani, a kód így működőképes, egy dolgot viszont nagyon nem értek: A nyíl operátort ha jól tudom akkor használjuk, ha pointeren keresztül akarjuk elérni egy struktúra mezőit. Ha pointer nélkül hivatkozunk akkor a pont operátort használjuk. Ha ez így van, akkor miért van az, hogy a függvény definíciójában a pointer típusú, pont nevű paraméteren keresztül nyíllal hivatkozok a mezőkre, alul a kiíratásnál pedig már ponttal, annak ellenére, hogy a koord változó még mindig koordináta típusú pointer?
-
EQMontoya
veterán
Neked az identifier.c-t kell megírnod, amiben van egy megadott deklarációjú függvény, abba bármit include-olhatsz. A feladat nem várja, hogy a ctype.h-t ne használd, sőt.
Üres sor problémára: az üres sort a gets üres sztringként olvassa be (""), így üres sztringként kapod meg a nevet.
Btw szégyen, hogy versenyen a skeleton-ban gets van.
Btw szégyen, hogy versenyen a skeleton-ban gets van.
Alapvetően jogos. De életre nevel, sajnos.
Hidd el, a való életben is mindig van lejjebb.
-
dabadab
titán
akkor ezek szerint a string.h is használható! ezzel meg is oldódott a problémám, egy strlen segítségével könnyedén meglett az a fránya üres sor is
(másképp én nem tudtam megoldani)el is fogadta a kódot, úgyhogy köszi szépen
(hamarosan jövök újabb kérdésekkel
)ez a feladat nem kifejezetten verseny feladat, csak egy beugró. szerencsére/sajnos itt még alap dolgok vannak. minden esetre én egyelőre vizsgán szeretnék átmenni, úgyhogy az egyszerűsítésnek csak örülni tudok

"egy strlen segítségével könnyedén meglett az a fránya üres sor is (másképp én nem tudtam megoldani)"
char *s;
...
if ( s[0] == 0 )
{
// empty line
...
} -
bepken
veterán
Neked az identifier.c-t kell megírnod, amiben van egy megadott deklarációjú függvény, abba bármit include-olhatsz. A feladat nem várja, hogy a ctype.h-t ne használd, sőt.
Üres sor problémára: az üres sort a gets üres sztringként olvassa be (""), így üres sztringként kapod meg a nevet.
Btw szégyen, hogy versenyen a skeleton-ban gets van.
akkor ezek szerint a string.h is használható! ezzel meg is oldódott a problémám, egy strlen segítségével könnyedén meglett az a fránya üres sor is
(másképp én nem tudtam megoldani)el is fogadta a kódot, úgyhogy köszi szépen
(hamarosan jövök újabb kérdésekkel
)ez a feladat nem kifejezetten verseny feladat, csak egy beugró. szerencsére/sajnos itt még alap dolgok vannak. minden esetre én egyelőre vizsgán szeretnék átmenni, úgyhogy az egyszerűsítésnek csak örülni tudok

-
dobragab
addikt
sziasztok,
közel vagyok egy feladat megoldásához, de sajnos nem vagyok benne biztos, hogy jó úton indultam el....
vizsgálni kell többek között, hogy az adott sor tartalmaz e nagybetűt és számot. na most ezt eddigi ismereteim szerint legegyszerűbben a <ctype.h> könyvtár függvényeivel tudom megoldani. viszont a feladatban van egy előre megadott main függvény, amiben ez a könyvtár nincs megadva.
gondolom include csak elől szerepelhet, bár compiler nem szólt függvényen belül sem. de esetleg meg lehet ezt oldani az említett fv.könyvtár nélkül is? mármint...gondolom ezt várná a feladat.a másik problémám, amit viszont egyáltalán nem tudtam lekezelni: az a példabemenet 7. sorában lévő üres sor. ezt hogy a fenébe kellene lekezelni, hogy a függvény megfelelően működjön?
ezeket leszámítva az általam írt megoldás minden bemenetre megfelelő értéket adott. egyelőre általánosságban kérdezősködök, de természetesen tudok mutatni kódot is.
köszi előre is,
bepkenNeked az identifier.c-t kell megírnod, amiben van egy megadott deklarációjú függvény, abba bármit include-olhatsz. A feladat nem várja, hogy a ctype.h-t ne használd, sőt.
Üres sor problémára: az üres sort a gets üres sztringként olvassa be (""), így üres sztringként kapod meg a nevet.
Btw szégyen, hogy versenyen a skeleton-ban gets van.
-
bepken
veterán
sziasztok,
közel vagyok egy feladat megoldásához, de sajnos nem vagyok benne biztos, hogy jó úton indultam el....
vizsgálni kell többek között, hogy az adott sor tartalmaz e nagybetűt és számot. na most ezt eddigi ismereteim szerint legegyszerűbben a <ctype.h> könyvtár függvényeivel tudom megoldani. viszont a feladatban van egy előre megadott main függvény, amiben ez a könyvtár nincs megadva.
gondolom include csak elől szerepelhet, bár compiler nem szólt függvényen belül sem. de esetleg meg lehet ezt oldani az említett fv.könyvtár nélkül is? mármint...gondolom ezt várná a feladat.a másik problémám, amit viszont egyáltalán nem tudtam lekezelni: az a példabemenet 7. sorában lévő üres sor. ezt hogy a fenébe kellene lekezelni, hogy a függvény megfelelően működjön?
ezeket leszámítva az általam írt megoldás minden bemenetre megfelelő értéket adott. egyelőre általánosságban kérdezősködök, de természetesen tudok mutatni kódot is.
köszi előre is,
bepken -
bepken
veterán
Ha csak else ág lenne, akkor azokat a karaktereket számolná össze, ami nem szóköz, új sor vagy tabulátor.
Így a szavak kezdőkarakterét számolja össze, ami megegyezik a szavak számával (mivel minden szónak csak egy kezdőkaraktere van).Ezért kellett az állapotgép (KINT, BENT), hogy meglehessen különböztetni a kezdőbetűt, a szó belsejében lévő betűtől.
azt hiszem, így már leesett, miért kaptam ezeket az értékeket (minden fehér karaktertől eltérőt összeszámoltam a bemenetről
) köszi szépen a gyors választ! 
még talán annyi, hogy ha az else if (allapot == KINT) helyett miért nem írható pl: else if (1) - ezt a részét még nem értem. mármint ha KINT állapotban vagyunk, akkor beugrik erre az ágra és átváltja az értéket BENT-re, majd a ciklus elején lehet újra KINT-re változik. na de miért épp ez a feltétel?
-
kispx
addikt
sziasztok,
még csak ismerkedek a C programozási nyelvvel (bár nem ez az első nekifutásom) - egyszer már elolvastam a Kernighan-Ritchie féle könyvet, most elölről kezdtem és a példákon is végig megyek.
van (még egészen az elején) egy példakód, aminek egy "aprócska" része nem igazán világos számomra: 1.5.4. Szavak számlálása fejezet példakódjáról van szó.
az egészből egész pontosan ezt a kódrészletet nem értem:
if (c == ' ' || c == '\n' || c == '\t')
allapot = KINT;
else if (allapot == KINT) {
allapot = BENN;
++nw;
}egész konkrétan az else if ágat nem értem belőle. az megvan, hogy a két állapot (KINT/BENN) között kell váltogatni, de miért így van megírva az else if feltétele? ha jól értem, csak azért, hogy beugorjon abba az ágba, átváltson BENN értékre és növelje az nw változó értékét...jól értem? csak mert ülök már felette jónéhány perce

egyébként mire leírtam mégis csak koppanni látszik...na de akkor annyit ha segítenétek, hogy miért nem lehet a helyén egy sima else ág? vagy az allapot == KINT feltétel helyén egy akármilyen igaz feltétel?
köszi előre is a segítő szavakat
(remélem, nem kérdezek nagy baromságot)üdv,
bepkenHa csak else ág lenne, akkor azokat a karaktereket számolná össze, ami nem szóköz, új sor vagy tabulátor.
Így a szavak kezdőkarakterét számolja össze, ami megegyezik a szavak számával (mivel minden szónak csak egy kezdőkaraktere van).Ezért kellett az állapotgép (KINT, BENT), hogy meglehessen különböztetni a kezdőbetűt, a szó belsejében lévő betűtől.
-
bepken
veterán
sziasztok,
még csak ismerkedek a C programozási nyelvvel (bár nem ez az első nekifutásom) - egyszer már elolvastam a Kernighan-Ritchie féle könyvet, most elölről kezdtem és a példákon is végig megyek.
van (még egészen az elején) egy példakód, aminek egy "aprócska" része nem igazán világos számomra: 1.5.4. Szavak számlálása fejezet példakódjáról van szó.
az egészből egész pontosan ezt a kódrészletet nem értem:
if (c == ' ' || c == '\n' || c == '\t')
allapot = KINT;
else if (allapot == KINT) {
allapot = BENN;
++nw;
}egész konkrétan az else if ágat nem értem belőle. az megvan, hogy a két állapot (KINT/BENN) között kell váltogatni, de miért így van megírva az else if feltétele? ha jól értem, csak azért, hogy beugorjon abba az ágba, átváltson BENN értékre és növelje az nw változó értékét...jól értem? csak mert ülök már felette jónéhány perce

egyébként mire leírtam mégis csak koppanni látszik...na de akkor annyit ha segítenétek, hogy miért nem lehet a helyén egy sima else ág? vagy az allapot == KINT feltétel helyén egy akármilyen igaz feltétel?
köszi előre is a segítő szavakat
(remélem, nem kérdezek nagy baromságot)üdv,
bepken -
dobragab
addikt
Igen, ugyanarról beszéltek. Futásidőben már nem tudható a pointer típusa, de fordítási időben baromi fontos. Onnan tudja a fordító, hogy pointer aritmetika / tömbindexelés esetén hány bájt offset-je van a következő elemnek.
int * a = tomb;
int * b = a + 1; // 4 bájttal tolta arrébb
char * c = "text";
char * d = c + 1; // 1 bájttal tolta arrébbFeltéve, hogy az int 4 bájtos.
-
zka67
őstag
-
dabadab
titán
Nem, dehogy. Azt mondják, hogy a & operátor eredménye nem egyszerűen egy érték, hanem egy típusos érték - és ebben teljesen igazuk van: a fordító pontosan tudja, hogy az milyen típusú pointer.
-
zka67
őstag
Dehát erről beszélek! Itt mindenki meg van győződve róla, hogy a C-ben a pointerek tárolják a típust is, ami nem igaz.
-
dabadab
titán
Szia,
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)
Mint említettem, fizikailag a pointer egy (memória)címet tartalmaz, ami egy egyszerű szám (ez lehet 16, 32 vagy akár 64 bites érték is, rendszertől függően, de ebbe most ne menjünk bele). A pointer típusát a fordító kezeli, magából a pointer értékéből ez nem derül ki, mivel nem tárolja azt.
Az eredeti kérdés az az volt, hogy a pointer elé miért nem kell a & jel, ezt próbáltam meg konyhanyelven elmagyarázni a kérdezőnek, hogy megértse.
int main(int argc, char* argv[])
{
char c;
char *p;
p = &c;
printf("sizeof(c)=%d, sizeof(p)=%d, p=%08X\r\n", sizeof(c), sizeof(p), p);
return 0;
}Ennek az eredménye az alábbi:
sizeof(c)=1, sizeof(p)=4, p=0018FF53azaz a c változó a 0x0018FF53-as memóriacímen található. Nincs a p változóban semmilyen típus, csak a változó címe.
"Nincs a p változóban semmilyen típus, csak a változó címe."
Nem, ezzel azt mutattad meg, hogy C-ben a típusok kezelése nem futásidőben, hanem fordításkor történik. Semmilyen változónál nem tárol típusinformációt a C, csak az értéket.
-
zka67
őstag
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)
Szia,
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)
Mint említettem, fizikailag a pointer egy (memória)címet tartalmaz, ami egy egyszerű szám (ez lehet 16, 32 vagy akár 64 bites érték is, rendszertől függően, de ebbe most ne menjünk bele). A pointer típusát a fordító kezeli, magából a pointer értékéből ez nem derül ki, mivel nem tárolja azt.
Az eredeti kérdés az az volt, hogy a pointer elé miért nem kell a & jel, ezt próbáltam meg konyhanyelven elmagyarázni a kérdezőnek, hogy megértse.
int main(int argc, char* argv[])
{
char c;
char *p;
p = &c;
printf("sizeof(c)=%d, sizeof(p)=%d, p=%08X\r\n", sizeof(c), sizeof(p), p);
return 0;
}Ennek az eredménye az alábbi:
sizeof(c)=1, sizeof(p)=4, p=0018FF53azaz a c változó a 0x0018FF53-as memóriacímen található. Nincs a p változóban semmilyen típus, csak a változó címe.
-
Jester01
veterán
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.
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)
-
ToMmY_hun
senior tag
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.
Oké, hasonló dolgot sejtettem én is a háttérben, viszont a kolléga pont az ellenkezőjét írta.
Köszi a felvilágosítást. -
dobragab
addikt
É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); // errorIgen.
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});
-
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 -
zka67
őstag
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.
-
ToMmY_hun
senior tag
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"
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.
-
Jester01
veterán
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"
-
ToMmY_hun
senior tag
Az & cím képző operátor, nem pointer készítő. Szimplán annyit csinál, hogy visszaadja a memória címét annak az elemnek, amit beadsz neki a jobb oldalon.
-
zka67
őstag
Szia, bocs hogy beleszólok, de a legegyszerűbben így érted meg, hogy a & jel csinál pointert a változódból. Mivel a pointer már pointer, eztért nem kell hozzá külön a & jel.
-
Jester01
veterán
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. -
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.
-
dobragab
addikt
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
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.
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.
-
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.
-
alapz@j
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.
Nincsenek megadva a textúra-koordináták.
-
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.
-
Gyb001
senior tag
-
EQMontoya
veterán
-
dobragab
addikt
-
Gyb001
senior tag
Sajnos muszáj. Grafika beadandó házi feladat

Végül is VS 2013 mellett döntöttem. -
alapz@j
tag
Van valamilyen oka annak, hogy GLUT-ot használnál ablakkezelésre? Jobban járnál valamivel ebből az évtizedből (évszázadból?): GLFW, SDL2, stb. Plusz nem hiszem, hogy az IDE bármivel is segítene OpenGL programozásban...
-
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? -
dobragab
addikt
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.

-
EQMontoya
veterán
-
dobragab
addikt
-
EQMontoya
veterán
-
dobragab
addikt
-
dabadab
titán
-
dobragab
addikt
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".
-
dabadab
titá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.if (wg_index >= num_workgroups)
wg_index -= num_workgroups;Itt is jobb lenne egy wg_index %= num_workgroups;
-
dobragab
addikt
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.

Duplán borzasztó.
-
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. -
nonsen5e
veterán
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.
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!
-
Karma
félisten
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;
}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.
-
nonsen5e
veterán
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;
} -
mepet
addikt
Nem, még nem tapasztaltam ilyesmit.
-
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.

-
dobragab
addikt
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.
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.
-
alapz@j
tag
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.
PellesC, MinGW, Tcc, ezek mind működnek. MinGW-ből én a http://nuwen.net/mingw.html -t használom.
-
aleister
veterán
-
EQMontoya
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.
VS2015 c++ fordítójának nyugodtan írhatsz C kódot, nem nagyon fogsz észrevenni különbséget.
Egyébként régebbi VS-ek tudtak C-t.
-
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.
-
alapz@j
tag
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
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...
-
mepet
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
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
-
don_peter
senior tag
-
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
-
mepet
addikt
-
dobragab
addikt
Fun fact: C-ben és C++-ban nem ugyanaz

-
don_peter
senior tag
-
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?
-
mepet
addikt
-
don_peter
senior tag
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.
Új hozzászólás Aktív témák
-
5600 - 5501
6397 - 6301 6300 - 6201 6200 - 6101 6100 - 6001 6000 - 5901 5900 - 5801 5800 - 5701 5700 - 5601 5600 - 5501 5500 - 5401 5400 - 5301 5300 - 5201 5200 - 5101 5100 - 5001 5000 - 4901 4900 - 4801 4800 - 4701 4700 - 4601 4600 - 4501 4500 - 4401 4400 - 4301 4300 - 4201 4200 - 4101 4100 - 4001 4000 - 2001 2000 - 1
-
Fórumok
Mobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokPROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Tabletek, E-bookok Nyomtatók, szkennerek PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Proxmox VE
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- One mobilszolgáltatások
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Mesterséges intelligencia topik
- gban: Ingyen kellene, de tegnapra
- EAFC 26
- Fejhallgató erősítő és DAC topik
- Autós topik
- HiFi műszaki szemmel - sztereó hangrendszerek
- További aktív témák...
- Kingston KC3000 PCIe 4.0 NVMe M.2 2TB-os, bontatlan SSD, 2 év garanciával eladó!
- Samsung 990 Pro 1TB-os PCIe 4.0 M.2 NVMe 2280 SSD, bontatlanul, 2 év garanciával eladó!
- ADATA Legend 900 Pro 2TB-os PCIe Gen4 M.2 NVMe 2280 SSD, bontatlanul, 5 év garanciával eladó!
- AMD R7 350X és RX550 VGA kártyák
- Megvigyázott, 3,5 éves, 128 Gb, iPhone 13, 81% akku
- Akció!!! Sosemhasznált! HP OmniBook 5 i5-1334U 16GB 1TB 16" FHD+ Gar.: 1 év
- BESZÁMÍTÁS! AMD Ryzen 9 3900X 12 mag 24 szál processzor garanciával hibátlan működéssel
- AKCIÓ! Apple MacBook Pro 14 M4 Max 36GB RAM 1TB SSD macbook garanciával hibátlan működéssel
- AKCIÓ - Surface 4 - 15" 2496 x 1664 ~2k touch, i7-1185G7, 16GB RAM, SSD, jó akku, számla, 6 hó gar
- Samsung Galaxy A54 5G 256GB, Kártyafüggetlen, 1 Év Garanciával
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest



![;]](http://cdn.rios.hu/dl/s/v1.gif)


)


)
Köszi a felvilágosítást.
locks-ot találtam. egyéb ötlet?



