Array probléma.. C-C++ -ban próbálok tanulni de problémába ütköztem a neten amit lelek nem igazán megoldások. Kérdőjel ?
A probléma az alábbi:
Van 1 függvény, szeretném eltérő számsor értékekkel meghívni. Erre az array-t találtam megfelelőnek tehát így néz ki:
unsigned int program1[6] = {10, 10, 10, 10, 10, 70 };
unsigned int program2[6] = {30, 30 90, 30, 30, 110};
unsigned int program3[6] = {30, 30, 10, 10, 30, 171};
unsigned int program4[6] = {30, 30, 90, 30, 10, 170};
int program_number;
Szóval a program number int értékével (program1, program2, program3) rendelkezdő array-t szeretném kiválasztva megadni a függvénynek hogy úgy fusson le..
Jelenleg van egy program_selected array abba másolom egyenként, de eléggé szerencsétlen. Működik de nem csak az a lényeg hogy működjön, hanem hogy megértsem hogy máshogy is lehet. :)
Létezik elegánsabb megoldás ?
Annyi még fontos, ha ez nem jött le, hogy ha nincs nullától eltérő osztási maradék, akkor a modulo függvény 0-t ad vissza.
20 % 4 = 0
20 % 5 = 0
20 % 10 = 0
Köszönöm, ezt észrevettem az array függvénynél.
Már használtam is párszor ezt a modulot, csináltam egy kis programrészt mert el kell utaznom, és addig teszteli véletlen gomb nyomogatásokkal magát a rendszer, így nem kell vele bohóckodni, 1.5 nap után meg átnézem mi történt, van e benne bug vagy nincs, mert 500 sornál járok, és már egyre komplexebb és zavarosabb.
Ez is egy lehetséges megoldás (ki is próbálhatod egy gombnyomásra "RUN"):
Itt is többdimenziós ("mátrix") a tömb. Nyilván sok jó megoldás ven, ez is csak egy példaképpen.
Majd ebből egy dimenziót kiválasztva annak címe adódik át a függvénynek. És a függvény már csak azzal dolgozik. Ha jól értettem valamit ilyesmit kérdeztél.
Ide eis bemásolom, hatha onnan eltűnik:
#include <stdio.h>
int main()
{
typedef unsigned int t_tomb[6];
t_tomb program[4]= {
{10, 10, 10, 10, 10, 70 },
{30, 30, 90, 30, 30, 110},
{30, 30, 10, 10, 30, 171},
{30, 30, 90, 30, 10, 170}
};
void foo(t_tomb *tomb) {
printf("tomb: %d, %d, %d, %d, %d, %d\r\n",
(*tomb)[0], (*tomb)[1], (*tomb)[2], (*tomb)[3], (*tomb)[4], (*tomb)[5]);
}
foo(&program[0]); //0. program hívása
foo(&program[1]); //1. program hívása
foo(&program[2]); //2. program hívása
foo(&program[3]); //3. program hívása
}
#15 voltam:
A linken kicsit bekommenteltem, hogy követhetőbb legyen
15: köszönöm, ez így nekem most még bonyolultabb mert nem értem hogy
a void foo(t_tomb *tomb) ből a t_tomb *tomb mit jelent, és a
&program[0] mit jelent mi mit csinál ami miatt ez lesz..
A "*tomb" egy t_tomb típusra (ami valójában az áhított 6 elemű tömb típus) mutató "pointer" (vagyis mutató).
a "&program[0]" pedig a program nevű tomb 0. elemének memóriabeli címét adja vissza (& operátor). Tehát nem a tömb, csak memóriabeli címe!!! Azaz egy mutató.
Tehát a foo() függvénynek csak egy pointer (egy cím) kerül átadásra. Mégpedig annak a 6 elemű tömbnek a KEZDŐCÍME (mutatója) amivel majd dolgoznia kell.
Hogy mi a mutató vagy más néven pointer? Példa:
int a = 11; // Sima változó
int *ptr_a = &a; //Változóra mutató ponter, azaz annak memóriabeli címét tárolja
printf("valtozo címe (ponter értéke): %x; ott tárolt érték: %d\r\n",ptr_a ,*ptr_a);
Klasszikus hasonlat:
Ez kb olyan, mintha lenne egy iratod (változó) egy irattároló szekrényben. Ha valakinek iratod kelle átadni, akkor:
1. megolás: Azt lemásolod és odaadod neki. (=Klasszikus érték szerinti átadás).
2. megoldás De csinálhatsz olyat is, hogy csak megmondod ("megmutatod") neki hogy melyik helyen van az irat (=ponter). Ő azalapján kikeresi és hopp ott is van ami neki kell.
A pointer is természetesen lehet változók között "adni-venni-átadni", növelni, összehasonlítani, stb. majdnem mint egy int-et... (Kicsit spécibb a helyzet, de ne bonyolítsuk elsőre.)
A ponierekkel egy nagy baj van (mint a sima tömbokkel). Ha olyan címre hivatkozol, ami nem létezik. Vagy más változóhoz (vagy más típushoz) tartozik mint amire "gondolsz". Netán még bele is rondítasz egy írással... Akkor annak csúnya vége lesz...
Aztán itt kezdődik a C++ és a standard tárolók, hogy ne kövess el pointerekkel ilyen hibákat. De az egy új fejezet :)
#17 voltam:
Jobb példa jutott eszembe... :)
Legyen csak egy könyv. Ha valakinek egy oldal kell belőle.. azt kimásolhatod (sima érték átadás).
Vagy megmondod melyik oldalon van, és keresse ki Ő. Az átadott oldalszám a pointer maga.
A ponintert lehet növelni, csökkenteni (elöző --, következő oldal ++) azaz lehet lapozgatni ("iterálni") a könyvben. Lehet bármennyivel előre vagy hátrább "lapozni" (+/- múvelet).
A baj persze az, ha a könvy első oldala elé, vagy utána akarnál mutatni... Akkor jön a futási hiba :D
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!