Stránka 1 z 1

C - funkce,pole...

Napsal: pon 29. lis 2010, 00:59
od Václav Sedlář
Dobrý den, ve škole jsem dostal zadání:

Kód: Vybrat vše

1)napsat funkci alokuj_pole int velikost, jednorozměrné pole float, velikost je předána parametrem
pole bude vráceno jako:
a)návratová hodnota funkce
b)předáno jako parametr volaný odkazem
a já jaksi nevím rozdíl mezi a) a b)...jaká bude definice funkce a return u a,b? Moc dekuji za odpověď...

Re: C - funkce,pole...

Napsal: pon 29. lis 2010, 08:31
od arxeiss
Absolutně nechápu zadání, např toto alokuj_pole int velikost. Co to má znamenat? jako že budu mít alokuj_pole(int velikost) v něm jednorozměrné pole floatové. A pak vrátím jednou návratovou hodnotou, a podruhé parametrem?

Re: C - funkce,pole...

Napsal: pon 29. lis 2010, 12:32
od Václav Sedlář
právě...taky mi to je divný..ale je to doslova přesně opsané z tabule :x

edit: jelikož pak budeme dál v programu dělat s dvěma polema, tak to asi bude jako alokovat jedno pole o velikosti int a pak ještě jedno pole float (asi)...a pro jedno bude platit za a) a pro druh= za b)...

Re: C - funkce,pole...

Napsal: pon 29. lis 2010, 12:39
od zombux
jo tohle jsme kdysi dělali, jen jsem to už dokonale zapomněl. Heroutova učebnice céčka to vysvětluje detailně, nalistuj :)

Re: C - funkce,pole...

Napsal: pon 29. lis 2010, 16:26
od Saphire
Václav Sedlář píše:...
V kroku A se vrátí pole tak jak je, zatímco v kroku B se pole zapíše do ukazatele, předáného funkci jako argument.

Re: C - funkce,pole...

Napsal: pon 29. lis 2010, 17:01
od arxeiss
Saphire píše:V kroku A se vrátí pole tak jak je, zatímco v kroku B se pole zapíše ADRESA POLEdo ukazatele, předáného funkci jako argument.
Ti tam chybělo, a je to rozdíl! Ale stejně nechápu logiku bodu A, tam si musíš vytvořit to pole jak v mainu, tak v té funkci, a pak po naplnění ho vrátíš do mainu, ale tam se musí někam uložit, takže je alokované 2x... U B už je to logické, tam si ho vytvoříš v poli a pak v mainu pracuješ už jenom s pointrem.

Re: C - funkce,pole...

Napsal: pon 29. lis 2010, 18:29
od Václav Sedlář
mno takto je celé zadáni:

Kód: Vybrat vše

1)napsat funkci alokuj_pole int velikost, jednorozměrné pole float, velikost je předána parametrem pole bude vráceno jako:
a)návratová hodnota funkce
b)předáno jako parametr volaný odkazem

2)funkci napln_pole která naplní pole jakkoliv

3)funkci, která převezme jako parametry dvě pole (vytvořené funkcí výše) a porovná je na základě hodnot v poli uložených. Bude vracet:
a)0...pokud jsou pole stejná
b)1..pokud v poli 1 jsou vyšší hodnoty
c)2..pokud jsou hodnoty v poli1 nižší

4)funkci co vypočte vážený průměr (váhy volte dle vlastního uvážení) z hodnot ullžených v poli


Re: C - funkce,pole...

Napsal: úte 30. lis 2010, 11:31
od Maranov
Jako návratová funkce:

Kód: Vybrat vše

float *alokuj_pole(int velikost)
{
	return malloc(sizeof(float) * velikost);
}
Funkce alokuje dynamicky pole a předá adresu na něj v return.

Kód: Vybrat vše

void alokuj_pole(int velikost, float** pole)
{
	*pole = malloc(sizeof(float) * velikost);
}
To samé v parametru předávaného odkazem (vstupně-výstupní parametr).

Takhle to chápu já. Klasické array předat nemůžeš, array je de facto ukazatel na první prvek a v momentě ukončení fce by pole bylo zničeno.

Re: C - funkce,pole...

Napsal: úte 30. lis 2010, 17:28
od Václav Sedlář
ok, děkuji...zkusím... ;-)

Re: C - funkce,pole...

Napsal: stř 1. pro 2010, 14:06
od Václav Sedlář
Maranov píše:Jako návratová funkce:

Kód: Vybrat vše

float *alokuj_pole(int velikost)
{
	return malloc(sizeof(float) * velikost);
}
píše chybu:

Kód: Vybrat vše

Error	1	error C2440: 'return' : cannot convert from 'void *' to 'float *'

Re: C - funkce,pole...

Napsal: stř 1. pro 2010, 14:34
od Saphire
Než to vrátíš, musíš to ještě přetypovat na float*.

Kód: Vybrat vše

float *alokuj_pole(int velikost)
{
   return (float*)malloc(sizeof(float) * velikost);
}

Re: C - funkce,pole...

Napsal: stř 1. pro 2010, 15:52
od Václav Sedlář
ok, dík...už to funguje....
jen ještě ten druhej případ:

Kód: Vybrat vše

void alokuj_pole2(int velikost, float* pole)
{
   *pole = malloc(sizeof(float) * velikost);
}
ja vypadá vyvolání funkce? takto:

float *p_f;
alokuj_pole(velikost, p_f);
:?:

Re: C - funkce,pole...

Napsal: stř 1. pro 2010, 16:25
od Saphire
Ano, přesně tak!
Ale funkce musí vypadat takhle: 1) alokovanou paměť přiřazujeme do ukazatele, nikoliv do obsahu proměnné ( *pole je obsah promenné, pole je ukazatel)
2) lepší je VŽDY (i když je to nepovinné) přetypovávat.

Kód: Vybrat vše

void alokuj_pole2(int velikost, float* pole)
{
   pole = (float*)malloc(sizeof(float) * velikost);
}