Kezdőoldal » Számítástechnika » Programozás » Mi a hiba ebben a Visual C++...

Amanda88 kérdése:

Mi a hiba ebben a Visual C++ programban?

Figyelt kérdés

Ez egy gauss elimináló program. Láttok benne valami feltűnő hibát? Nem kérem senkitől, hogy betűről betűre nézze át, csak ha valami nagyon szembetűnő hibát lát benne valaki, írja meg.

Az A és B mátrixoknak szeretném megváltoztatni az értékét a függvényekben és ezután az új értéket használni a main-ben. Van egy olyan érzésem, hogy ez a rész hibás.


A program futtatáskor bekéri az egyenletrendszer paramétereit, de ezután leáll, ezt írja ki:


Unhandled exception at 0x00411c69 in HF8.exe: 0xC0000005: Access violation reading location 0x33332ffb.

Break / Continue


A változók értékei leálláskor:


A 0x33333333

A[J-R] 0x33332feb

J 2

R 37

szorzo 2.6400768193378616e-308


A program:


#include <iostream>

using namespace std;

#include <iomanip>

#include <math.h>


void Megoldasszamolo (int valtozok, double (&A)[3][3], double (&B)[3]);

void Egyrehozo (int index, int valtozok, double (&A)[3][3], double (&B)[3]);

void Kinullazo (int index, int valtozok, double (&A)[3][3], double (&B)[3]);


int main ()

{

int index=0, i, valtozok, l, R, z;

double A[3][3], B[3];


cout<<"Rendezze az egyenleteket ilyen alakra: 2x+3y = 20"<<endl<<endl;

cout<<"Hany valtozos egyenletet szeretne megoldani?"<<endl<<endl;cin>>valtozok;


for (i=1; i<=valtozok; i++)

{

for (l=1; l<=valtozok; l++)

{

cout<<endl<<"Az "<<i<<". egyenletben a(z) "<<l<<". valtozo ennyivel van beszorozva: "<<endl<<endl; cin>>A[i-1][l-1];

cin.get();

}


}

for (i=1; i<=valtozok; i++)

{

cout<<endl<<"Az "<<i<<". egyenletben az egyenlet jobb oldalan levo szam: "<<endl<<endl; cin>>B[i-1];

cin.get();

}

cout<<endl<<endl;


for (i=0; i<valtozok; i++)

{

for (l=0; l<valtozok; l++)

cout<<setw(9)<<A[i][l];


cout<<endl<<endl;

}


for (z=0; z<valtozok; z++)

{

cout<<setw(9)<<B[z];

}


for (R=1; R<=valtozok; R++)

{

Egyrehozo(index, valtozok, A, B);

Kinullazo(index, valtozok, A, B);

}


Megoldasszamolo(valtozok, A, B);


for (i=0; i<valtozok; i++)

cout<<"A valtozok ertekei: "<<B[i]<<endl<<endl;


return 0;

}



void Megoldasszamolo (int valtozok, double (&A)[3][3], double (&B)[3])

{

int J, K, R;

double szorzo;


for (J=valtozok; J<=2; J--)

{

for (R=1; R>=J-1; R++)

{

szorzo= A[J-R][J];

for (K=valtozok; K<=1; K--)

A[J-R][K]= A[J-R][K]- A[J][K]* szorzo;


B[J-R]= B[J-R]-B[J]* szorzo;

}

}

}



void Kinullazo (int index, int valtozok, double (&A)[3][3], double (&B)[3])

{

int i, K, R;

double vezersor[3];

for (i=0; i>=valtozok; i++)

vezersor[i]= A[index][i];


for (R=index+1; R>=valtozok; R++)

{

if (vezersor[index] !=0)

for (K=1; K>=valtozok; K++)

{

if (K==1)

{

if (A[R][R]==0 || A[R][index]==0)

break;

}

A[R][K]= A[R][K]- vezersor[K];


if (K== valtozok)

B[R]=B[R]-B[index];

}

}

}


void Egyrehozo (int index, int valtozok, double (&A)[3][3], double (&B)[3])

{

int K, i, R;

double oszto, tmp[3], tmp2;


for (K=index; K>=valtozok; K++)

if (A[K][index] !=0)

{

oszto= A[K][index];


if (oszto !=1)

{

for (R=index; R>=valtozok; R++)

A[K][R]= A[K][R]/ oszto;


B[K]= B[K]=oszto;

}

}

else

for (R=K+1; R>=valtozok; R++)

{

if (A[R][index]>0)

{

for (i=0; i>=valtozok; i++)

{

tmp[i]= A[K][i];

A[K][i]= A[R][i];

A[R][i]= tmp[i];

}


tmp2= B[K];

B[K]= B[R];

B[R]= tmp2;


oszto= A[K][index];


if (oszto !=1)

{

for (R=index; R>=valtozok; R++)

A[K][R]= A[K][R]/oszto;

B[K]= B[K]/oszto;

break;

}

}

}

}



2013. júl. 30. 00:59
 1/5 _Jessy_ ***** válasza:
A hibaüzenet alapján valahol elindexelted a mátrixo(ka)t. Debug-oljad, aztán meglesz.
2013. júl. 30. 08:05
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:

"Access violation", ergo vagy #GPF -et, vagy #PF -et szór a programod - valószínűleg egy pointerrel lesz gond; invalid/inicializálatlan, ami miatt olyan memóriaterületet próbál meg a prog olvasni, ami nincs lefoglalva (pl. a page present bitje 0), vagy alapvetően nem elérhető (pl. 0x7FFFFFFF feletti címek - ezek a kernelhez tartoznak, nem elérhetők; itt a cím ezalatt van).


Cirka 100% az esélye, hogy kinyúlsz a tömbből.


A kódot, ha nem haragszol meg nagyon, nem szeretném átnyálazni, mert nem túl olvasható és a GYK is elgyűri az indentációt. Ellenőrizd az össze array accesst, illetve, hogy a pointere(i)d mikor hova mutat(nak)...

2013. júl. 30. 11:19
Hasznos számodra ez a válasz?
 3/5 _Jessy_ ***** válasza:
Én már belenéztem kicsit. Első, ami szemet szúrt, hogy egy 3x3-as mátrixban kellene nxn elemet tárolni n változós, n egyenletes egyenletredszer esetében. Ez nem túl szerencsés dolog.
2013. júl. 30. 11:39
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:

Végiggörgetve a kódodat ez tűnt fel elsőre:

for (J=valtozok; J<=2; J--)

Azaz, ha J kezdetben 2 felett van, le sem fut, ellenkező esetben pedig addig, amíg túl nem csordul - meg is van az (egyik?) túlindexelésed.

2013. júl. 30. 16:56
Hasznos számodra ez a válasz?
 5/5 anonim ***** válasza:
#4: "for (i=0; i>=valtozok; i++)" - és itt lesz akkor a második, de ahogy elnéztem, gyakorlatilag az össze for esetén fordítva írta a feltételt.
2013. júl. 31. 09:16
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!