| Autor |
Beitrag |
goog
      
Beiträge: 37
|
Verfasst: Sa 05.03.05 19:44
Hi Leute!
Woran könnte es liegen das die Message access violation at 0x8a... kommt
gruß goog
|
|
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 05.03.05 19:53
hast du auch einen entsprechenden code dafür?
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: So 06.03.05 10:30
poste mal deinen code, dann kann man dir auch helfen !
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
goog 
      
Beiträge: 37
|
Verfasst: So 06.03.05 11:16
Code: access violation at 0x8a: read of address 0x8a 20 11 4D 00 28 11 4D 00 00 00 00 00
gruß goog
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 06.03.05 11:20
Wir meinten den Quelltext, durch den der Fehler verursacht wurde
AXMD
|
|
goog 
      
Beiträge: 37
|
Verfasst: So 06.03.05 11:36
Na ja das Problem ist ich weiß nicht wo der Fehler entstanden ist und den ganzen Quelltext zu posten dürfte ziemlich fett werden.
Es geht um ganzrationale Funktionen. Wenn ich als höchsten Grad n=1 eingebe, dann will er keine Nullstellen berechnen.
a ist ein array von 0 bis 100.
n ist ein globaler Integer.
g1,g2,nullstelle sind arrays von 1 bis 100.
Aber hier mal ein Teil:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86:
| n:=StrtoInt(Inputbox('Grad der Funktion','Höchsten Grad der Funktion eingeben (z.B: bei x³->3)','1')); a[0]:=StrtoFloat(Inputbox('Absolutes Glied','Das absolute Glied eingeben','1')); for i:=1 to n do begin a[i]:=StrtoFloat(Inputbox('Eingabe der Koeffizienten','Koeffizient von a'+InttoStr(i),'1')); end;
function potenz (basis : real; exponent : integer) : real; var ergebnis : real ; begin if exponent = 1 then result:=basis else begin if exponent = 0 then result:=1 else begin if exponent mod 2 = 0 then begin ergebnis:=potenz(basis, exponent div 2); result:=ergebnis*ergebnis; end else result:=potenz(basis, exponent-1)*basis; end; end; end;
function f(x : real) : real; var i: integer; begin result:=0; for i:=0 to n do result:=result+a[i]*potenz(x,i); end;
procedure grenzen_finden_null(schrittweite: real; var i:integer);var z:real; begin i:=0; z:=-1000; while z<=1000 do begin if f(z+schrittweite)*f(z)<0 then begin inc(i); gn1[i]:=z; gn2[i]:=z+schrittweite; end else if f(z)=0 then begin inc(i); gn1[i]:=z-schrittweite; gn2[i]:=z+schrittweite; end; z:=z+schrittweite; end; end;
procedure nullstellen_berechnen (Nachkommastellen:real; an:integer);var m :real; j :integer; stop :boolean; begin j:=1; While j<=an do begin stop:=false; m:=(gn1[j]+gn2[j])/2;
while not stop do begin if abs(f(m))<=nachkommastellen then begin stop:=true; end else begin if f(gn1[j])*f(m)>0 then gn1[j]:=m else gn2[j]:=m; m:=(gn1[j]+gn2[j])/2; end; end; nullstelle[j]:=m; inc(j); end; end; |
gruß goog
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 06.03.05 11:42
Wie ist das Array a definiert?
AXMD
|
|
goog 
      
Beiträge: 37
|
Verfasst: So 06.03.05 11:51
a ist ein array of real
gruß goog
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 06.03.05 11:53
| goog hat folgendes geschrieben: | a ist ein array of real
gruß goog |
Wenn's ein dynamisches Array ist, hab ich deinen Fehler: Zeile 29: es muss n - 1 heißen. Aber mehr Code und ein paar Erläuterungen dazu wären halt nicht schlecht
AXMD
|
|
goog 
      
Beiträge: 37
|
Verfasst: So 06.03.05 12:09
hi
AXMD hat folgendes geschrieben:
| Zitat: | Wenn's ein dynamisches Array ist, hab ich deinen Fehler: Zeile 29: es muss n - 1 heißen. Aber mehr Code und ein paar Erläuterungen dazu wären halt nicht schlecht
AXMD |
das wars leider nicht
hier ist noch was vom Quelltext:
also das hab ich in eine extra Unit gepackt weil ich da von mehrern Units drauf zugreifen muss
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| unit Unit3;
interface
function potenz (basis : real; exponent : integer) : real; function f(x : real) : real;
var a : array[0..100] of real; n : integer; nullstelle : array[1..100] of real; gn1,gn2 : array[1..100] of real;
implementation
function potenz (basis : real; exponent : integer) : real; var ergebnis : real ; begin if exponent = 1 then result:=basis else begin if exponent = 0 then result:=1 else begin if exponent mod 2 = 0 then begin ergebnis:=potenz(basis, exponent div 2); result:=ergebnis*ergebnis; end else result:=potenz(basis, exponent-1)*basis; end; end; end;
function f(x : real) : real; var i: integer; begin result:=0; for i:=0 to n do result:=result+a[i]*potenz(x,i); end; |
so und das ist in Unit1:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78:
| procedure grenzen_finden_null(schrittweite: real; var i:integer); var z:real; begin i:=0; z:=-1000; while z<=1000 do begin if f(z+schrittweite)*f(z)<0 then begin inc(i); gn1[i]:=z; gn2[i]:=z+schrittweite; end else if f(z)=0 then begin inc(i); gn1[i]:=z-schrittweite; gn2[i]:=z+schrittweite; end; z:=z+schrittweite; end; end;
procedure nullstellen_berechnen (Nachkommastellen:real; an:integer); var m :real; j :integer; stop :boolean; begin j:=1; While j<=an do begin stop:=false; m:=(gn1[j]+gn2[j])/2;
while not stop do begin if abs(f(m))<=nachkommastellen then begin stop:=true; end else begin if f(gn1[j])*f(m)>0 then gn1[j]:=m else gn2[j]:=m; m:=(gn1[j]+gn2[j])/2; end; end; nullstelle[j]:=m; inc(j); end; end;
procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin
n:=StrtoInt(Inputbox('Grad der Funktion','Höchsten Grad der Funktion eingeben (z.B: bei x³->3)','1')); a[0]:=StrtoFloat(Inputbox('Absolutes Glied','Das absolute Glied eingeben','1')); for i:=1 to n do begin a[i]:=StrtoFloat(Inputbox('Eingabe der Koeffizienten','Koeffizient von a'+InttoStr(i),'1')); end; end;
procedure TForm1.Button1Click(Sender: TObject); var i,ann : integer; begin
grenzen_finden_null(0.25,ann); nullstellen_berechnen(0.001,ann);
for i:=1 to ann do begin memo1.lines.add(InttoStr(i)+'. '+'('+FloattoStr((round(nullstelle[i]*1000)/1000))+'|0)'); end; |
vielleicht findest du noch was
gruß goog
|
|
EUOCheffe
      
Beiträge: 124
|
Verfasst: So 06.03.05 13:26
Dieser Code hier gibt bei mir keinen Fehler. Es gibt einfach keine Ausgabe, weil "ann" immer Null ist. Am Code selber habe ich nichts geändert. Vielleicht liegt das Problem ja an einer anderen Stelle und der untenstehende Code hilft dir bereits weiter, um den Zugriffsfehler zu isolieren?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139:
| unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); end;
var Form1: TForm1;
implementation {$R *.dfm}
var a : array[0..100] of real; n : integer; nullstelle : array[1..100] of real; gn1,gn2 : array[1..100] of real;
function potenz (basis : real; exponent : integer) : real; var ergebnis : real ; begin if exponent = 1 then result:=basis else begin if exponent = 0 then result:=1 else begin if exponent mod 2 = 0 then begin ergebnis:=potenz(basis, exponent div 2); result:=ergebnis*ergebnis; end else result:=potenz(basis, exponent-1)*basis; end; end; end;
function f(x : real) : real; var i: integer; begin result:=0; for i:=0 to n do result:=result+a[i]*potenz(x,i); end;
procedure grenzen_finden_null(schrittweite: real; var i:integer); var z:real; begin i:=0; z:=-1000; while z<=1000 do begin if f(z+schrittweite)*f(z)<0 then begin inc(i); gn1[i]:=z; gn2[i]:=z+schrittweite; end else if f(z)=0 then begin inc(i); gn1[i]:=z-schrittweite; gn2[i]:=z+schrittweite; end; z:=z+schrittweite; end; end;
procedure nullstellen_berechnen (Nachkommastellen:real; an:integer); var m :real; j :integer; stop :boolean; begin j:=1; while j<=an do begin stop:=false; m:=(gn1[j]+gn2[j])/2;
while not stop do begin if abs(f(m))<=nachkommastellen then begin stop:=true; end else begin if f(gn1[j])*f(m)>0 then gn1[j]:=m else gn2[j]:=m; m:=(gn1[j]+gn2[j])/2; end; end; nullstelle[j]:=m; inc(j); end; end;
procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin n:=StrtoInt(Inputbox('Grad der Funktion','Höchsten Grad der Funktion eingeben (z.B: bei x³->3)','1')); a[0]:=StrtoFloat(Inputbox('Absolutes Glied','Das absolute Glied eingeben','1')); for i:=1 to n do begin a[i]:=StrtoFloat(Inputbox('Eingabe der Koeffizienten','Koeffizient von a'+InttoStr(i),'1')); end; end;
procedure TForm1.Button1Click(Sender: TObject); var i,ann : integer; begin grenzen_finden_null(0.25,ann); nullstellen_berechnen(0.001,ann);
ShowMessage(IntToStr(ann));
for i:=1 to ann do begin memo1.lines.add(InttoStr(i)+'. '+'('+FloattoStr((round(nullstelle[i]*1000)/1000))+'|0)'); end; end;
end. |
|
|
goog 
      
Beiträge: 37
|
Verfasst: So 06.03.05 13:51
jap jetzt funzt es
danke
gruß goog
|
|
|