Przekroczony rozmiar tablicy

0

Witam. Programuję w VS 2015. Pojawia się wyjątek, że został przekroczony rozmiar którejś z tablicy (ale nie mogę znaleźć, w którym miejscu). Mógłby ktoś podpowiedzieć, jak włączyć przejście w kodzie do tej linii, która wywołała nieobsługiwany wyjątek?

0

Debugger.

0

Przecież w trybie debug VS samo Ci zasugeruje, żeby debugować i wypluje Ci m.i. callstack

0

O ile dobrze pamiętam, Visual Studio (o ile uruchomiony został dany program w trybie debugowania), sam zatrzymuje się i wskazuje na odpowiednią linię.
Możesz spróbować nacisnąć dodatkowo Break, to powinno zatrzymać aplikację oraz pozostawić środowisko z zaznaczoną linią błędu.

0

Właśnie problem w tym, że wypluwa wyjątek, daję "break", ale nigdzie nie jest podkreślony najmniejszy fragment błędnego kodu. Wie ktoś może, jak to przywrócić w debugerze?

1

Na pewno nie wywołujesz wyjątku gdzieś w wewnętrznym kodzie CLR/kernela?
Wtedy ciężko o rzeczowy podgląd :-P

0

Możliwe. Jak chcę wejść na linię, w której został wywołany wyjątek, Visual proponuje pobranie jakiegoś rozszerzenia, które i tak się nie chce pobrać (lekko świruje), przy czym nie pokazuje nic poza tym. Podejrzewam, że problem jest dosyć prosty. Poniżej zamieszczam kawałek kodu i log erroru.

Metoda alokująca pamięć dla obiektu klasy:

void Function::Allocate()
{
	// alokacja pamięci dla obiektów elementów skończonych
	locMat = new locMatrix[sk];
	
	// H tworzenie macierzy 2x2 dla każdego z obiektów el. s.
	for (int i = 0; i < sk; ++i) // przydział pamięci do obiektów
	{
		locMat[i].H = new float *[2];
		for (int i = 0; i < 2; ++i)
			locMat[i].H[i] = new float[2]; // H[i] !
	}
			
	//P
	for (int i = 0; i < sk; ++i) // przydział pamięci do obiektów
		locMat[i].P = new float[2];

	// alokacja pamięci dla globalnej macierzy złożonej z macierzy lokalnych elementów skończonych
		glArray = new float *[w];
		for (int i = 0; i < w; ++i)
			glArray[i] = new float[w];

	temperatures = new float[w];
	x = new float[w];

}

Klasa:

class locMatrix
{
public:
	float** H;
	float* P;
	float xi; // odległość dla węzła pierwszego
	float xj; // odległość dla węzła drugiego
	float L; // długość elementu skończonego
};

class Function
{
public:
	// dane
	float k; // współczynnik przewodzenia ciepła
	float S; // pole przekroju pręta
	float Lglob; //długość pręta
	
	int sk; // liczba elementów skończonych;
	int w; // liczba węzłów

	float alfa; // współczynnik konwekcyjnej wymiany ciepła
	float q; //strumień ciepła doprowadzany do pręta
	float tOtoczenia; // temperatura otoczenia
	locMatrix* locMat; // obiekt elementu skończonego
	float** glArray; // globalna macierz
	float* x; // tablica węzłów odległości

	// szukane
	float* temperatures;

Informacja w konsoli:

Edit and Continue : warning  : Variable or function 'Function::Allocate' was removed. Undeleted and undetected references could still exist. (c:\users\marcin\documents\visual studio 2015\projects\messpr1\mes1\x64\debug\function.new.obj.enc)
Edit and Continue : warning  : The edit to remove function 'public: void __cdecl Function::Allocate(void) __ptr64' cannot be executed until the current call completes. The original (stale) instance will continue to execute until it completes.
Edit and Continue : Successfully applied code changes.

@Edit

Nie było przypisanej wartości do "sk". Liczba ta jest o jeden mniejsza od "w". Aktualnie debuger podkreśla linijkę:
locMat[i].H[i] = new float[2]; // H[i] !

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