Předávání hodnot mezi fcemi pomocí struktur – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Předávání hodnot mezi fcemi pomocí struktur – C / C++ – Fórum – Programujte.comPředávání hodnot mezi fcemi pomocí struktur – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Thomasso0
Newbie
5. 10. 2011   #1
-
0
-

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ř. 

CISLO vypsat(CISLO *vypocet)
{
  printf("%d %d %d", &vypocet->x, &vypocet->y, &vypocet->z);
  
  return *vypocet;
}

Vypsalo by to 4 10 16?

Díky za odpovědi :)

Nahlásit jako SPAM
IP: 80.188.117.–
KIIV
~ Moderátor
+43
God of flame
5. 10. 2011   #2
-
0
-

Predavat data samozrejme lze. Kdyz predavas pointer, tak menis uvnitr stejny misto v pameti, jako je venku...

tj. nemusis nic vracet pomoci return a uz vubec delat kopii

tj neco jako toto:

CISLO neco = {1,2,3};

funkce(&neco,3);

vypsat(&neco);

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Thomasso0
Newbie
5. 10. 2011   #3
-
0
-

A nakonec teda bude int main (int argc, char *argv[], &neco) ?

Btw. to return nemusí být vůbec? Já myslel že každá fce musí mít return.

Nahlásit jako SPAM
IP: 80.188.117.–
KIIV
~ Moderátor
+43
God of flame
5. 10. 2011   #4
-
0
-

main nemuze mit jiny parametry nez ma... je to hlavni funkce...

return nemusi mit funkce, ktere maji navratovy typ void

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Thomasso0
Newbie
5. 10. 2011   #5
-
0
-

Takže když z nějaké funkce vrátím ukazatel na strukturu tak ji můžu automaticky použít v mainu?

Nahlásit jako SPAM
IP: 80.188.117.–
zlz
~ Anonymní uživatel
634 příspěvků
5. 10. 2011   #6
-
0
-

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áš.

Nahlásit jako SPAM
IP: 213.211.51.–
Thomasso0
Newbie
5. 10. 2011   #7
-
0
-

No a jak je to se strukturama? dá se v mainu vytvořit proměnná, do které se uloží výsledek té funkce, co vrací struct?

Nahlásit jako SPAM
IP: 80.188.117.–
zlz
~ Anonymní uživatel
634 příspěvků
6. 10. 2011   #8
-
0
-

   

typedef struct { int x,y,z; } CISLO;

void vypis(CISLO *cislo)
{
	printf("x: %d, y: %d, z: %d\n", cislo->x, cislo->y, cislo->z);
}

void nasobeni1(CISLO *cislo, int nasobic)
{
	cislo->x *= nasobic;
	cislo->y *= nasobic;
	cislo->z *= nasobic;
}

CISLO nasobeni2(CISLO *cislo, int nasobic)
{
	CISLO c = *cislo;
	c.x *= nasobic;
	c.y *= nasobic;
	c.z *= nasobic;
	return c;
}

int main()
{
	CISLO c1 = {1,2,3}, c2;
	vypis(&c1);

	nasobeni1(&c1, 2);
	vypis(&c1);

	c2 = nasobeni2(&c1, 3);
	vypis(&c2);

	return 0;
}
Nahlásit jako SPAM
IP: 213.211.51.–
Thomasso0
Newbie
7. 10. 2011   #9
-
0
-

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...

Nahlásit jako SPAM
IP: 80.188.117.–
KIIV
~ Moderátor
+43
God of flame
7. 10. 2011   #10
-
0
-

#9 Thomasso
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...
Peppy0
Stálý člen
7. 10. 2011   #11
-
+1
-
Zajímavé

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();
}
Nahlásit jako SPAM
IP: 85.135.191.–
Qt, QML, C++
Thomasso0
Newbie
7. 10. 2011   #12
-
0
-

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.

Nahlásit jako SPAM
IP: 80.188.117.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 89 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý