Napisałem taki krótki program, jest on już po poprawkach:
#include <iostream>
int main () {
int database_size;
struct people {
char name[20];
char surname[20];
int mark;
int age;
};
std::cout << "How many people in database: ";
std::cin >> database_size;
std::cin.sync();
people *person = new people [database_size];
for (int i=0; i<database_size; i++) {
std::cout << "What is your name: ";
std::cin.getline(person[i].name,20);
std::cout << "What is your surname: ";
std::cin.getline(person[i].surname,20);
std::cout << "What mark deserve you: ";
std::cin >> person[i].mark;
std::cout << "How old are you: ";
std::cin >> person[i].age;
}
for (int j=0; j<database_size; j++) {
std::cout << "Surname: " << (person[j]).surname;
std::cout << ", " << (person[j]).name;
std::cout << "\nMark: " << (person[j]).mark;
std::cout << "\nAge: " << (person[j]).age;
}
}
Problem polega na tym, że nie rozumiem dlaczego działa. Stworzyłem dynamiczną tablicę struktur. W ksiażce "Język C++. Szkoła Programowania" Stephena Prata jest takie zdanie: "Jeśli tworzymy strukturę dynamiczną, nie możemy użyć operatora "kropka" z nazwą struktury, gdyż struktura nie ma nazwy, a jedynie adres"
W związku z powyższym początkowo napisałem powyższy program tak:
std::cout << "What is your name: ";
std::cin.getline(person[i]->name,20);
to spowodowało błąd:
[Error] base operand of '->' has non-pointer type 'main()::people'
Ponadto chciałem jeszcze w inny sposób się odwołać do pól struktur, mianowicie:
std::cout << "\nMark: " << *(person[j]).mark;
to z kolei wygenerowało błąd
[Error] invalid type argument of unary '*' (have 'int')
Rozumiem, że tablica struktur nie jest strukturą, aczkolwiek tak na chłopski rozum, jest to zbór struktur, więc starałem się robić analogicznie jak dla pojedynczej struktury.