Funkce s parametrem pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Funkce s parametrem pole – C / C++ – Fórum – Programujte.comFunkce s parametrem pole – C / C++ – Fórum – Programujte.com

 

Meph0
Newbie
24. 2. 2013   #1
-
0
-

Zdravim,

trochu zápasím s ukazateli, asi jako každý amatér :)

Mám funkci na hledání maxima, do ni bych potřeboval poslat pole a v něm najít maximum, funkce pak vrátí index pole, kde je to maximum. Podařilo se mi předat funkci ukazatel na pole, vidím  při debugu, že tam to pole je, ale neumim přistupovat k jednotlivým hodnotám tohoto pole, pravděpodobně si beru jen ukazetel na daný index pole. Poradíte mi někdo? Díky


// používám jedno pole z této struktury:
typedef struct { double value[16]; double location[16];} frame;
frame process_frame;

//do process_frame.value jsem nacpal 16 čísel


//funkci volám takto:
max_loc = max_value(process_frame.value);


//funkce pro hledání maxima
int max_value(double (*val)[16]){

    //int size = sizeof(val)/sizeof(val[0]);
	int size = 16;
    int max = 0;
    int i;
    for (i = 0; i < size; ++i){
        if (val[i] > val[max]){
            max = i;
        }

    }
    return max;
}
Nahlásit jako SPAM
IP: 195.113.241.–
Radek Chalupa
~ Redaktor
+1
Super člen
24. 2. 2013   #2
-
0
-

#1 Meph
Třeba nějak takhle:

int max_value(double* pole)
{
  size_t max = 0;
  for (size_t i = 1; i < 16; i++)
  {
      if (*(pole+i) > *(pole + max))
            max = i;
  }
    return (int)max;
}

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Meph0
Newbie
24. 2. 2013   #3
-
0
-

#2 Radek Chalupa

Bezvadný, děkuji.

Chápu tedy správně, že "double* pole" znamená ukazatel na pole typu double a "*(pole+i)" je hodnota v paměti na adrese kam ukazuje pole+i? A vlastně od nuly to nejde proto, protože se poprvé porovná druhý prvek pole s první, že?

Meph

Nahlásit jako SPAM
IP: 195.113.241.–
Meph0
Newbie
24. 2. 2013   #4
-
0
-

Mimochodem, tak nachápu proč mi nejde funkce vracející pole.Když bych to udělal, tak jak si myslím, i podle předchozí odpovědi, tak mi to hází chybu, že očekává typ float a já mám všude double, což nevím proč mu vadí. 

//frame je struktura s dvěma poli typu double (value a location).
//volám takto 
double* output_frame_final = elim(...);


//metoda:
double elim(...){

...

return (double)output_frame.value;
}

Pokouším se z metody dostat strukturu. Tak jsem chtěl zkusit vrátit ukazatel na začátek struktury.

Nahlásit jako SPAM
IP: 195.113.241.–
KIIV
~ Moderátor
+43
God of flame
24. 2. 2013   #5
-
0
-

output_frame_final je pointer... co vracis je pokus o pretypovani pointeru na double a pokousis se to vratit pres double...

(kdyz by se ti to nahodou povedlo vsechno prinutit myslet si "ze vis co delas" tak stejne muzes teoreticky ztratit diky ruznejm zaokrouhlovanim casti pointeru...)

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Meph0
Newbie
24. 2. 2013   #6
-
0
-

#5 KIIV
output _frame_final chci, aby byl pointer, který ukazuje na začátek pole output_frame.value, myslel jsem, že tím double* mu řeknu, že je to pointer typu double.

pointer je tedy většího typu? Myslel jsem že pointer je (nebo musí) být stejného typu jako proměnná na kterou ukazuje. Asi to moc nechápu.

Nahlásit jako SPAM
IP: 195.113.241.–
KIIV
~ Moderátor
+43
God of flame
24. 2. 2013   #7
-
0
-

jenze to pak musis taky vracet z funkce pointer a tak podobne...

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Meph0
Newbie
24. 2. 2013   #8
-
0
-

#7 KIIV
Jasně, to jsem přesně chtěl, akorát to neumím zapsat :)

Pokus/omyl mi vyplivl tuto variantu: 


//volám takto 
double* output_frame_final = elim(...);


//metoda:
double* elim(...){
...
double *pointer_frame = &output_frame.value;
...

return pointer_frame;
}

Jdu zkusit, zda to dělá i to co chci :)

Nahlásit jako SPAM
IP: 195.113.241.–
KIIV
~ Moderátor
+43
God of flame
24. 2. 2013   #9
-
+1
-
Zajímavé

melo by jit i:   return output_frame.value;

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Radek Chalupa
~ Redaktor
+1
Super člen
25. 2. 2013   #10
-
+1
-
Zajímavé

#6 Meph
Pointr jako takový je vždy stejného "typu", tj, je to 32 nebo 64-bitové číslo (v závislosti na OS), ve kterém je uložená adresa v paměti.

Ty typované pointery jsou především z důvodu pointrové aritmetiky, tj pokud přičteš k pointru 1, posuneš se na další prvek pole, ale ve skutečnosti jde o posun o různý počet bytů, přesně o sizeof(typ_na_ktery_ukazuje).

Takže když k pointru typu double* přičteš 1, posuneš se o sizeof(double), což je (alespoň většinou) 8 bytů, ale např. u pointru int* je posun jen o 4 byte apod.

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Meph0
Newbie
25. 2. 2013   #11
-
0
-

#10 Radek Chalupa
Super, díky za vysvětlení.

Nahlásit jako SPAM
IP: 78.80.152.–
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, 14 hostů

Podobná vlákna

Funkce 2d pole nefunguje — založil TiTanerCZE

Funkce na velikost pole — založil Porcepoque

Pole v argumentu funkce — založil oxidián

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ý