Mi a hiba ebben a Visual C++ programban?
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;
}
}
}
}
"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)...
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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!