[C++] Warning: address of local variable returned
Ostatnio zmodyfikowano 2013-02-24 13:00
domin568 Temat założony przez niniejszego użytkownika |
[C++] Warning: address of local variable returned » 2013-02-19 21:04:52 Witajcie , mam problem z moim programem , napisałem coś takiego : #include <iostream> #include <stdlib.h> #include <time.h> int wartosc = 0; int wartoscWygranej; using namespace std; int * losuj( int kosci, int wszystkie_kosci ) { int rzucone[ 5 ]; for( int i = 0; i < kosci; i++ ) { rzucone[ i ] = rand() %( wszystkie_kosci ) + 1; cout << "Twoje kosci to: " << rzucone[ i ] << endl; } return rzucone; } void rzucKosci( int kosci, int wszystkie_kosci )
{ char znak = 'T'; srand( time( NULL ) ); int rozmiar = wszystkie_kosci + 1; int rzucone[ kosci ]; int tablica[ rozmiar ]; for( int i = 0; i < rozmiar; i++ ) { tablica[ i ] = 0; } int * kosci_przeciwnika = losuj( kosci, wszystkie_kosci ); for( int i = 0; i < rozmiar; i++ ) { tablica[ rzucone[ i ] ] ++; cout << tablica[ i ]; } int wartosc = 0; for( int i = 0; i < rozmiar; i++ ) { cout << tablica[ i ] << endl; if( tablica[ i ] == 5 ) { rozmiar += 5; cout << "Piatka !!! " << endl; wartoscWygranej = 5; break; } else if( tablica[ i ] == 4 ) { rozmiar += 4; cout << "Kareta !!! " << endl; wartoscWygranej = 4; break; } else if( tablica[ i ] == 2 ) { wartosc += 2; } else if( tablica[ i ] == 3 ) { wartosc += 3; } else if( tablica[ i ] == 1 ) { wartosc += 0; } } if( wartosc == 4 ) { cout << " Para !!! " << endl; wartoscWygranej = 2; } else if( wartosc == 5 ) { cout << " FULL !!! " << endl; wartoscWygranej = 6; } else if( wartosc == 2 ) { cout << " Dwojka !!! " << endl; wartoscWygranej = 1; } else if( wartosc == 3 ) { cout << " Trojka !!! " << endl; wartoscWygranej = 3; } else if( wartosc == 0 ) { cout << "Nic" << endl; wartoscWygranej = 0; } int strit; int maly_strit = 1; int duzy_strit = 0; if( tablica[ 0 ] == 0 ) { maly_strit = 0; duzy_strit = 1; } for( int i = 0; i < rozmiar; i++ ) { if( tablica[ i ] == 1 && strit < 5 ) strit++; if( i > 0 && tablica[ i ] != 1 ) duzy_strit = 0; } if( maly_strit ) std::cout << "mały strit" << std::endl; if( duzy_strit ) std::cout << "duży strit" << std::endl; if( znak == 'T' || znak == 't' ); { } if( znak != 'T' || znak != 't' ); }
int main() { string START; cout << "**************************" << endl; cout << "| GRA W KOSCI |" << endl; cout << "| DOMINIK TAMIOLLO |" << endl; cout << "**************************" << endl; rzucKosci( 5, 6 ); return 0; } Tysięczny temat !!!! :P Jednak gdy kompiluje i uruchamiam to zawiesza mi się konsola jest jednak w logu taki komunikat: [Warning] address of local variable 'rzucone' returned [enabled by default] . |
|
wojt91 |
» 2013-02-19 21:34:39 rzucone = rand () % (wszystkie_kosci) + 1;
w tej linijce "rzucone" traktujesz jak zmienną a dwie linijki wyżej deklarujesz jako tablice. |
|
domin568 Temat założony przez niniejszego użytkownika |
Odpowiedz » 2013-02-19 21:41:37 int * losuj( int kosci, int wszystkie_kosci ) { int rzucone[ wszystkie_kosci + 1 ]; for( int i = 0; i < kosci; i++ ) { rzucone[ i ] = rand() %( wszystkie_kosci ) + 1; cout << "Twoje kosci to: " << rzucone[ i ] << endl; } return rzucone; } Zmieniłem na to : i nadal jest błąd :) , więc to nie o to chodzi. |
|
wojt91 |
» 2013-02-19 21:46:17 nie zrozumieliśmy się rzucone = rand() %( wszystkie_kosci ) + 1; zamień na rzucone[ i ] = rand() %( wszystkie_kosci ) + 1; rzucone jest nazwą tablicy (lub jak kto woli wskaźnikiem na tablicę) i widzę że prawie wszędzie masz ten sam problem |
|
wojt91 |
» 2013-02-19 22:05:46 wrzuć swój kod w znaczniki cpp |
|
unimator |
» 2013-02-19 22:59:47 Błąd mówi sam za siebie. Return zwraca zawsze wartość jakiejś zmiennej lub referencję do zmiennej. Ty próbujesz zwrócić tablicę statyczną. I tu rodzą się 2 problemy: 1. Zmienne lokalne mają zasięg ograniczony do funkcji, w której zostały zadeklarowane (lub bloku kodu, zależnie jak to zinterpretujemy). Jakiekolwiek odwołanie się do zmiennej lokalnej spoza funkcji jest niemożliwe. 2. Zmienne lokalne są tworzone na stosie. Oznacza to tyle, że istnieją one w pamięci tylko wtedy, gdy wywoływana jest dana funkcja. Gdy skończy ona swoje działanie zmienne te są tracone (praktycznie pozostają na stosie śmieci ale to nas nie interesuje).
Rozwiązania Twojego problemu są przynajmniej dwa. Po pierwsze możesz stworzyć tablicę globalną. Po drugie - stworzyć tablicę dynamicznie wewnątrz funkcji i zwrócić wskaźnik do niej (mniej więcej tak jak teraz). Dynamiczne obiekty różnią się tym, że nie są tworzone na stosie a na stercie. Tym samym nie dotyczy ich pojęcie zasięgu. |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-02-20 17:07:55 No tak moge stworzyć tablice globalną , no ale ile ona ma mieć elementów ? Do czego ją podpiąć jak jest na samej górze i nie ma się do czego odwołać , a jak tablice dynamiczną zrobić?? |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-02-20 18:36:52 Nikt nie pomoże :))) ??? |
|
« 1 » 2 3 |