[C++] Tablica dynamiczna jako składnik struktury

0

Cześć!

Mam problem z błędem podczas kompilacji, najpierw napisałem ten program bez konstruktora i wtedy był błąd przy okazji tworzenia tablicy dynamicznej struktur (w mainie), jak zrobiłem konstruktor to błąd jest w tworzeniu tablicy dynamicznej w strukturze. Jak to zadanie powinno w takim razie wyglądać, gdzie błąd?

Oto treść zadania:

Stwórz strukturę punkt w n wymiarowej przestrzeni (rozmiar przestrzeni oraz współrzędne). Napisz dwie funkcje składowe: funkcja wpisz umożliwiająca wprowadzenie wymiaru punktu oraz współrzędnych, funkcja wypisz wypisująca współrzędne na ekranie. Napisz funkcje globalną najdalej, która jako argumenty przyjmuje tablicę punktów oraz jej długość i zwraca punkt leżący najdalej od początku układu współrzędnych. W funkcji main stwórz tablicę punktów o długości wprowadzonej z klawiatury, wypełnij ją za pomocą funkcji wpisz, znajdź punkt leżący najdalej od początku układu współrzędnych i wypisz go na ekranie.

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <math.h>

using namespace std;

struct punkt {
	int n;
	int *w = new int[n];
	punkt();
	void wpisz();
	void wypisz();
};

punkt::punkt()
{
}

void punkt::wpisz() {

	int a;
	cin >> a;
	a = n;
	for (int i = 0; i < n; i++)
		cin >> w[i];
}

void punkt::wypisz() {
	for (int i = 0; i < n; i++)
		cout << w[i] << 'x';
	cout << endl;
}

punkt najdalej(punkt p[], int n);

int main() {
	int x;
	cin >> x;
	punkt *tab = new punkt[x];
	for (int i = 0; i < x; i++)
		tab[i].wpisz();
	najdalej(tab, x);


}

punkt najdalej(punkt p[], int n) {
	int dlugosc = 0;
	int najlep = 0;
	int indeks = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < p[i].n; j++)
			dlugosc += pow(p[i].w[j], 2);
		dlugosc = sqrt(dlugosc);
		if (dlugosc > najlep) {
			najlep = dlugosc;
			indeks = i;
		}
	}
	return p[indeks];
}
1
  int *w = new int[n];

Powinno być samo

 int *w;

a dopiero w konstruktorze

 w = new int[n];

tylko najpierw zadbaj o to, żeby to

 n

miało jakąś wartość.

Ale widzę, że u ciebie funckja wpisz() dopiero mówi nam jaki będzie rozmiar tablicy, więc powinna wyglądać mniej więcej tak:

void punkt::wpisz() {
    cin >> n;
    w = new int[n];
    for (int i = 0; i < n; i++)
        cin >> w[i];
}
2

Przydałby się destruktor, który umie zwolnić pamięć alokowaną dla tablicy.

0

@fryderykst:
Dzięki, zrobiłem tak jak mówisz czyli poprawiłem literówkę w funkcji wpisz (a = n zamiast n = a) i te wskaźniki, a w ciele struktury napisałem że int n = 10. Tylko wtedy nie można dać więcej niż 10 wymiarowej, ale nie mam innego pomysłu jak to zrobić jak żeby było zgodne z treścią zadania.
@carlosmay:
Dzięki, cenna uwaga.

1

@Petro-7:
Nie rób w ciele struktury n=7, przecież w funkcji wpisz() pierwszy cin pobiera właśnie n, a dopiero później po kolei elementy tablicy n-wymiarowej
Podsumowując: konstruktor niepotrzebny, funkcjia wpisz() ma wyglądać tak jak podałem powyżej, a dodajesz destruktor, żeby zwolnić wcześniej za-alokowaną pomięć:

~punkt()
{
    delete[] w;
    w = NULL;
}

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