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ść
domin568
Temat założony przez niniejszego użytkownika
» 2013-02-20 19:20:41
Wymyśliłem coś takiego jednak mam błąd
invalid conversion from 'int' to 'int*' [-fpermissive]
 i nie widze tutaj błędu w tej linijce :
int * kosci_przeciwnika = losuj( kosci, wszystkie_kosci );
.
Tutaj cały kod :

C/C++
int wartosc = 0;
int wartoscWygranej = 0;
using namespace std;
void rzucKosci( int kosci, int wszystkie_kosci );

int main()
{
    string START;
   
    cout << "**************************" << endl;
    cout << "|      GRA W KOSCI       |" << endl;
    cout << "|    DOMINIK TAMIOLLO    |" << endl;
    cout << "**************************" << endl;
   
   
    rzucKosci( 5, 6 );
   
    return 0;
}


int losuj( int kosci, int wszystkie_kosci )
{
    int rzucone[ wszystkie_kosci + 1 ];
    for( int i = 0; i < kosci; i++ )
    { int * rzucone = new int[ 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++ )
    {
        kosci_przeciwnika[ i ] = 0;
        tablica[ kosci_przeciwnika[ i ] ] ++;
        cout << kosci_przeciwnika[ i ] << endl;
    }

Nie pisz posta pod postem, używaj opcji Edytuj. » KursyKurs STC kurs - xevuel
P-76586
unimator
» 2013-02-20 19:22:36
C/C++
int * losuj( int kosci, int wszystkie_kosci )
{
    int * rzucone = new int[ wszystkie_kosci + 1 ]; // ta linijka to wlasnie dynamiczna alokacja
    for( int i = 0; i < kosci; i++ )
    {
        rzucone[ i ] = rand() %( wszystkie_kosci ) + 1;
       
        cout << "Twoje kosci to: " << rzucone[ i ] << endl;
    }
    return rzucone;
}

//Przykladowe uzycie czegos takiego:
int * pRzuconeA = losuj( 5, 5 ); //Da to w efekcie wskaznik na dynamiczna tablice z 5 elementami
int * pRzuconeB = losuj( 10, 10 ); //To samo tylko ze da 10 elementow

for( int i = 0; i < 5; ++i )
     pRzuconeA[ i ] = i * i;

//Dynamicznie tworzone zmienne oraz tablice nalezy recznie zniszczyc kiedy nie sa juz potrzebne. Wyglada to tak:
delete[] pRzuconeA;
delete[] pRzuconeB;

I jeszcze jedno:
C/C++
int rzucone[ wszystkie_kosci + 1 ];
Po co Ci ten dodatkowy element?

@down
Ta, coś dzisiaj nie mogę ogarnąć kodowania.
P-76587
Berux
» 2013-02-20 19:23:58
return * rzucone;
 - myślę, że powinieneś zamienić to na:
return & rzucone;

@up
int * pRzuconeB = losuj( 10, 10;
 - nawiasik
P-76588
domin568
Temat założony przez niniejszego użytkownika
» 2013-02-20 19:48:11
tomczyk dobry pomysł tylko że jak zamienie to na & to mam błąd [Error] cannot convert 'int**' to 'int*' in return , 36 linijka czyli przy zwracaniu &return

Kod:
C/C++
int * losuj( int kosci, int wszystkie_kosci )
{
    int * rzucone = new int[ 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;
}
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[ kosci_przeciwnika[ i ] ] ++;
        cout << tablica[ i ] << endl;
    }
P-76589
Berux
» 2013-02-20 20:22:37
Zwróć:
return rzucone;

Przedtem nawet nie popatrzyłem na kod. Błąd taki dostajesz, bo próbujesz zwrócić adres ?(zmiennej wskaźnikowej). Nie wiem czy to odpowiednia nazwa. W razie czego poprawcie :D

/edit:

Plus jeszcze:

C/C++
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[ kosci_przeciwnika[ i ] ] ++;
        cout << tablica[ i ] << endl;
    }
} // nie było klamry :)
P-76590
domin568
Temat założony przez niniejszego użytkownika
» 2013-02-21 17:21:00
Witajcie , napisałem moją aplikacje od nowa , bo już się w tym kodzie pogubiłem , wszystko mi ładnie szło , żadnych błędów kompilacji i poprostu konsola mi się zawiesza gdy jest instrukcja tablica rzucone[i] ++ . Czemu tak się dzieje ? Szukałem błędu dosyć długo , ale nic nie znalazłem :(
Kod (light :P )

C/C++
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;
int * losuj( int, int );
void rzucKosci( int kosci, int wszystkie_kosci );

int main()
{
    string START;
   
    cout << "**************************" << endl;
    cout << "|      GRA W KOSCI       |" << endl;
    cout << "|    DOMINIK TAMIOLLO    |" << endl;
    cout << "**************************" << endl;
   
    rzucKosci( 5, 6 );
   
    return 0;
}

void rzucKosci( int kosci, int wszystkie_kosci )
{
    losuj( 6, 5 );
    int rozmiar = wszystkie_kosci + 1;
    int rzucone[ kosci ];
    int tablica[ rozmiar ];
   
    for( int i = 0; i < rozmiar; i++ )
    {
        tablica[ i ] = 0;
    }
   
    for( int i = 0; i < kosci; i++ )
    {
    }
}
int * losuj( int kosci, int wszystkie_kosci )
{
    int rozmiar = wszystkie_kosci;
    int * tablica = new int[ rozmiar ];
    int * rzucone = new int[ rozmiar ];
    srand( time( NULL ) );
   
    for( int i = 0; i < wszystkie_kosci; i++ )
    {
        * rzucone = rand() % kosci + 1;
        tablica[ rzucone[ i ] ] ++;
        cout << * rzucone << endl;
    }
    return tablica;
    return rzucone;
}
P-76629
unimator
» 2013-02-21 18:21:54
C/C++
int * losuj( int kosci, int wszystkie_kosci )
{
   
   
    int rozmiar = wszystkie_kosci;
    int * tablica = new int[ rozmiar ];
    int * rzucone = new int[ rozmiar ];
    //0x12345678 - przykładowa wartość jaką może przyjmować zmienna rzucone.
    srand( time( NULL ) );
   
    for( int i = 0; i < wszystkie_kosci; i++ )
    {
        * rzucone = rand() % kosci + 1; //W ten sposób zmieniasz tylko pierwszy element
        //tablicy. Zgadnij dlaczego. No chyba, że
        //zależy Ci na tworzeniu tablicy po to by
        //korzystać tylko z jednego elementu.
        tablica[ rzucone ] ++; //Próba odwołania się do 0x12345678 elementu tablicy
        //Nie analizowałem reszty kodu ale taki element...
        //... raczej "nie istnieje" :)
        cout << * rzucone << endl;
       
       
    }

Pewnie komentarze nie wystarczą więc wyjaśniam:
C/C++
int * pointer = new int;
* pointer = 3;

Zgadnij co się stanie jak spróbujesz wypisać:
*pointer
Zgadłeś, zostanie wypisane 3.
A teraz zgadnij co się stanie jak spróbujesz wypisać:
pointer
Niespodzianka (albo i nie). Zostanie wypisany adres, na który wskazuje zmienna int * pointer. Czyli liczba, która kompletnie nas nie interesuje w arytmetyce.

Poza tym:
C/C++
* rzucone = rand() % kosci + 1;
Z dereferencji zmiennej rzucone otrzymasz dostęp do pierwszego elementu tablicy (i tylko pierwszego bo nie ma tu offsetu co obieg pętli a chyba o to Ci chodziło).

No i jeszcze taka mniejsza uwaga, teoretycznie kosmetyczna. Zgadnij czemu ten kod jest zły:
C/C++
int a = 1;
int b = a;
int c = b;
int d = c;
printf( "%i\n", d );

A teraz zobacz co robisz:
C/C++
int rozmiar = wszystkie_kosci;
int * tablica = new int[ rozmiar ];
int * rzucone = new int[ rozmiar ];
//...
for( int i = 0; i < wszystkie_kosci; i++ )

No i jeszcze Twój program ma wycieki pamięci bo nie usuwasz tablic w funkcji losuj. Więcej nie chce mi się szukać.
P-76637
domin568
Temat założony przez niniejszego użytkownika
» 2013-02-21 18:42:18
Dzięki , zrozumiałem , tylko że mam teraz problem ze sprawdzeniem czy jest dwójka , para , etc . Kiedy jest na przykład para to wypisuje tylko jedną dwójke , czasami wypisze 2 dwójki , dosyć to dziwne może wy mi pomożecie w tym troche :P ??

Kod:
C/C++
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;
int * losuj( int, int );
void rzucKosci( int kosci, int wszystkie_kosci );

int main()
{
    string START;
   
    cout << "**************************" << endl;
    cout << "|      GRA W KOSCI       |" << endl;
    cout << "|    DOMINIK TAMIOLLO    |" << endl;
    cout << "**************************" << endl;
   
    rzucKosci( 5, 6 );
   
    return 0;
}

void rzucKosci( int kosci, int wszystkie_kosci )
{
    losuj( 6, 5 );
    int rozmiar = kosci + 1;
    int rzucone[ kosci ];
    int tablica[ rozmiar ];
   
    for( int i = 0; i < rozmiar; i++ )
    {
        tablica[ i ] = 0;
    }
   
}
int * losuj( int kosci, int wszystkie_kosci )
{
    int rozmiar = wszystkie_kosci;
    int * tablica = new int[ rozmiar ];
    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() %( wszystkie_kosci ) + 1;
        tablica[ rzucone[ i ] ] ++;
        cout << rzucone[ i ] << endl;
       
    }
    cout << endl;
    for( int i = 0; i < rozmiar; i++ )
    {
        cout << tablica[ i ] << endl;
    }
    return rzucone;
}
P-76645
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona