Új hozzászólás Aktív témák
-
aviator
tag
válasz
dabadab
#5585
üzenetére
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?
-
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.
-
aviator
tag
válasz
aviator
#5569
üzenetére
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
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?
-
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.
-
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.
Ú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!
- Az olcsó Macbook sokkolja a PC-ipart az ASUS társvezetője szerint
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Nem lesz Redmi Note 16, évet ugrik a sorozat
- Diablo IV
- Gitáros topic
- Azonnali VGA-s kérdések órája
- Háztartási gépek
- Honor 200 Pro - mobilportré
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- PlayStation 5
- További aktív témák...
- Ryzen7 5700G/ 32GB DDR4/ 1TB m.2 alapú mini PC/ garancia
- AKCIÓ! iMac Pro Intel Xeon W2150B 64GB 1TB VEGA 64 16GB!!! 1 év garancia!
- Dell Latitude 5591 i7/500GB M2 SSD/ 32GB DDR4
- Honor Magic8 Lite 8/256GB Újszerű,Kártyafüggetlen,Dobozos,Tartozékaival. 1 Év Garanciával!
- Samsung Galaxy S26 Ultra 12/512GB Új,Kártyafüggetlen,Dobozos,Tartozékaival. 1 Év Garanciával!
- Xiaomi Redmi Note 15 5G 256GB, Kártyafüggetlen, 1 Év Garanciával
- Dobozos, új, gyári magyar világítós bill E14 G4 i5-1235u, 40Gb ram, 256Gb NVMe, áfás számla
- Vállalom Xiaomi Okoskamerák szoftveres javíttását
- MEGA Akció! Számla + garancia! Apple Macbook Pro 14 - Apple M3 Pro Chip!
- Telefon felvásárlás!! Samsung Galaxy S23/Samsung Galaxy S23+/Samsung Galaxy S23 Ultra
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Sajnos ilyen apróságok kimaradnak ha önállóan tanul programozni az ember.