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?
Przekroczony rozmiar tablicy
- Rejestracja: dni
- Ostatnio: dni
- Postów: 124
- Rejestracja: dni
- Ostatnio: dni
Debugger.
- Rejestracja: dni
- Ostatnio: dni
Przecież w trybie debug VS samo Ci zasugeruje, żeby debugować i wypluje Ci m.i. callstack
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 13042
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 124
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?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 13042
Na pewno nie wywołujesz wyjątku gdzieś w wewnętrznym kodzie CLR/kernela?
Wtedy ciężko o rzeczowy podgląd :-P
- Rejestracja: dni
- Ostatnio: dni
- Postów: 124
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.
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] !