Zdravím, četl jsem knihu od Herouta (1. díl). Jednu věc jsem nepochopil, a to jak předávat struktury mezi funkcemi... Dejme tomu, že prostě potřebuju dostat 3 hodnoty skrz 3 funkce.
tak udělám:
typedef struct
{
int x;
int y;
int z;
} CISLO;
Tohle musí být globálně?
Dále vytvořím funkci:
CISLO funkce(CISLO *vypocet, int a) // a z mainu je 2
{
vypocet->x = 2*a;
vypocet->y = 5*a;
vypocet->z = 8*a;
return *vypocet;
}
No a jak teď tento údaj předat další funkci, aby s ním mohla pracovat? Opravdový problém je složitější, chtěl bych to ale pochopit komplexně.
Nebo když předávám odkazem, tak proměnná vypocet se uchová a můžu ji napsat jako parametr jiné funkce? Např.
Nebo když předávám odkazem, tak proměnná vypocet se uchová a můžu ji napsat jako parametr jiné funkce?
Proměnná vypocet je ukazatel na strukturu, ty měníš data v té stuktuře a tam se taky uchovají. Vypocet tě dál nezajímá.
Vypsalo by to 4 10 16?
Ne, protože tam cpeš adresy místo hodnot. Vyhoď ty &.
Takže když z nějaké funkce vrátím ukazatel na strukturu tak ji můžu automaticky použít v mainu?
Když z nějaké funkce něco vrátíš, tak se ti to vrátí tam, odkud jsi tu funkci volal. vysledek = funkce(blabla); Je celkem jedno, jestli je to ukazatel, dokud je platný. Ale ty hlavně žádný ukazatel nevracíš, máš v tom guláš.
Koukám, že s tímhle budu asi bojovat sakra dlouho, teď mi to vyplivlo asi 40 errorů :-D už na tom makám hodinu a pořád sem nic nevyřešil v podstatě... Tam má být *, tam &, tam **, už mi z toho de hlava kolem :( ale i tak díky za rady, snad se do toho nějak dostanu...
#9Thomasso
pokud * a & davas namatkou a jen testujes co a jak to dela, tak se nedivim, ze ti jde hlava kolem...
Jde o toto:
pokud mas statickou promennou napriklad strukturu X a chces ji zmenit uvnitr funkce, pak do funkce musis predat ukazatel na misto v pameti, kde je. To dosahnes pomoci &X ---> funkce pak musi mit v definici struktura * S, a abys mohl pristupovat k prvkum struktury, na kterou mas jen ukazatel - nemuzes pouzit S.prvek ale musis pouzit S->prvek ( ale je to to same jako mit (*S).prvek )
mimochodem reference je v C jen ziskani ukazatele z promenne... v C++ uz to umi lepsi kousky
* pripadne -> - oboje provadi dereferenci (tj. ziskavaji data z mista, na ktere odkazuje ukazatel - nikoliv na miste kde ten ukazatel veskutecnosti lezi)... a pokud predas ukazatel do funkci tak stale budes menit konkretni misto v pameti, na ktere ukazuje - tj. zmenis neco v 50. zanoreni funkci, zmeni se to i navenek
Neni to nic sloziteho... pochopil bys to (nebo bys musel) velice rychle, pokud bys delal s assemblerem
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ešte by som pred prácou s pointermi premenných overil či nie je null, ináč hrozí zrútenie programu (šahá tam, kde nemá)...
void nasobeni1(CISLO* d, int n)
{
d->x *= x; // Ak d bude NULL, potom ti spadne program.
}
CISLO* nasobeni2(CISLO* d, int a)
{ if(d != NULL) // Overíme, či d je alokované v pamäti
{
CISLO c = *d;
}
else return new CISLO();
}
Assemblery máme jako předmět ve škole, studuju informatiku :) Tak už se nemůžu dočkat, až to pochopím :-D Jinak učitel na střední nám říkal, že nejhorší pro začátečníka je pochopit právě ty ukazatele... Tak snad to časem půjde :) Díky moc.