Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Warning: address of local variable returned

Ostatnio zmodyfikowano 2013-02-24 13:00
Autor Wiadomość
Monika90
» 2013-02-21 21:35:00
W funkcji
losuj()
 wychodzisz poza zakres tablicy
tablica
:
C/C++
rzucone[ i ] = rand() %( wszystkie_kosci ) + 1;
tablica[ rzucone[ i ] ] ++;
tablica
 ma rozmiar równy
wszystkie_kosci
, a
rzucone[ i ]
 może zawierać liczbę z przedziału od 1 do
wszystkie_kosci
 włącznie, czyli może być o jeden większe niż maksymalny dopuszczalny indeks.

Nie widzę też byś zwalniał pamięć przydzieloną przez
new
, w ogóle to, początkujący powinni używać
std::vector < int >
 zamiast
new int[]
.
P-76670
domin568
Temat założony przez niniejszego użytkownika
» 2013-02-22 16:13:58
Długo pracowałem nad moim programem , napisałem jeszcze kod który sprawdzał by strity , jednak przy sprawdzaniu czy jest dwójka , trójka , kareta itp , nie uwzględnia mi 6 przeanalizowywałęm kod kilka razy ale nic nie znalazłem , może wy mi pomożecie :) ??

Kod :
C/C++
rzucKosci( 5, 6 );

system( "pause" );
return 0;
}

void rzucKosci( int kosci, int wszystkie_kosci )
{
losuj( 6, 5 );
int rozmiar = kosci + 1;
int rzucone[ kosci ];
int tablica[ rozmiar ];

}

int * losuj( int kosci, int wszystkie_kosci )
{
int strit1;
int maly_strit = 1;
int duzy_strit = 0;
int wartosc_kosci = 0;
int rozmiar = wszystkie_kosci;
int * strit = new int[ kosci ];
int * tablica = new int[ kosci ];
int * rzucone = new int[ rozmiar ];
srand( time( NULL ) );

for( int i = 0; i < rozmiar; i++ )
{
    tablica[ i ] = 0;
}

for( int i = 0; i < wszystkie_kosci; i++ )
{
    rzucone[ i ] = rand() %( kosci ) + 1;
    tablica[ rzucone[ i ] ] ++;
    cout << rzucone[ i ] << endl;
   
    // POWINNO CHODZIĆ O TO Z GÓRY , inny kod jest raczej dobry
}
cout << endl;
for( int i = 0; i < kosci; i++ )
{
    cout << tablica[ i ] << endl;
}

for( int i = 0; i < rozmiar; i++ )
{
    if( tablica[ i ] == 5 )
    {
        cout << " Piatka !!! " << endl;
        break;
    }
   
    else if( tablica[ i ] == 4 )
    {
        cout << " Kareta !!! " << endl;
        break;
    }
    else if( tablica[ i ] == 2 )
    {
        wartosc_kosci += 2;
       
    }
    else if( tablica[ i ] == 3 )
    {
        wartosc_kosci += 3;
       
    }
   
}
if( wartosc_kosci == 5 )
{
    cout << "FULL !!! " << endl;
   
}
else if( wartosc_kosci == 4 )
{
    cout << "Para !!!" << endl;
   
}
else if( wartosc_kosci == 2 )
{
    cout << "Dwojka !!!" << endl;
}
else if( wartosc_kosci == 3 )
{
    cout << " Trojka !!!" << endl;
}


cout << endl;

if( tablica[ 0 ] == 0 )
{
    maly_strit = 0;
    duzy_strit = 1;
}

for( int i = 0; i < rozmiar; i++ )
{
    if( tablica[ i ] == 1 && strit1 < 5 ) strit1++;
   
    if( i > 0 && tablica[ i ] != 1 ) duzy_strit = 0;
   
}

if( maly_strit ) std::cout << "maly strit" << std::endl;

if( duzy_strit ) std::cout << "duzy strit" << std::endl;

return rzucone;
}
P-76715
domin568
Temat założony przez niniejszego użytkownika
» 2013-02-22 19:01:06
Problem rozwiązany , poprostu podczas sprawdzania zasady czy liczby się powtarzają tablica która była końcem warunku jej indeks był po prostu zbyt mały , tylko że to nie było takie łatwe to zrozumienia bo był aż o dwie wartości za mały :) . Teraz mam pytanie nieco któtsze . Jak do rzucone mam wpisać jakieś liczby , bo czasami podczas beta-testów mojego programu nie chce mi się akurat czekać na małego strita . 
P-76723
domin568
Temat założony przez niniejszego użytkownika
» 2013-02-23 17:58:51
Ktoś pomoże ? Naprawde nie wiem jak się do tego zabrać
P-76809
domin568
Temat założony przez niniejszego użytkownika
» 2013-02-23 20:07:45
Chciałem zrobić mój program w funkcji jednak gdy próbuje skompilować to mam taki błąd : undefined refference to `sprawdz(int,int,int)' . Dlaczego nie mogge tego uruchomić ?? Nie mam żadnych błędów kompilatora , tylko błąd linkera . Kod :


C/C++
int * losuj( int kosci, int wszystkie_kosci )
{
   
   
   
   
   
    int rozmiar = wszystkie_kosci + 2;
    int * tablica = new int[ rozmiar ];
    int * rzucone = new int[ kosci ];
    int strit[ kosci ];
    int wartosc_strita = 0;
    srand( time( NULL ) );
   
    for( int i = 0; i < rozmiar; i++ )
    {
        tablica[ i ] = 0;
    }
   
    for( int i = 0; i < wszystkie_kosci; i++ )
    {
        rzucone[ i ] = rand() %( kosci ) + 1;
        tablica[ rzucone[ i ] ] ++;
        cout << endl;
        cout << rzucone[ i ] << endl;
       
       
        cout << endl;
       
        sprawdz( rzucone[ i ], tablica[ i ], rozmiar );
    }
   
   
   
   
   
   
   
   
}

int sprawdz( int rzuconekosci[], int tablica[], int rozmiar )
{
   
    int punkty = 0;
    int wartosc_kosci = 0;
   
    for( int i = 0; i < rozmiar; i++ )
    {
        if( tablica[ i ] == 5 )
        {
            wartosc_kosci += 10;
           
        }
       
        else if( tablica[ i ] == 4 )
        {
            wartosc_kosci += 20;
        }
        else if( tablica[ i ] == 2 )
        {
            wartosc_kosci += 2;
           
        }
        else if( tablica[ i ] == 3 )
        {
            wartosc_kosci += 3;
           
        }
       
    }
   
    if( wartosc_kosci == 5 )
    {
        cout << "FULL !!! " << endl;
        punkty +=( rzuconekosci[ 0 ] + rzuconekosci[ 1 ] + rzuconekosci[ 2 ] + rzuconekosci[ 3 ] + rzuconekosci[ 4 ] ) + 10;
       
    }
    else if( wartosc_kosci == 10 )
    {
        cout << "Poker !!!" << endl;
        punkty +=( rzuconekosci[ 0 ] + rzuconekosci[ 1 ] + rzuconekosci[ 2 ] + rzuconekosci[ 3 ] + rzuconekosci[ 4 ] ) + 50;
       
    }
    else if( wartosc_kosci == 20 )
    {
        cout << "Kareta !!!" << endl;
        punkty +=( rzuconekosci[ 0 ] + rzuconekosci[ 1 ] + rzuconekosci[ 2 ] + rzuconekosci[ 3 ] + rzuconekosci[ 4 ] ) + 20;
       
    }
    else if( wartosc_kosci == 2 )
    {
        cout << "Dwojka !!!" << endl;
        punkty += 5;
    }
    else if( wartosc_kosci == 3 )
    {
        cout << "Trojka !!!" << endl;
        punkty += 15;
    }
    else if( wartosc_kosci == 4 )
    {
        cout << "Para !!!" << endl;
        punkty += 10;
       
    }
   
    cout << endl;
   
   
    if( tablica[ 2 ] == 1 && tablica[ 3 ] == 1 && tablica[ 4 ] == 1 && tablica[ 5 ] == 1 && tablica[ 6 ] == 1 )
    {
        punkty += 20;
        cout << "Duzy Strit !!!" << endl;
    }
    if( tablica[ 1 ] == 1 && tablica[ 2 ] == 1 && tablica[ 3 ] == 1 && tablica[ 4 ] == 1 && tablica[ 5 ] == 1 )
    {
        punkty += 15;
        cout << "Maly Strit  !!!" << endl;
    }
    cout << endl;
   
   
   
    cout << endl;
   
    return wartosc_kosci;
    return punkty;
   
}
P-76845
usmiech
» 2013-02-23 20:30:57
Gra w kosci to dobry pomysl do 'walki' z C++, ale uzylbym tu klasy :)
P-76846
domin568
Temat założony przez niniejszego użytkownika
» 2013-02-24 11:27:07
Ale czy dało by się to zrobić na funkcje ??
P-76871
pekfos
» 2013-02-24 13:00:48
Warning: address of local variable returned
To znaczy, że zwracasz adres lokalnej zmiennej, która po powrocie z funkcji przestaje istnieć.

Rozwiązanie powszechnie używane w bibliotece standardowej C:
C/C++
void Funkcja( int * miejsce_na_wynik, int rozmiar bufora );

Alternatywne rozwiązanie jest takie same jak to z pierwszego posta, z tą różnicą, że tablica jest alokowana dynamicznie (po powrocie musi być ręcznie usunięta).
P-76881
1 2 « 3 »
Poprzednia strona Strona 3 z 3