IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Vysvětlení kódu

Aktivity
Avatar
Xin_
Člen
Avatar
Xin_:16.12.2013 20:49

Zdravím, sice C umím ale tak na střední úrovni.. řešil jsem problém s neomezeným počtem paramtrů a narazil jsem na tento kód:

int secti(unsigned int a, ...)
{ int i, soucet=0;
  int *p;

  p=(int*)(&a+1);
  for (i=0; i<a; i++)
    { soucet += *p;
      p++;
    }
  return soucet;
}

nerozumím konkrétně těmto řádkum resp. * a &

p=(int*)(&a+1);
for (i=0; i<a; i++)
  { soucet += *p;

vím že * je ukazatel ale proč je to u int a co znamená to &a?

Odpovědět
16.12.2013 20:49
Zvědavost nás žene vpřed :)
Avatar
Odpovídá na Xin_
Zdeněk Pavlátka:16.12.2013 20:53
p=(int*)(&a+1);

&a = adresa proměnné a
(int*) = přetypování na ukazatel na int
Do proměnné p se uloží adresa proměnné a zvýšená o velikost proměnné typu int.

Nahoru Odpovědět
16.12.2013 20:53
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Xin_
Drahomír Hanák:16.12.2013 20:55

& je reference (adresa) proměnné.

  • je pak ukazatel do paměti na tu hodnotu

Tohle je prostě jiný zápis pole (posuneš se v paměti na další prvek přičtením velikosti intu) pokud se nemýlím.

 
Nahoru Odpovědět
16.12.2013 20:55
Avatar
coells
Tvůrce
Avatar
Odpovídá na Xin_
coells:16.12.2013 20:56

&a vrátí pointer na místo v paměti, kde je a
*p vrátí hodnotu z paměti, kam ukazuje p

  • do funkce lze sice zadat neomezený počet parametrů, ale musí to být vždy int
  • funkce je chybná, protože bude fungovat pouze na procesorech, kde zásobník roste směrem dolů
 
Nahoru Odpovědět
16.12.2013 20:56
Avatar
Xin_
Člen
Avatar
Xin_:16.12.2013 20:56

tak jeto adresa ale proč tam je to +1?

Nahoru Odpovědět
16.12.2013 20:56
Zvědavost nás žene vpřed :)
Avatar
Xin_
Člen
Avatar
Xin_:16.12.2013 20:57

ehm jeto vyššlí level než který plně chápu :D

Nahoru Odpovědět
16.12.2013 20:57
Zvědavost nás žene vpřed :)
Avatar
Xin_
Člen
Avatar
Odpovídá na Drahomír Hanák
Xin_:16.12.2013 21:01

jak ale pak ví co je na další pozici v paměti? chápu že pamět je jako pole, určitý počet dat s adresou ale pokud se odvoávám na adresu dál než kde je proměnná jak můžu pak vědět co vlastně čtu? když naté adrese nemám žadnou proměmnou nadeklarovanou. Teda pokud to neni součástí onoho pole pamatrů....

Hledám v tom moc věcí :D áchjo kdybych já nebyl tak moc zvědavý :D

Nahoru Odpovědět
16.12.2013 21:01
Zvědavost nás žene vpřed :)
Avatar
Odpovídá na Xin_
Luboš Běhounek Satik:16.12.2013 21:11

Vypadá to jako funkce, kam jako první parametr zadáš počet čísel, která chceš sčítat a zbylé parametry - čísla, která pak sčítáš.

Díky tomu prvnímu parametru tak víš, jak dlouho můžeš z paměti číst, abys nečetl nějaké nesmysly.

Nahoru Odpovědět
16.12.2013 21:11
https://www.facebook.com/peasantsandcastles/
Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:16.12.2013 21:39

Je to klasická funkce na součet, resp co se tak narychlo koukám tak by to mělo dělat asi sumu, součet N-krát čísla N :D

int "hvězdička" p skutečně je jedno kde je ta hvězdička, jestli za int, nebo před názvem, zkrátka musí bejt mezi), je pointer- ukazatel (doporučuju si o tom něco přečíst) - dat. typu integer

Pointer je dat. typ, kterej si uchovává adresu danýho typu - můžou bejt libovolný pointery- int "hvězdička", char "hvězdička", double"hvězdička", float"hvězdička", nebo klidně i void"hvězdička"(nap­říklad ukazatel na funkce..)

  • zkrátka když potřebuješ upravit nějkou proměnnou, tak je jednodušší ji předat pointerem / adresou / referencí (víceméně totéž)

V tomhle případě je jedno jestli to bude přes pointer/referenci, nebo ne, ten pointer by jsi využil například, kdyby jsi chtěl zapisovat do nějaký struktury/pro­měnný.. která by byla vně týhle funkce- bez adresy by jsi na to místo nezapsal

(int "hvězdička") je jen přetypování- protože jako parametr funkce je unsigned int (asi by se to implicitně přetypovalo, ale tohle minimálně nebude házet warning, možná taky ne, možná by to přetypovalo jen na int ne na int*, nwm, záleží na IDE)

no takže máš proměnnou, která je připravená na adresu int typu, a máš proměnnou unsigned int (int "hvězdička") přetypuješ a '&' vytáhneš adresu tý proměnný

kdyby byl argument funkce int, tak by ti stačilo int "hvězdička" p = &a
:)

Snad stačí :D

///sorry, nwm jak se tady lightuje zdroják :/

Editováno 16.12.2013 21:42
Nahoru Odpovědět
16.12.2013 21:39
Unix- svět, kde chcete být nulou :) (UID)
Avatar
Xin_
Člen
Avatar
Xin_:16.12.2013 22:03

Aha už jemi jasné ale stejně mi přide ten kód trochu divný :D no pozjistuji si dalsi info phledne problemu jdy funkce ma libovony pocet vlastnosti

Nahoru Odpovědět
16.12.2013 22:03
Zvědavost nás žene vpřed :)
Avatar
vitamin
Člen
Avatar
vitamin:16.12.2013 22:27

Funkcie s premennym poctom parametrov funguju vdaka tomu ze parametre funkcie su predavane v jednom pametovom bloku (podobne ako pole, len kazdy prvok moze mat inu velkost).
Funkcia musi mat minimalne 1 znamy parameter, v tvojom pripade je to 'unsigned a'. Adresa premennej 'a' je na prvom mieste, za nou nasleduju postupne dalsie premenne.

p=(int*)(&a+1);

Tento kod zobere adresu premennej 'a' ( &a ), prirata k nej 1, co znamena ze sa posunie o sizeof(a) bytov a pretypuje ju na int*, to znamena ze nasledujuca premenna ma typ int.

Treba si davat pozor na jednu vec. Poradie v akom su predavane parametre funkcie nie je v kazdom kompilatore rovnake, premenna 'a' moze byt kludne posledna a nie prva, preto sa pouzivaju na presuvanie medzi parametrami specialne makra http://en.cppreference.com/…ity/variadic

 
Nahoru Odpovědět
16.12.2013 22:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.