• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja z parametrem wskaznika tablicy struktur

Object Storage Arubacloud
0 głosów
287 wizyt
pytanie zadane 11 grudnia 2016 w C i C++ przez czujek22 Dyskutant (7,670 p.)

Witam. Robie zadanie o tresci: Funkcja getinfo() ma dwa parametry: wskaźnik pierwszego elementu tablicy struktur student oraz liczbę int określającą liczbę elementów w tablicy. Funkcja pobiera i zapisuje dane o studentach. Wprowadzanie danych kończy się, kiedy tablica jest pełna lub podane zostanie puste nazwisko studenta. Funkcja zwraca liczbę studentów wpisanych do tablicy.

Jednak wyskakuje błąd w linijce 28 gdzie deklaruje zmienna entered i przypisuje dynamiczną tablicą struktur. Najprawdopodobniej błąd z wywołaniem i samą funkcją jednak nie mogę go znaleźć, ponieważ przepisałem to z książki, jedynie funkcje zrobiłem sam a błąd wyskoczył tam, gdzie się tego nie spodziwałem;

 

#include <iostream>

using namespace std;

const int SLEN = 30;
struct student
{
    char fullname[SLEN];
    char hobby[SLEN];
    int ooplevel;
};

int getinfo (student pa, int n);
void display1 (student st);
void display2 (const student * ps);
void display3 (const student pa[], int n);

int main()
{
    cout << "Podaj wielkosc grupy: ";
    int class_size;
    cin>>class_size;

    while(cin.get()!='\n')
        continue;

    student * ptr_stu = new student[class_size];
    int entered = getinfo(ptr_stu, class_size);
        for(int i=0;i<entered;i++)
        {
            display1(ptr_stu[i]);
            display2(&ptr_stu[i]);
        }
    display3(ptr_stu, entered);
    delete [] ptr_stu;
        cout<<"Gotowe!\n";
    return 0;
}


int getinfo (student pa[], int n)
{
    for(int i=0;i<n;i++)
    {
        cout<<"Podaj nazwisko studenta: ";
        cin.getline(pa[i].fullname, SLEN);

        if(cin.get() == '\n')
            break;

        cout<<"Podaj jego hobby: ";
        cin.getline(pa[i].hobby, SLEN);

        cout<<"Podaj jego numer: ";
        cin>>pa[i].ooplevel;
    }
    return i;
}

 

1
komentarz 11 grudnia 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
int getinfo (student *pa, int n);

ma dwa parametry: wskaźnik pierwszego elementu tablicy struktur student oraz liczbę int...

Jeżeli chodzi o 28 linijkę ;) 

komentarz 11 grudnia 2016 przez czujek22 Dyskutant (7,670 p.)
Czyli jednak błąd lub podpucha w książce bo prototyp był do przepisania :) Dzieki
komentarz 11 grudnia 2016 przez Adii Użytkownik (960 p.)

W mojej książce widnieje prototyp:

int getinfo(student pa[], int n);

Błąd w książce.

1 odpowiedź

0 głosów
odpowiedź 11 grudnia 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 11 grudnia 2016 przez plkpiotr

Wobec tego uzupełnię... Wszystko jest w książce w porządku : )
W kodzie, który umieściłeś na forum w linijce 13' (w prototypie) brakuje * lub []. Później jednak w definicji funkcji w linijce 41' wpisałeś już poprawną wersję...
Bez znaczenia, który z symboli wybierzesz, bo dla tablicy są sobie równoważne. Dlaczego? Dlatego, że tablice przekazywane jako argument funkcji nie są kopiowane, a przekazywane jak wskaźniki, czyli działamy na oryginale, nie na kopii. Stąd składnia C++ wymusza, że tablice jednowymiarowe możemy przekazywać jako argument na trzy sposoby:

void funkcja(int tab[ROZMIAR]);
void funkcja(int tab[]);
void funkcja(int *tab);
komentarz 11 grudnia 2016 przez niezalogowany

void funkcja(int tablica[LICZBA_ELEMENTÓW]);

Taki prototyp jest błędny.

komentarz 11 grudnia 2016 przez plkpiotr Stary wyjadacz (12,420 p.)

Jeżeli z góry ustalimy wielkość tablicy, to dlaczego nie? Fakt, że znajomość wielkości tablicy nie jest nam do tego potrzebna i spokojnie możemy ją przekazać jako drugi argument stałoprzecinkowy, jednak jest taka możliwość...

1
komentarz 11 grudnia 2016 przez czujek22 Dyskutant (7,670 p.)

Tak, wiem o tym. Jednak tutaj mój błąd, nie zauważyłem, że nie dałem [] po nazwie.

W książce widnieje poprawny prototyp:

int getinfo(student pa[], int n);

 

komentarz 11 grudnia 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
O to mi chodziło, zatem zagadka rozwiązana ; )

Podobne pytania

0 głosów
0 odpowiedzi 437 wizyt
pytanie zadane 30 stycznia 2019 w Offtop przez Konrad Gałach Użytkownik (880 p.)
0 głosów
1 odpowiedź 117 wizyt
pytanie zadane 24 maja 2017 w C i C++ przez MagicznyJasio Użytkownik (580 p.)
0 głosów
1 odpowiedź 321 wizyt
pytanie zadane 15 marca 2016 w HTML i CSS przez Filip31411 Dyskutant (8,820 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...