Tablice dynamiczne C++

0

Cześć wszystkim. Jako, że jestem nowym użytkownikiem bądźcie wyrozumiali:)
Zacząłem się bawić trochę wskaźnikami, a bardziej tablicami dynamicznymi i mam teraz mały kłopot, otóż gdy chcę usunąć wskaźnik do starej tablicy i podstawić nowy to program się zawiesza. Zapewne coś źle przypisuję ale nie jestem tego świadom. Więc proszę o małą pomoc, jakieś nakierowanie.

Oto kod:

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

struct Student{
	string imie = "";
	string nazwisko = "";
	int wiek = 0;
	int indeks = 0;
};

void add(string imie, string nazwisko, int wiek, int indeks, Student *&students, int &size){
	Student * tempTab;
	Student temp;
	temp.imie = imie;
	temp.nazwisko = nazwisko;
	temp.wiek = wiek;
	temp.indeks = indeks;
	if (size != 0){
		tempTab = new Student[size + 1];
		for (int i = 0; i < size; i++){
			tempTab[i] = students[i];
		}
		tempTab[size++] = temp;
		delete[] students;
		students = tempTab;
	}
	else{
		students[size++] = temp;
	}
}

int main() {
	Student * students;
	int size = 0;
	students = new Student[1];
	add("Marek", "Fujarek", 21, 205067, students, size);
	add("Mateusz", "Jakiś", 31, 283945, students, size);

	cout << students[0].imie << "\n";
}
```cpp

0

Przeciez to sie nawet nie skompiluje... Poza tym źle robisz to delete. Nie wiem skad pomysł na tego & tam i nie wiem czemu nie robisz delete[]

0
 if (size != 0){
        tempTab = new Student[size + 1];
        for (int i = 0; i < size; i++){
            tempTab[i] = students[i];
        }
        delete &students;
        students
        delete[] tempTab;
    }

wytlumacz mi sens tutaj tempTab, albo najlepiej kazdej linijki. Bo tu wiecej bledow niz linijek

0
if (size != 0){
        tempTab = new Student[size + 1]; //stworzyłem nową tablicę o jeden większą od aktualnej
        for (int i = 0; i < size; i++){
            tempTab[i] = students[i]; //tutaj w pętli przepisuję dane z aktualnej tablicy
        }
        tempTab[size++] = *temp; // dodaję na końcu tablicy nowy wpis
        delete[] students; //usuwam tablicę z pamięci
        students = tempTab; //tutaj chciałem podstawić nową tablicę do miejsca w pamięci poprzedniej tablicy
        delete[] tempTab; //usuwam według mnie już zbędną tablicę
 }
 

O coś takiego mi mniej więcej chodziło ale jak już wiecie, nie działa:)

2

Dlaczego po prostu nie użyjesz std::vector? :-(

Po co temp jest wskaźnikiem?

To, że usuwasz starą tablicę jest dobrze, ale nie możesz usunąć przecież tej nowej! Wtedy nie masz żadnej tablicy. students = tempTab; przepisuje adres tempTab do students, jeżeli potem usuniesz tempTab to usunąłeś też students.

1

Właściwie to jest dwie opcje:

#include <iostream>
#include <string>
using namespace std;
 
struct Student
  {
   string imie,nazwisko;
   int wiek,indeks;
   Student() {}
   Student(const string &imie,const string &nazwisko,int wiek,int indeks):imie(imie),nazwisko(nazwisko),wiek(wiek),indeks(indeks) {}
  };
 
void add(const string &imie,const string &nazwisko,int wiek,int indeks,Student *&students,size_t &size)
  {
   Student *newStudents=new Student[size+1];
   for(size_t i=0;i<size;++i) newStudents[i]=students[i];
   if(size) delete[] students;
   students=newStudents;
   students[size].imie=imie;
   students[size].nazwisko=nazwisko;
   students[size].wiek=wiek;
   students[size].indeks=indeks;
   ++size;
  }
 
void add2(const Student &newone,Student *&students,size_t &size)
  {
   Student *newStudents=new Student[size+1];
   for(size_t i=0;i<size;++i) newStudents[i]=students[i];
   if(size) delete[] students;
   students=newStudents;
   students[size++]=newone;
  }
 
int main()
  {
   Student *students=0;
   size_t size=0;
   add("Marek", "Fujarek",21,205067,students,size);
   add2(Student("Mateusz","Jakiś",31,283945),students,size);
   for(size_t i=0;i<size;++i)
     {
      cout<<students[i].imie<<' '<<students[i].nazwisko<<' '<<students[i].wiek<<' '<<students[i].indeks<<endl;
     }
   return 0;
  }
  1. Lepiej jednak używać vector, ale dopóki się uczysz to wg mnie powinieneś umieć takiego vector'a napisać
  2. Dla pierwszej konstruktory nie są potrzebne
  3. W C++11 można zrobić nieco ładniej.
0

Dobra poprawiłem parę rzeczy i mój program działa, głównie za sprawą tego że jako parametr podałem

Student *&students

i teraz moje pytanie co dokładnie robi *&

??? czy jest to referencja do wskaźnika??
0

Dzięki, wszyscy bardzo mi pomogliście co do tego zadania:)
Przede mną długa droga i z chęcią będę wracał na te forum po pomoc jeśli będę jej potrzebował:)

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