Autor Beitrag
jsbach
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: Di 09.11.10 22:28 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 09.11.10 22:33 
Moin!

Warum nicht. Zeig mal deinen Code. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jsbach Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: Di 09.11.10 22: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'


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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mi 10.11.10 00:25 
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:
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.
}

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jsbach Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: Mi 10.11.10 01:33 
super, danke!
da wäre ich ja nie drauf gekommen.

gruß, mike
jsbach Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: So 20.03.11 23: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ß.

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

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mo 21.03.11 01: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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 21.03.11 09: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.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Mo 21.03.11 10: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: Mo 21.03.11 12: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 21.03.11 12:47 
g[17-k,12]; k:=k+1; until k>25

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jsbach Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: Mo 21.03.11 14:06 
Alles klar! Danke!
jsbach Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: Di 12.04.11 22: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