Hogyan konvertáljam át C-ben egy egyszerűbb függvénynél a struct típust int-re? (Már ha egyáltalán át kell. )
Készítenem kell egy függvényt szelsoertek néven, ami megkapja kocsi típusú adatok egy tömbjét (a mérettel együtt), és visszatér annak az elemnek az indexével, amelyikben a végsebesség értéke a legnagyobb.
A struktúra definíciója (ezen nem módosíthatok):
struct kocsi
{
unsigned int szemelyek; // hány személyes
char marka[20]; // autómárka
int gyartas; // gyártás éve
unsigned int vegseb; // végsebesség
};
A függvényt meghívó kód (ezen se):
printf("%d\n", szelsoertek(tomb, 6));
Meg is csináltam a függvényt: [link]
De ez nem fordul le, ugyanis a feladat olyan dolgot kér (tomb[i]), ami nem int, hanem struct kocsi típusú. Sok oldalon az uniót javasolják a konverzióra, de ahhoz a struktúrába is kéne írni, ami nálam nem oldható meg. De ha van konvertálás nélküli megoldás is, szívesen fogadom.
semmi önállóság és nem is értesz hozzá, de itt vannak a hibás sorok, hogy pontosan mi, azt nem mondom meg:
1) int szelsoertek(struct kocsi tomb[6], int i) {
2) for (i = 0; i < 6; i++) {
3)
max_idx=i;
max_idx = tomb[i];
Nos, érteni is kéne mit csinálsz. Az, hogy azért nem akarsz kivenni egy hibás sort, mert akkor nem jó eredményt kapsz elég jól mutatja, hogy fogalmad sincs mit csinál a kód. Mit tárolsz a max_idx változóban? A legnagyobb végsebességű autó INDEXÉT. Azaz, a tömb hanyadik eleme a legnagyobb végsebességű autó. Akkor mi a probléma az alábbi feltétellel?
if (tomb[i].vegseb>max_idx)
Mit hasonlítasz itt össze? Az aktuális autó végsebességét a leggyorsabb autó indexével. Van ennek értelme? Nincs. Mit kéne ehelyett csinálnod? Az aktuális autó végsebességét a leggyorsabb autó végsebességével összehasonlítani. Na, akkor tedd ezt.
@#3:
Persze, mert már az összehasonlítás feltétele is marhaság. A max_idx változóban egy indexet jegyzel meg, de nem indexként használod, hanem közvetlenül összehasonlítod egy tömbelem egyik mezőjének értékével. Az if blokk egyetlen helyénvaló utasítása a
max_idx = i;
, annak egyáltalán nem látom a füle-farkát, hogy mire szolgálna az, ha az így tárolt értéket egy töredék ezredmásodpercen belül felülírnád egy másikkal, pláne, hogy egy árva intbe akarsz egy egész struktúrát belegyömöszölni.
Ebben egy dolog bizonyosan nem tetszik. A szelsoertek() függvény paramétereként beolvasod a tömb méretét, vagyis i változót, teljesen fölöslegesen és értelmetlenül. Miért is? Ja, mert a feladatban az van, hogy a méretet is meg kell adni... Aztán, ha már ott van ötödik keréknek, valamit mégiscsak kezdeni kell vele, hát praktikusan befogod ciklusváltozónak, és abban a pillanatban felülírod 0 értékkel. A méretet meg úgyis tudod, azt szépen beírod számmal a for feltételébe. Hát, nem hinném, hogy a feladat kiagyalójának pont ez járt a fejében. Elképzelésem szerint inkább valami ilyesmi kéne:
int szelsoertek(struct kocsi tomb[6], int meret) {
int max_idx = 0;
for (int i = 0; i < meret; i++)
if (tomb[i].vegseb>tomb[max_idx].vegseb) max_idx = i;
return max_idx;
}
Mellesleg van egy ködös elképzelésem, amit bátortalanul említek meg a programozáshoz csakugyan értő kollégák előtt, de szerintem itt a tömböd címét kapná meg a függvény, ezért a paraméterében esetleg nem is kell a kapcsos zárójelek között megadni a méretét, az akkora, amekkorát a tömb létrehozásakor megadtál neki. Ekkor így nézhetne ki a függvény feje:
int szelsoertek(struct kocsi tomb[], int meret)
Hogy aztán így van-e, azt nem tudom, de könnyű átlátni, hogy mennyivel általánosabban használható lenne, hiszen nemcsak 6 elemű, hanem bármilyen méretű tömb esetén működne, meg éppenséggel azt is érthetővé tenné, miért kell a méretet is külön megadni. A kísérleteim szerint mindenesetre így is megírható, de ezek csak hályogkovács-próbálkozások voltak a részemről, anélkül, hogy érteném, mit csinálok. Lehet, hogy pusztán a szerencsés csillagállás miatt működött, remélem, hogy egy igazi programozó kolléga majd tisztázza a helyes módszert.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!