Tablice dynamiczne w strukturze

0

Witam, jestem tu nowy, więc jeżeli coś jest nie tak w moim poście to od razu poprawiajcie :)
Pisałem program :

Stwórz strukturę punktu reprezentujący punkt w N
wymiarowej przestrzeni (rozmiar przestrzeni oraz
tablicę współrzędnych).

i myślałem, ze taki kod jest ok:

 struct wymiar
{
	short n;
	short *w = new short[n];

};

ale wyskakuje błąd po uruchomieniu programu
user image

prosze o pomoc, Jakie macie koncepcje? Czy można tak deklarować tablice?

2

A ile wynosi n w tamtym miejscu? Nie wiesz? Ja też nie! Wynosi pewną losową wartość, a ty próbujesz alokować tyle pamięci.

0
Shalom napisał(a):

A ile wynosi n w tamtym miejscu? Nie wiesz? Ja też nie! Wynosi pewną losową wartość, a ty próbujesz alokować tyle pamięci.

Jezus ale jestem głupi :) nie pomyślałem o śmieciach :)
A jak to można inaczej zrobić by działało jak w zadaniu?
i Czy tablica lokuje się od razu, czy dopiero przy deklarowaniu zmiennej?

0

Przyjrzyj się temu i stwórz implementację dopasowaną do własnych potrzeb.

0

@spartanPAGE proponujesz mi szablon klasy, niestety mój ćwiczeniowiec usunie mi cały kod i każe pisać od nowa bez tego, bo nie mieliśmy tego jeszcze.

0

@Shalom wystarczyło wpisać n = 0; :) Masakra, dzięki za pomoc.

2
Thamed napisał(a):

@spartanPAGE proponujesz mi szablon klasy, niestety mój ćwiczeniowiec usunie mi cały kod i każe pisać od nowa bez tego, bo nie mieliśmy tego jeszcze.

Więc go upraszczaj.

template<typename T, size_t N>
class Point{
public:
	Point(){}
	Point(initializer_list<double> l): _data(l){}

	const T& get(size_t dimension) const{
		return _data.at(dimension);
	}
	
	void set(size_t dimension, const T &value){
		_data.at(dimension) = value;
	}
private:
	array<T, N> _data;
};
class Point{
public:
	Point(){}
	Point(initializer_list<T> l): _data(l){}

	double get(size_t dimension) const{
		return _data.at(dimension);
	}
	
	void set(size_t dimension, double value){
		_data.at(dimension) = value;
	}
private:
	vector<double> _data;
};

Tak nawiasem mówiąc: To napisz jeszcze raz z szablonami, przy nim :P

0

@spartanPAGE ale chciałbym zrozumieć połowę tego co tam napisałeś :)

1

@Thamed nie no napisanie n=0 to głupi pomysł. Bo teraz masz tablicę na 0 elementów a chyba nie o to chodziło? ;]

2

@Thamed, nie martw się zrozumiesz, nie od razu Rzym zbudowano.
Jeżeli piszesz w C++11 to tak jak wyżej od @spartanPAGE
Jeżeli piszesz w "C++" to:

class Vector
  {
   size_t n;
   short *w;
   Vector(size_t n=0):n(n),w(new short[n]) {}
   ~Vector() { delete[] w; }
   Vector(const Vectror &v) { ... }
   Vector &operator=(const Vectror &v) { ... }
  };

Jeżeli zaś w "C z new" to:

struct Vector
  {
   size_t n;
   short *w;
  };
Vector init(size_t n,short value) { ... }
void clean(Vector *v) { ... }
short get(Vector *v,size_t pos) { ... }
void set(Vector *v,size_t pos,short value) { ... }
0
Shalom napisał(a):

@Thamed nie no napisanie n=0 to głupi pomysł. Bo teraz masz tablicę na 0 elementów a chyba nie o to chodziło? ;]

no Tak :)

 #include"source.cpp"
struct wymiar
{
	short n = 0;
	short *w = new short[n];
	void wpisz(short n, short*w)
	{
		cout << "Wpisz" << endl;
		for (int i = 0; i < n; i++)
		{

			cin >> *(w + i);
		}
	}
	void wypisz(short n, short *w)
	{
		cout << "Prosze" << "\n";
		for (int i = 0; i < n; i++)
		{

			cout <<"Współrzędna "<<(i+1)<<": "<< *(w + i) << "\n";
		}
	}

	void translacja(short n, short *w)
	{
		short *m = new short[n];
		cout << "Prosze podaj wektor, którym chcesz wykonać translacje" << "\n";
		for (int i = 0; i < n; i++)
		{
			cin>>*(m+i);
		}
		for (int i = 0; i < n; i++)
		{
			(*(w + i))+= (*(m + i));
		}
		for (int i = 0; i < n; i++)
		{
			cout << "Współrzędna " << (i + 1) << "po translacji: " << *(w + i) << "\n";
		}
	}
};

int main()
{
	setlocale(LC_CTYPE, ".1250");
	wymiar A;
	cin >> A.n;
	A.wpisz(A.n, A.w);
	cout << endl;
	A.wypisz(A.n, A.w);
	cout << endl;
	A.translacja(A.n, A.w);
	system("Pause");
	return 0;
}

działa jak należy :) może się deklaruje, ale nie zajmuje dużo miejca, więc można przeoczyć, a dalej deklaruje się tak jak powinna, przy inicjalizacji.

0

To że działa to czysty przypadek.
Jeżeli wykładowca to zobaczy to będzie wiedział że absolutnie nie zrozumiałeś pojęcia obiektu.

0

No dobra, ale w takim razie po co w ogóle robisz inicjalizacje tych pól struktury? Czemu nie zwyczajne

struct wymiar
{
    short n;
    short *w;
//
};

?

0
Shalom napisał(a):

No dobra, ale w takim razie po co w ogóle robisz inicjalizacje tych pól struktury? Czemu nie zwyczajne

struct wymiar
{
    short n;
    short *w;
//
};

?

twierdzisz, żebym tablice dynamiczną inicjalizował za każdym razem poza strukturą

W zadaniu jest:

Stwórz strukturę punktu reprezentujący punkt w N
wymiarowej przestrzeni (rozmiar przestrzeni oraz
tablicę współrzędnych).

0

@Thamed nie, twierdzę żebyś ja inicjalizował kiedy JUŻ WIESZ ile ma mieć elementów! Bo teraz to masz tablicę na 0 elementów i to że się nie wysypuje program od razu to kwestia szczęścia, nic więcej. Ja bym tworzył tablicę w konstruktorze na przykład...
A jeszcze przekazywanie do metody jako parametrów pól obiektu/struktury na którym wywołujesz metodę to jest jakiś WTF. Ty w ogóle rozumiesz co robisz? o_O

0

Dodam tylko że metody mają korzystać ze swoich składowych a nie dostawać własne składowe poprzez parametry.
Jak to masz zrobić dostałeś tu: http://4programmers.net/Forum/1097803

0

przypominam, że nie opanowałem klas konstruktorów itp

0

No to masz trzecią wersje.

0

Dobra, przyszedłem po pomoc i ją dostałem (obrzucenie błotem w pakiecie) Dzięki.
Posiedzę nad programem, skorzystam z waszych rad i poszukam coś jeszcze na forum(dopiero je znalazłem).
Temat można zamknąć, czy cuś.

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