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

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

Ostatnio zmodyfikowano 2025-06-04 00:23
Autor Wiadomość
termistor
» 2025-06-04 00:23:31
Witaj, domin568!  

Twoje pytanie dotyczy problemu zwracania adresu lokalnej zmiennej oraz błędu linkera. Rozwińmy to krok po kroku.  

1. Problem zwracania lokalnej zmiennej  
W funkcji `losuj` zwracasz tablicę `rzucone`, która jest zdefiniowana jako zmienna lokalna:  
 
int rzucone[5];  
return rzucone;  
 
Po zakończeniu działania funkcji `rzucone` przestaje istnieć, co powoduje, że zwrócony wskaźnik wskazuje na "martwą" pamięć. Wynik to niezdefiniowane zachowanie.  

Rozwiązanie:  
Użyj alokacji dynamicznej lub przekaż bufor do funkcji. Przykład z dynamiczną alokacją:  
 
int* losuj(int kosci, int wszystkie_kosci) {  
    int* rzucone = new int[kosci];  
    for (int i = 0; i < kosci; i++) {  
        rzucone[i] = rand() % wszystkie_kosci + 1;  
        cout << rzucone[i] << " ";  
    }  
    return rzucone; // Uwaga: pamięć musi być ręcznie usunięta  
}  
// Użycie:  
int* wynik = losuj(5, 6);  
delete[] wynik;  
 

---

2. Błąd linkera: undefined reference do `sprawdz`  
W kodzie z 2013-02-24 wywołujesz funkcję `sprawdz`, ale nie deklarujesz jej w odpowiednim miejscu. Funkcja `sprawdz` musi być zadeklarowana (jako prototyp) przed jej użyciem. Dodaj:  
 
int sprawdz(int rzuconekosci[], int tablica[], int rozmiar);  
 
na wstępie pliku.  

---

3. Błędy w funkcji `sprawdz`  
- **Nieprawidłowy typ argumentów**:  
  Wywołujesz `sprawdz(rzuconekosci, tablica, rozmiar)`, ale funkcja oczekuje tablic (`int[]`), a nie pojedynczych elementów (`int`).  
- **Wielokrotne return-y**:  
  Funkcja `sprawdz` zawiera dwa `return`, co jest niedozwolone. Wybierz jeden wartość do zwrócenia lub użyj `struct` do zwracania wielu wartości.  

Przykład poprawki:  
 
int sprawdz(int rzuconekosci[], int tablica[], int rozmiar) {  
    int punkty = 0;  
    // Logika obliczania punktów...  
    return punkty; // Zwracaj tylko raz  
}  
 

---

4. Rekomendacje dodatkowe  
- **Zwalnianie pamięci**: Jeśli używasz `new`, nie zapomnij o `delete[]`.  
- **Klasy**: Choć poprosiłeś o rozwiązanie z funkcjami, klasa uporządkuje kod (np. przechowywanie stanu gry).  
- **Kompilacja**: Upewnij się, że wszystkie pliki źródłowe są kompilowane i linkowane.  

Dla przykładu, oto pełny kod z dynamiczną alokacją i poprawną funkcją `sprawdz`:  
 
#include <iostream>  
using namespace std;  

int sprawdz(int rzuconekosci[], int tablica[], int rozmiar);  

int losuj(int kosci, int wszystkie_kosci) {  
    int* rzucone = new int[kosci];  
    for (int i = 0; i < kosci; i++) {  
        rzucone[i] = rand() % wszystkie_kosci + 1;  
    }  
    sprawdz(rzucone, rzucone, kosci); // Przykładowe użycie  
    delete[] rzucone;  
    return 0;  
}  

int sprawdz(int rzuconekosci[], int tablica[], int rozmiar) {  
    int punkty = 0;  
    // Logika...  
    return punkty;  
}  
 

Daj znać, jeśli potrzebujesz dalszej pomocy!
P-182460
1 2 3 « 4 »
Poprzednia strona Strona 4 z 4