Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - große Zahlen in zweidimensionalen Array speichern


jsbach - Di 09.11.10 23:28
Titel: große Zahlen in zweidimensionalen Array speichern
Hallo,
ich hätte da eine Anfängerfrage. Ich möchte große Zahlen (Extended) in einem zweidimensionalen Array speichern. Dephi verlangt jedoch Integer Zahlen. Geht das überhaupt?

Gruß, Mike


Narses - Di 09.11.10 23:33

Moin!

Warum nicht. Zeig mal deinen Code. ;)

cu
Narses


jsbach - Di 09.11.10 23:46

Hallo das ging ja schnell,
ich habe versucht den array und die anderen Variablen als extended zu deklarieren und bekam die Fehlermeldung in Zeile 39: Inkompatible Typen: 'Integer' und 'Extended'



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:
var
  Form1: TForm1;

  k,p,q,n,j,l,a: variant;
  u,r,i,y,Gg,Sg,Tg: integer;

  M: array[0..5000..500of integer;

  Tupel: TStringList;


implementation

{$R *.DFM}




procedure TForm1.Button1Click(Sender: TObject);
begin

  Tupel:=TStringList.Create;

//Tupel        Segmente     Gruppen
  M[1,0]:=1;   M[1,1]:=1;   M[1,2]:=1;
  M[2,0]:=1;   M[2,1]:=1;   M[2,2]:=1;
  M[3,0]:=2;   M[3,1]:=1;   M[3,2]:=1;
  M[4,0]:=3;   M[4,1]:=1;   M[4,2]:=1;
  M[5,0]:=7;   M[5,1]:=2;   M[5,2]:=1;
  M[6,0]:=12;  M[6,1]:=3;   M[6,2]:=1;

  u:=7;


  repeat

    i:=0; j:=0; k:=0; p:=0; a:=0;

    if u>17 then a:=M[u-17,0];

    repeat

      if i>3 then j:=j+1;
      if i>6 then k:=k+1;

      if i>8 then begin
                    l:=1; p:=0;
                    repeat
                      q:=l*(l+1)/2;
                      r:=i-3-l;
                      p:=p+q*(M[u-5,r]-a*M[12,r]);
                      l:=l+1;
                    until l=i-7;
                  end;


      M[u,4+i]:= M[u-5,0]-a*M[12,0]-i*(M[u-5,1]-a*M[12,1])+j*(j+1)/2*(M[u-5,2]-a*M[12,2])-k*k*(M[u-5,4]-a*M[12,4])-p;


      i:=i+1;

    until i=u-6;

    M[u,3]:=M[u,4];

 
    // gesamte Anzahl an Gruppen, Segmenten, Tupeln
    Gg:=0; Tg:=0; Sg:=0; y:=2;
    repeat
      y:=y+1;
      n:=y*(y+5)/2;
      Gg:=Gg+M[u,y];
      Sg:=Sg+y*M[u,y];
      Tg:=Tg+n*M[u,y];
    until y=u-3;           

    M[u,0]:=Tg; M[u,1]:=Sg; M[u,2]:=Gg;


    Tupel.Add(Format('%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d',
      [  M[u,3], M[u,4], M[u,5], M[u,6], M[u,7], M[u,8], M[u,9], M[u,10],
         M[u,11], M[u,12], M[u,13], M[u,14], M[u,15], M[u,16], M[u,17], M[u,18], M[u,19], M[u,20],
         M[u,21], M[u,22], M[u,23], M[u,24], M[u,25], M[u,26], M[u,27], M[u,28], M[u,29], M[u,30],
         M[u,31] ]));

    Tupel.Add(Format('%d %d %d %d', [ u, Tg, Sg, Gg ]));

    Tupel.SaveToFile('F:\Algorithmus.txt');


    u:=u+1;

  until u>30;
end;


bummi - Mi 10.11.10 01:25


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:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

var
  k,p,q,n,j,l,a: Variant;
  u,r,i,y:Integer;
  Gg,Sg,Tg: Extended;

  M: array[0..5000..500of Extended;

  Tupel: TStringList;
{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin

  Tupel:=TStringList.Create;

//Tupel        Segmente     Gruppen
  M[1,0]:=1;   M[1,1]:=1;   M[1,2]:=1;
  M[2,0]:=1;   M[2,1]:=1;   M[2,2]:=1;
  M[3,0]:=2;   M[3,1]:=1;   M[3,2]:=1;
  M[4,0]:=3;   M[4,1]:=1;   M[4,2]:=1;
  M[5,0]:=7;   M[5,1]:=2;   M[5,2]:=1;
  M[6,0]:=12;  M[6,1]:=3;   M[6,2]:=1;

  u:=7;


  repeat

    i:=0; j:=0; k:=0; p:=0; a:=0;

    if u>17 then a:=M[u-17,0];

    repeat

      if i>3 then j:=j+1;
      if i>6 then k:=k+1;

      if i>8 then begin
                    l:=1; p:=0;
                    repeat
                      q:=l*(l+1)/2;
                      r:=i-3-l;
                      p:=p+q*(M[u-5,r]-a*M[12,r]);
                      l:=l+1;
                    until l=i-7;
                  end;


      M[u,4+i]:= M[u-5,0]-a*M[12,0]-i*(M[u-5,1]-a*M[12,1])+j*(j+1)/2*(M[u-5,2]-a*M[12,2])-k*k*(M[u-5,4]-a*M[12,4])-p;


      i:=i+1;

    until i=u-6;

    M[u,3]:=M[u,4];


    // gesamte Anzahl an Gruppen, Segmenten, Tupeln
    Gg:=0; Tg:=0; Sg:=0; y:=2;
    repeat
      y:=y+1;
      n:=y*(y+5)/2;
      Gg:=Gg+M[u,y];
      Sg:=Sg+y*M[u,y];
      Tg:=Tg+n*M[u,y];
    until y=u-3;

    M[u,0]:=Tg; M[u,1]:=Sg; M[u,2]:=Gg;


    Tupel.Add(Format('%.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f',
      [  M[u,3], M[u,4], M[u,5], M[u,6], M[u,7], M[u,8], M[u,9], M[u,10],
         M[u,11], M[u,12], M[u,13], M[u,14], M[u,15], M[u,16], M[u,17], M[u,18], M[u,19], M[u,20],
         M[u,21], M[u,22], M[u,23], M[u,24], M[u,25], M[u,26], M[u,27], M[u,28], M[u,29], M[u,30],
         M[u,31] ]));

    Tupel.Add(Format('%d %.0f %.0f %.0f', [u, Extended(Tg), Extended(Sg), Extended(Gg) ]));




    u:=u+1;

  until u>30;
    Tupel.SaveToFile('c:\temp\Algorithmus.txt');
end;
end.
}


jsbach - Mi 10.11.10 02:33

super, danke!
da wäre ich ja nie drauf gekommen.

gruß, mike


jsbach - Mo 21.03.11 00:38

Hallo, ich stehe gerade wieder vor demselben Problem wie im Oktober. Ich habe meinen Algorithmus neu programmiert, doch
in Zeile 36 gbit es eine ungültige Gleitkommadivision. Ich weiß nicht warum? Ist der array als integer deklariert funktioniert es (/ durch div ersetzt), aber die Zahlen werden dann zu groß.


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:
var
  Form1: TForm1;
  u,k,i: integer;
  Liste: TStringList;
  g: array[1..301..30of extended;


implementation
{$R *.dfm}

// 20.03.2011
procedure TForm1.Button1Click(Sender: TObject);
begin

  Liste:=TStringList.Create;

  // u = 6..10 zur Ininitialisierung des Algorithmus
  g[1,6]:=1;  g[2,6]:=1;  g[3,6]:=3;  g[4,6]:=12;
  g[1,7]:=1;  g[2,7]:=1;  g[3,7]:=2;  g[4,7]:=7;  g[5,7]:=30;
  g[1,8]:=1;  g[2,8]:=2;  g[3,8]:=2;  g[4,8]:=5;  g[5,8]:=19; g[6,8]:=85;
  g[1,9]:=1;  g[2,9]:=2;  g[3,9]:=3;  g[4,9]:=3;  g[5,9]:=9;  g[6,9]:=37;  g[7,9]:=173;
  g[1,10]:=1; g[2,10]:=3; g[3,10]:=5; g[4,10]:=7; g[5,10]:=7; g[6,10]:=23; g[7,10]:=99; g[8,10]:=476;




  u:=11;
  repeat
                  g[u-5,u]   :=  g[u-7,u-5];
                  g[u-6,u]   :=  g[u-5,u];

    k:=6;  repeat g[u-k-1,u] :=  g[u-k,u] -g[u-8,u-5]; k:=k+1until k>8;

    k:=8;  repeat g[u-k-2,u] := -g[u-k,u] +2*g[u-k-1,u] +g[u-9,u-5]; k:=k+1until k>10;

    k:=10repeat g[u-k-3,u] :=  g[u-k,u] -3*g[u-k-1,u] +3*g[u-k-2,u] -g[u-k,u-5]; k:=k+1until k>13;


    i:=1; g[u-4,u]:=0; g[u-3,u]:=0; g[u-2,u]:=0;
    repeat
      g[u-4,u]:=g[u-4,u]+g[i,u];
      g[u-3,u]:=g[u-3,u]+g[i,u]*(u-i-2);
      g[u-2,u]:=g[u-2,u]+g[i,u]*(u-i-2)*(u-i+3)/2;
      i:=i+1;
    until i>u-5;


    u:=u+1;
  until u>17;




  u:=18;
  repeat
                  g[u-5,u]   :=  g[u-7,u-5] -g[u-17,u-12]*g[10,12];
                  g[u-6,u]   :=  g[u-5,u];

    k:=6;  repeat g[u-k-1,u] :=  g[u-k,u] -g[u-8,u-5] +g[u-17,u-12]*g[9,12]; k:=k+1until k>8;

    k:=8;  repeat g[u-k-2,u] := -g[u-k,u] +2*g[u-k-1,u] +g[u-9,u-5] -g[u-17,u-12]*g[8,12]; k:=k+1until k>10;

    k:=10repeat g[u-k-3,u] :=  g[u-k,u] -3*g[u-k-1,u] +3*g[u-k-2,u] -g[u-k,u-5] +g[u-17,u-12]*g[17-k,12]; k:=k+1until k>25;


    i:=1; g[u-4,u]:=0; g[u-3,u]:=0; g[u-2,u]:=0;
    repeat
      g[u-4,u]:=g[u-4,u]+g[i,u];
      g[u-3,u]:=g[u-3,u]+g[i,u]*(u-i-2);
      g[u-2,u]:=g[u-2,u]+g[i,u]*(u-i-2)*(u-i+3)/2;
      i:=i+1;
    until i>u-5;


    u:=u+1;
  until u>29;




  u:=11;
  repeat
    Liste.Add(Format('%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d',
    [u, (g[1,u]),  (g[2,u]),  (g[3,u]),  (g[4,u]),  (g[5,u]),  (g[6,u]),  (g[7,u]),  (g[8,u]),  (g[9,u]),  (g[10,u]),
        (g[11,u]), (g[12,u]), (g[13,u]), (g[14,u]), (g[15,u]), (g[16,u]), (g[17,u]), (g[18,u]), (g[19,u]), (g[20,u]),
        (g[21,u]), (g[22,u]), (g[23,u]), (g[24,u]), (g[25,u]), (g[26,u]), (g[27,u]), (g[28,u]), (g[29,u]), (g[30,u])]));
    u:=u+1;
  until u>29;



  Liste.SaveToFile('F:\MIKES LISTE.txt');

  close;
end;


Gerd Kayser - Mo 21.03.11 02:24

user profile iconjsbach hat folgendes geschrieben Zum zitierten Posting springen:
Ist der array als integer deklariert funktioniert es (/ durch div ersetzt), aber die Zahlen werden dann zu groß.
Geht int64 denn nicht?


Bergmann89 - Mo 21.03.11 10:34

Hey,

sicher das es dieser Fehler ist? Weil in Zeile 36 gibt es gar keine Division?! Du kannsts ja auch ma mit Extended probieren, das ist der größte Typ den es gibt (10 Byte).

MfG Bergmann.


Gammatester - Mo 21.03.11 11:44

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
sicher das es dieser Fehler ist? Weil in Zeile 36 gibt es gar keine Division?! Du kannsts ja auch ma mit Extended probieren, das ist der größte Typ den es gibt (10 Byte).

Er benutzt doch schon extended. Mit ziemlicher Sicherheit ist es kein Divisionsfehler (wahrscheinlich ungültige Gleitkommaoperation).

Ich denke, es ist ein Index-Bug und Rangecheck ist ausgeschaltet. In Zeile 36 wird u.a. g[u-k-1,u] mit u=11 und k=10 referenziert (es gibt aber auch eine Zuweisung an g[11-13-3,u] d.h. an g[-5,u], wenn nicht schon vorher der Fehler aufgetreten ist) Damit ist der erste Index=0, aber g ist als g: array[1..30, 1..30] of extended deklariert. Ohne Rangecheck wird deshalb Schrott gelesen, der den Fehler produziert.

Also: Rangecheck einschalten und Index-Logik überprüfen.


jsbach - Mo 21.03.11 13:35

Hallo!
Stimmt, es hieß Gleitkommaoperation. Habe jetzt "if k>=u then break;" nach k:=k+1; in Zeile 36 und 63 eingebaut. In Zeile 83 dann %d in %.0f ersetzt. Der Gleitkommafehler scheint damit behoben zu sein, bekomme jetzt allerdings eine Zugriffsverletzung bei 0043A739 angezeigt. Die Stelle im Code wird nicht markiert.

Gruß, Mike


bummi - Mo 21.03.11 13:47

g[17-k,12]; k:=k+1; until k>25


jsbach - Mo 21.03.11 15:06

Alles klar! Danke!


jsbach - Di 12.04.11 23:11

Hallo,
hat jemand Erfahrung mit der Unit BigNum? Ich würde sie gerne auf meinen Algorithmus anwenden, habe aber keinen Schimmer wie ich da vorgehen muss. Kann mir jemand dabei helfen?

Dank und Gruß,
Mike