Autor Beitrag
goog
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37



BeitragVerfasst: 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



BeitragVerfasst: Sa 05.03.05 19:53 
hast du auch einen entsprechenden code dafür?
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: So 06.03.05 11:20 
Wir meinten den Quelltext, durch den der Fehler verursacht wurde :roll:

AXMD
goog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37



BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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;  //Potenz wird untersucht
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;     //Funktionswerte
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);//Grenzen werden gesucht
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);//Nullst.werden best.
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       //Genauigkeit
       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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: So 06.03.05 11:42 
Wie ist das Array a definiert?

AXMD
goog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37



BeitragVerfasst: So 06.03.05 11:51 
a ist ein array of real

gruß goog
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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 :roll:

AXMD
goog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37



BeitragVerfasst: 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

ausblenden volle Höhe Delphi-Quelltext
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:

ausblenden volle Höhe Delphi-Quelltext
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);     //Nullstellen berechnen
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)');     //Nullstellen angeben
 end;


vielleicht findest du noch was :)

gruß goog
EUOCheffe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: 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?

ausblenden volle Höhe Delphi-Quelltext
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);     //Nullstellen berechnen
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)');     //Nullstellen angeben
  end;
end;

////////////////////////////////////////////////////////////////////////////////
end.
goog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37



BeitragVerfasst: So 06.03.05 13:51 
jap jetzt funzt es :D :dance2:

danke
gruß goog