Autor Beitrag
kat1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 40

Win XP
D6 EntPr
BeitragVerfasst: Mi 02.07.03 13:56 
Hallo,

also ich habe hier ein kleines Problem. Ich schreibe gerade an einer Erweiterung eines Programms, dass ursprünglich in Turbo Pascal geschrieben wurde und auch auf einem viel älteren System. Da ich das ganze als Windows-Anwendung haben möchte, bin ich auf Delphi umgestiegen und da das alte Programm lediglich Berechnungsfunktionen und Prozeduren enthält, sollte das ja auch möglich sein.

Habe jetzt aber folgendes Problem. In der Unit sind folgende Klassen Konstanten und Variablen für die ganze Unit definiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
const
  //Integer bessel function terms:
  BfhMaxTerms = 200;
  //highest order of an,bn required
  nmax=50;

type
  ArrEx = array [0..nmax+200of extended;
  Yvec=array [0..nmax+100of extended;
  Yvecptr=^Yvec;
  ArrPtr=^ArrEx;

var
  n1A_r,n1B_r,n1B_i,n3A_r,n3A_i:Yvecptr;
  BfhMaxOrder, BfhMinOrder:integer;
  JaA,JfA,PsiA,chiA:ArrPtr;


Diese Pointervariablen werden ja mit New() alloziert und mit Dispose() wieder frei gegeben. Nur irgendwie scheint es da ein Problem zu geben. Jedesmal, wenn ich das Prog ausführen wollte, bekam ich eine Zugriffsverletzung. Habe dann nur den Ort oder die Reihenfolge, in der New() und Dispose() auftauchen, geändert und dann lief es wieder. Jetzt bekomme ich die Fehlermeldung aber jedes mal wieder, wenn ich mein Prog weiterhin ändere. Wieder irgendwas umstellen und dann geht es wieder. Das ist doch nicht normal. Hat jemand schon mal ähnliche Probs gehabt oder sonst irgendwie eine Idee?

Vielen Dank in voraus

_________________
Mfg Uwe
Es ist eine Unsitte der Menschen, sich an alles zu gewöhnen.
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 02.07.03 14:21 
Hallo,

wichtig zu wissen, währe wo du NEW und DISPOSE aufrufst.
Wahrscheinlich hast du daführ ereignisse gewählt, die in beliebiger Reihenfolge aufgerufen werden können. Oder Stahen die in der selben Procedure?

Ein bisschen Code währe warscheinlich auch hilfreich.


Gruß
Klabautermann
kat1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 40

Win XP
D6 EntPr
BeitragVerfasst: Mi 02.07.03 14:29 
Hmm, ja klar war etwas ungeschickt von mir. nach einigem Testen bin ich jetzt darauf gestoßen, dass die Probs eigentlich alle in dieser Prozedur auftreten:

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:
procedure Miecalc; 
var
  betar,betai : extended;
  i,j,k:integer;
begin
  SetLength(MieParameter,Nl,4,50);
  new(JaA);new(JfA);new(PsiA);
  new(chiA);
  {new(n1A_r)};//new(n1B_r);new(n1B_i);
  new(n3A_r);new(n3A_i);
  for i:=0 to Nl-1 do
    begin
      new(n1A_r);new(n1B_r);new(n1B_i);
      //new(n3A_r);new(n3A_i);
      {order of Bessel Functions must be higher than alpha}
      BfhMaxOrder:=trunc(WiscombeNumber[i])+100;
      BfhMinOrder:=trunc(WiscombeNumber[i])+50;
      BesselFractional (x[i],BfhMaxOrder,BfhMaxTerms,JaA,JfA);
      RicattiBesselCalculation(x[i]);
      betar:= RelRefrIndex[i,0]*x[i];
      betai:= RelRefrIndex[i,1]*x[i];
      calcn1A(x[i]);
      calcn1B(betar,betai);
      calcn3A(x[i]);
      for j:=0 to 3 do
        begin
          for k:=0 to 49 do
            MieParameter[i,j,k]:=0;
        end;
      for j:=1 to WiscombeNumber[i] do
        begin
          calc_anbn (j, RelRefrIndex[i,0], RelRefrIndex[i,1],MieParameter[i,0,j],MieParameter[i,1,j],
          MieParameter[i,2,j],MieParameter[i,3,j]);
        end;
      dispose(n1A_r);//dispose(n1B_r);dispose(n1B_i);
      //dispose(n3A_r);dispose(n3A_i);
    end;
  dispose(JaA);dispose(JfA);
  dispose(chiA);
  dispose(n3A_r);dispose(n3A_i);
  {dispose(n1A_r);}dispose(n1B_r);dispose(n1B_i);
end;


die auskommentierten Zeilen mit New() und Dispose() rühren noch von meinem Probieren her, d.h. mal lief es mit der einen Version, mal mit der anderen.

Ich hoffe, das hilft ein wenig weiter bei der Schilderung meines Problems.

_________________
Mfg Uwe
Es ist eine Unsitte der Menschen, sich an alles zu gewöhnen.