Alokacja pamięci do tablicy struktur w funkcji...

0

Cześć otóż mam taki problem muszę stworzyć funkcję która alokuje pamięć dla tablicy struktur i niestety nie wiem jakie wartości przyjąć itd.Wklejam kawałek kodu.

 

struct Person
 {
	int id;
	string name;
	string surname;
	string sex;
	int birthDate;
 };

 //funkcja dzięki której możemy dodać nowe osoby
 void addNew(Person t[],int i)
 {
	t[i].id=i;
	cout<<"Podaj imie: ";
	cin>>t[i].name;
	cout<<"Podaj nazwisko: ";
	cin>>t[i].surname;
	cout<<"Podaj plec: ";
	cin>>t[i].sex;
	cout<<"Podaj rok urodzenia: ";
	cin>>t[i].birthDate; 
 }
 //funkcja wypisująca dane na pulpit
 void writeOnScreen(Person t[], int i) 
 {
	cout<<"Numer Osoby:"<<t[i].id<<endl;
 	cout<<"Imie: "<<t[i].name<<endl;
	cout<<"Nazwisko: "<<t[i].surname<<endl;
	cout<<"Plec: "<<t[i].sex<<endl;
	cout<<"Rok Urodzenia: "<<t[i].birthDate<<endl;
 }

   void create(int n,Person tab[])  //tu jest jakiś błąd nie wiem jaki...
  {
	  Person *tab = new Person [n];
  }

  void eliminate(Person tab[])
  {
	  delete [] tab;
  }
 

Z góry dziękuję za pomoc

0

Tworzysz w funkcji nową zmienną o takiej samej nazwie jak w w liście parametrów. Czyli powinno być

tab = new Person [n];

w ciele funkcji.

1

Porównaj ten kod:

  void create(int n,Person tab[])  //tu jest jakiś błąd nie wiem jaki...
  {
      Person *tab = new Person [n];
  }

Z tym:

  void create(int n,Person tab[])
  {
      tab = new Person [n];
  }

W pierwszym przypadku tworzysz zmienną lokalną tab, która zasłania argument. De facto argument nie jest używany.
W drugim faktcznie używasz argumentu.

0

Aha teraz rozumiem :) Lecz mam inny problem.Jak mam zainicjować strukturę tablicową w mainie jeżeli nie znam wielkości tablicy ,a alokacja odbywa się w funkcji do której wywołania potrzebuję zainicjowania struktury tablicowej.Kod:

void main()
{
	
 int n;
Person tab[?];

 create(n,tab);
}
 
2

W mainie masz tylko deklarację - bez inicjalizacji.

int main()
{
    int n;
    Person* tab;
    //gdzieś tu wczytanie n
    create(n, tab)
}

Niemniej są lepsze sposoby na robienie czegoś takiego. Np. klasa wektor:

std::vector<Person> vector;

//a dodawać można tak
vector.push_back(nowaOsoba);

Polecam poczytać:
http://www.cplusplus.com/reference/vector/vector/

3

Skorzystaj z std::vector i dodawaj tyle elementów ile potrzebujesz.

0

Inicjalizację też mam wklejam tylko fragmenty kodu które mogą się przydać do danego problemu ogólnie main wygląda tak.Nadal występuje błąd brak inicjalizacji zmiennej tab.

 
void main()
{
	
 int n,i;

 cout<<"Podaj liczbe osob ktore chcesz dodac: ";
 cin>>n;

 Person* tab;

 create(n,tab);

 for (i=0;i<n;i++)
 {
 addNew(tab,i);
 cout<<endl;
 };
 
 for (i=0;i<n;i++)
 {
 writeOnScreen(tab,i);
 };

 
 eliminate(tab);

 system ("Pause");
} 
3

Jeśli chcesz w funkcji create tworzyć tablicę, to musisz dać albo referencję do wskaźnika, albo wskaźnik na wskaźnik, albo jak to powinno się zrobic trochę najwłasciwiej - zwrócic wskaźnik, a najlepiej uzyć std::vector (o którym juz pisano....).

0

Czy moglibyście napisać jakiś przykład kombinuje już i kombinuję i nie mogę nic wymyślić została mi końcówka tego programu,a przykłady lepiej byłoby mi analizować niż zagadnienia które mi podajecie.

0

@k3j4
Użyj klasy vektor, o której Ci napisałem w ostatnim poście.
albo jeśli to koniecznie musi być na wskaźnikach, to zrób taką funkcję:

Person* create(int n)
{
    <del>Person* tab = new tab[n]</del>
    Person* tab = new Person[n]
    return tab;
}
1

@xfin

Od razu niech będzie

return new Person[n];

I już masz fabrykę :)

0

Niestety nie mogę używać funkcji które zwracają wartość mogę używać tylko funkcji void:(

2

To tak mozesz:

#include<iostream>

class person {};

void create(unsigned count, person *& persons)
{
    persons =  new person[count];
}

int main()
{
    person *p = nullptr;
    create(10, p);
    delete[] p;
    return 0;
}

1

Możesz spróbować czegoś takiego:

#include<iostream>
#include<string>
#include <vector>

struct Person
 {
    std::size_t id;
    std::string name;
    std::string surname;
    std::string sex;
    std::string birthDate;
 };

 //funkcja dzięki której możemy dodać nowe osoby
 void addNew(std::vector<Person>& persons, std::size_t id)
 {
     Person person;
     person.id = id;
     std::cout << "Podaj imie: ";
     std::cin >> person.name;
     std::cout << "Podaj nazwisko: ";
     std::cin >> person.surname;
     std::cout << "Podaj plec: ";
     std::cin >> person.sex;
     std::cout << "Podaj rok urodzenia: ";
     std::cin >> person.birthDate;
     persons.push_back(person);
 }

 //funkcja wypisująca dane na pulpit
 void writeOnScreen(std::vector<Person>& persons)
 {
     for (std::size_t i = 0; i < persons.size(); ++i) {
         std::cout << "Numer Osoby:" << persons[i].id << std::endl;
         std::cout << "Imie: " << persons[i].name << std::endl;
         std::cout << "Nazwisko: " << persons[i].surname << std::endl;
         std::cout << "Plec: " << persons[i].sex << std::endl;
         std::cout << "Rok Urodzenia: " << persons[i].birthDate << std::endl;
     }
 }

 int main()
 {
     std::vector<Person> persons;
     addNew(persons, persons.size() + 1);
     addNew(persons, persons.size() + 1);
     writeOnScreen(persons);
 } 

Zachowane są funkcje dodająca i wypisująca Persony. Usunięto alokację i zwalnianie pamięci.
Funkcje nadal są void.

0

tak jak pisaliście studia i ćwiczenia z alokacji warunki to nie korzystanie z klas ani funkcji innych niż void.Muszę stworzyć własny program który posiada funkcje alokującą i zwalniającą pamięć owszem vector może mógłbym wykorzystać,ale musiał bym go się uczyć od nowa,a na to trochę mało mam czasu .Musze korzystać ze wskaźników

2

W nowoczesnym C++ jeśli piszesz z palca delete to powinien Ci się x. Natanek i jego "wiedz, że coś się dzieje!" przypomnieć. Prawdopodobnie potrzebujesz wtedy kontenera albo sprytnego wskaźnika. Albo tego i tego. ;)

No ale nic, ucz się ucz, nauka to do wiedzy klucz. Tylko nie zapomnij się tego później oduczyć, żeby się nauczyć jak to się powinno robić porządnie. :P

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