Avatar
Xin_
Člen
Avatar
Xin_:

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
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Xin_
Zdeněk Pavlátka:
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
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Xin_
Drahomír Hanák:

& 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
Redaktor
Avatar
Odpovídá na Xin_
coells:

&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_:

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_:

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_:

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):

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
:)
Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:

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_:

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:

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