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!