Przekazywanie tablicy struktur do danych funkcji.

0

Witam!
Stawiam pierwsze kroki w C++, bawiłem się ostatnio sporo w C# w którym mogłem odpocząć od wskaźników, dziś znowu się z nimi mierzę. I według mnie to ich wina!(wcale nie moja ;) )
A więc pojawia się takie błędy:
||=== Build: Debug in 1.5 Praca na strukturach - student (compiler: GNU GCC Compiler) ===|
32|undefined reference to LoadingData(int, Student)'| 33|undefined reference to ShowingData(int, Student)'|
||error: ld returned 1 exit status|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
po wycięciu z logów adresów plików.
A sam kod wygląda następująco:

#include <iostream>
#include <string>
using namespace std;

struct Student
{
    string imie;
    string nazwisko;
    int pierwszaOcena;
    int drugaOcena;
    int trzeciaOcena;
    float srednia;
};

void LoadingData(int, Student);
void CountingAverage(int, Student);
void ShowingData(int, Student);

int main()
{
    int amount;
    float averge;

    cout << "Witaj w programie ktory policzy srednia dla studentow zdajacych 3 egzaminy w sesji!" << endl;
    cout << "Ilu jest studentow? ";
    cin >> amount;

    Student* studenci = new Student[amount];

    cout << "Teraz bedziesz proszony o podanie kolejnych informacji o kolejnych studentach!" << endl << endl;

    LoadingData(amount, *studenci);
    ShowingData(amount, *studenci);

    return 0;
}

void CountingAverage(int amount, Student* studenci[])
{
    for(int i = 0; i < amount; i++)
    {
         studenci[i]->srednia = ((float)studenci[i]->pierwszaOcena + (float)studenci[i]->drugaOcena + (float)studenci[i]->trzeciaOcena) / (float)(3);
    }
}

void LoadingData(int amount, Student* studenci[])
{
    for(int i = 0; i < amount; i++)
    {
        cout << "Podaj imie studenta nr. " << i + 1 << ":";
        cin >> studenci[i]->imie;
        cout << endl;

        cout << "Podaj jego nazwisko";
        cin >> studenci[i]->nazwisko;
        cout << endl;

        cout << "Podaj jego ocene z przedmiotu #1: ";
        cin >> studenci[i]->pierwszaOcena;

        cout << "Podaj jego ocene z przedmiotu #2: ";
        cin >> studenci[i]->drugaOcena;

        cout << "Podaj jego ocene z przedmiotu #3: ";
        cin >> studenci[i]->trzeciaOcena;

    }
}

void ShowingData(int amount, Student* studenci[])
{
    for(int i = 0; i < amount; i++)
    {
        cout << "Student #" << i + 1 << ". " << studenci[i]->imie << " " << studenci[i]->nazwisko << ", ma srednia: " << studenci[i]->srednia << endl;
    }
}

Szczerze nie mam pojęcia co sknociłem. I w jaki sposób to naprawić.. Jakieś porady?

1

Student i Student*[] to zupełnie różne typy.

BTW: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

0
kq napisał(a):

Student i Student*[] to zupełnie różne typy.

BTW: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

void LoadingData(int, Student);
void CountingAverage(int, Student);
void ShowingData(int, Student);

LoadingData(amount, *studenci);
ShowingData(amount, *studenci);

Czyli rozumiem, że problem z "typami" jest właśnie w tych liniach? Tylko w jaki sposób dostosować je tak by operatory się zgadzały?

1

Jak chcesz tablicę to przyjmuj i przekazuj wskaźnik. Tak btw 2, dlaczego amount? Studenci są niepoliczalni? :​D

0
kq napisał(a):

Jak chcesz tablicę to przyjmuj i przekazuj wskaźnik. Tak btw 2, dlaczego amount? Studenci są niepoliczalni? :​D

A czy mogę robić to jakoś inaczej niż na tablicy struktur?
Jest jakiś sposób by uniknąć tutaj zagłębiania się we wskaźniki?

W tym programie są!! :D

1

Moźesz pakować studentów do wektora i przekazywać referencję do niego do funkcji.

0

Z wektorami nie miałem do czynienia. Więc, trzeba się chyba "dowiedzieć" jak tutaj sprytnie posłużyć się wskaźnikami.
W głowie świta mi taka opcja by zrobić coś takiego:
void LoadingData(int, Student*[]);

LoadingData(amount, studenci[amount]);
ale kompilator zresztą pewnie słusznie uważa, że "no match for 'operator
' i co teraz?

1

Piszesz, że masz doświadczenie w C#. W jaki sposób wymyśliłeś, że studenci[amount] to będzie tablica, a nie pojedynczy element? Student*[] to to samo co Student**, czyli wskaźnik na wskaźnik.

void load_data(Student* studenci, int count)

i potem load_data(studenci, count).

Ale jeszcze lepiej użyj wektora, bo inaczej rozbijasz się o rule of zero.

0

Pierwsze. Nie umiem tego wytłumaczyć, chyba wkradła się tutaj solidna desperacja.
Dwa. No tak, zgadzam się bezprecedensowo.

Trzy. Czuję się głupio, że nie dotarło to do mnie, przecież to chyba oczywiste, ale w sumie może i dobrze, że zrobiłem to zdanie, zrobiłem takie "cudo". Na pewno sporo mnie to nauczyło, na pewno by bardziej uważać i baczniej uważać na to co i jak się używa i czym to jest!
Bardzo dziękuje! Zerknę na temat wektorów i na "new".
Pozdrawiam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1