zwracama wartość metody jako argument innej funkcji -problem

0

Witam,
mam pytanie początkującego, poniżej umieściłem fragment mojego kodu odpowiedzialnego za kinematykę odwrotną, jednak mam następujący problem. Jeżeli chcę wyświetlić wartość macierzy/tablicy Xroty w funkcji main za pomocą metody Display z klasy matrix otrzymuję jakieś dziwne wartości (śmieci), natomiast jeżeli ta sama operacja jest przeprowadzona w Xroty wszystko jest wyświetlane w porządku. Dlaczego tak się dzieje, bardzo byłbym wdzięczny za szybką odpowiedź

class matrix
{
public:
          void Display  (float* A, int SizeAr, int SizeAc);
};

void matrix::Display  (float* A, int SizeAr, int SizeAc)
{
	for (int i=0; i<SizeAr; i++)
	{
		for (int j=0; j<SizeAc; j++)
		{
			cout << A[i*SizeAc + j] << "  ";
		}

		cout << endl;
	}

}

class sva
{
public:
	float* Xroty (double theta);
};

float* sva::Xroty (double theta)
{

	matrix b;

	float c = cos (theta);
	float s = sin (theta);

	float X[36] = {
		c,0,-s,0,0,0,
		0,1,0,0,0,0,
		s,0,c,0,0,0,
		0,0,0,c,0,-s,
		0,0,0,0,1,0,
		0,0,0,s,0,c
	};

	x_roty = X;

	b.Display(x_roty,3,3);

	return x_roty;
}

int main ()
{
	matrix test;
	sva a;

	test.Display(a.Xroty(3),6,6);

	getchar();

	return 0;
}


0

Bo tworzysz tą tablicę X jako LOKALNĄ ZMIENNĄ, która znika po wyjściu z danej funkcji. Stwórz ja za pomocą new[] albo malloc() i wtedy zadziała. Ale pamiętaj tez potem o jej zwolnieniu.

0

wielkie dzięki za odpowiedź (nie mogłem napisać wcześniej, ponieważ nie miałem dostępu do internetu), jednak nadal mam problem, gdy ustawiam sobie tablice dynamiczna

float* sva::Xroty  (double theta)
{

        matrix b;

        float c = cos (theta);
        float s = sin (theta);

        x_roty = new float [36];


        float X[36] = {
                c,0,-s,0,0,0,
                0,1,0,0,0,0,
                s,0,c,0,0,0,
                0,0,0,c,0,-s,
                0,0,0,0,1,0,
                0,0,0,s,0,c
        };

        x_roty = X;

        b.Display(x_roty,3,3);

        return x_roty;
}

nadal w wyniku dostaję śmieci

0
x_roty = X;

Genialne w swej prostocie, ale na dobrą sprawę nie robi tego na co liczyłeś. To powoduje jedynie przypisanie wskaźnikowi x_roty adresu w pamieci gdzie masz tablicę X (i przy okazji masz wyciek pamięci bo nie jesteś w stanie zwolnic pamięci którą alokowałeś pod wskaźnik x_roty).
Zrób tam zwykłą pętlę jak porządny człowiek...

for(int i=0;i<36;i++)
  x_roty[i] = X[i];
0

działa tak jak powinno, jednak pojawił mi się nowy problem, ponieważ muszę zniszczyć teraz te tablice dynamiczne.

mam więc trzy tablice dynamiczne x_roty, x_rotz, x_rotx, jednak nie zawsze wszystkie są zainicjowane, więc odgórnie nie jest możliwe ich usunięcie. Czy można jakoś sprawdzić czy dany pointer jest używany?

0

najbardziej naiwne, ale działające:
tworząc pointer zawsze nadajesz mu wartość początkową NULL
zwalniając pamieć z pointera zawsze nadajesz mu wartość NULL

W ten sposób jeśli pointer != NULL to znaczy ze mozesz zwalniać.

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