Funkcia vracajuca smernik na globalnu premennu (pole) C++

Sekcia: Programovanie 07.11.2010 | 12:09
Avatar sbgz   Používateľ
V uvode by som sa chcel ospravedlnit, ak som kod k teme zadal zle, co sa tyka tagov HTML (do buducna sa toho urcite vyvarujem) a poziadat o pomoc pri rieseni mojho problemu. Funkcia maxmin ma vyberat z pola prvkov najvacsi a najmensi prvok pola. V tele sa toto pole deli na 2 polia a funkcia maxmin sa vola referencne. Chcel by som aby funkcia vracala smernik na prvy prvok globalnej premennej int array[2], kde bude ulozene minimum a maximum. Nechcem aby toto pole vstupovalo do funkcie cez parametre. Da sa moj napad uskutocnit bez akychkolvek warningov? Mozno nie preve najstastnejsie riesenie a amaterska otazka, ale potreboval by som to tak. Dakujem za odpovede.


int* maxmin(int n, int p[])
{
int array[2];
int array_left[2];
int array_right[2];



if(n == 1)
{
array[0] = p[0];
array[1] = p[0];
}
else if(n == 2)
{
if(p[0]<p[1])
{
array[0] = p[0];
array[1] = p[1];
}
else
{
array[0] = p[1];
array[1] = p[0];
}
}
else
{
if(n%2 == 0)
{
int* left = maxmin(n/2,p);
array_left[0] = left[0];
array_left[1] = left[1];
int* right = maxmin(n/2,&p[n/2]);
array_right[0] = right[0];
array_right[1] = right[1];
}
else
{
int* left = maxmin(n/2,p);
array_left[0] = left[0];
array_left[1] = left[1];
int* right = maxmin(n/2+1,&p[n/2]);
array_right[0] = right[0];
array_right[1] = right[1];
}
if(array_left[1] < array_right[1]) array[1] = array_right[1];
else array[1] = array_left[1];
if(array_left[0] < array_right[0]) array[0] = array_left[0];
else array[0] = array_right[0];
}
return array; // 2. warning
}

int main(int argc, char *argv[])
{
int p[]= {7,6,1,3,9,5,8,0,12,4,15,11,10,4,7};
n=15;
int array[2];

int* vysledok_maxmin = maxmin(n,p); // 1. warning
printf("maxmin: %d , %d", vysledok_maxmin[0],vysledok_maxmin[1]);
}

2 nedostatky:
1. [Warning] initialization makes pointer from integer without a cast
2. [Warning] function returns address of local variable
    • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 07.11.2010 | 12:50
      Avatar Dušan Ďurech Debian Lenny 5.0  Používateľ
      Kod som nijak obzvlast nestudoval, ale pri "return array; // 2. warning" je chyba v tom, ze vracias adresu lokalnej premennej, ktora po skonceni funkcie prestane existovat.
      • Funkcia vracajuca smernik na globalnu premennu (pole) C++ 07.11.2010 | 14:44
        sbgz   Návštevník
        ano je to tak, to je podstata lokalnych premennych, no program napriek tomu funguje korektne... ako si to teda mam vysvetlit, ze prestane existovat, ked existuje? :D dakujem za tvoju dalsiu odpoved, ak mi s tym dokazes este nejako pomoct, budem vdacny :P
        • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 07.11.2010 | 15:31
          Avatar m4jkl   Používateľ
          vrchol zasobniku sa posunie dole, ked tvoja funckia skonci. vsetky lokalne premenne, ktore boli alokovane na zasobniku vyssie tam zostanu (vynulovanie by bola strata casu). ak by si potom zavolal nejaku funkciu, tak sa premazu a tebe uz to nebude pracovat spravne.
          • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 07.11.2010 | 19:37
            sbgz   Návštevník
            dik za lopatisticke vysvetlenie
          • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 08.11.2010 | 01:22
            miso   Návštevník
            Jazyk C++ nedefinuje kam sa posunie vrchol zasobnika po skonceni funkcie, to je dane architekturou ktoru ak som to neprehliadol sbgz neuvadza. U x86 zasobnik rastie smerom nadol, cize pri navrate z funckie sa ukazatel na vrchol zasobnika posunie smerom hore.
            • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 08.11.2010 | 01:37
              sbgz   Návštevník
              dakujem za pekne vysvetlenie ;)
            • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 08.11.2010 | 02:43
              Avatar m4jkl   Používateľ
              myslim, ze jazyk c++ zasobnik nedefinuje vobec, cize to moze byt implementovane akokolvek. tu islo iba o to, ze preco mu ten program funguje spravne, ked vracia ukazatel na lokalnu premennu. s tym, ze x86 zasobnik rastie smerom dole mas samozrejme pravdu ;)
    • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 07.11.2010 | 15:35
      Avatar m4jkl   Používateľ
      ak chces to pole "array" globalne, tak ho nemozes definovat v tele tej funkcie, ale mimo;

      static int array[2];
      • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 07.11.2010 | 16:10
        Avatar borg Arch, Debian jessie  Administrátor
        pripadne alokovat array na heape a vratit pointer volajucemu, ktory ho potom dealokuje, ak nebude uz viac potrebny. globalne premenne nie su priliz stastnym riesenim.
        • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 07.11.2010 | 19:41
          sbgz   Návštevník
          Napriek tomu, ze tie globalne premenne nie su najstastnejsim riesenim mozno aj v mojom pripade, ked to spravim tak, ze:
          static int array[2];

          a do funkcie my bude vstupovat toto pole cez smernik, nebude v parametroch funkcie, funkcia mi toto pole naplni resp. zmeni a v returne budem mat smernik na prvy prvok tohto pola, pritom nebudem mat problem s rekurzivnym volanim...
          -da sa to zrealizovat pri splneni vsetkych tychto podmienok?
    • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 18.11.2010 | 20:26
      dash   Návštevník
      Nabuduce treba kompilovat na tento styl gcc a.c -o a.out -Wall -Werror -lm :)
      • Re: Funkcia vracajuca smernik na globalnu premennu (pole) C++ 18.11.2010 | 22:07
        Avatar m4jkl   Používateľ
        preco tak? :)

        lepsie by mozno bolo -Wextra, namiesto toho -Werror a to -lm uz vane neviem co tam robi:)