Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.06;
Скачать: CL | DM;

Вниз

Не работает Int64   Найти похожие ветки 

 
Kaer   (2008-06-05 12:18) [0]

Необходимо сделать пограмму для построения таблички значений(довольно больших) и дальнейшее сравнение 2 и 3 строки. Значение большие и выходят за пределы граница обычных типов данных. Пробую испльзовать Int64. программа отказыватеся компилится. что не так? мож потому что у меня винда 32 разрядная? И какой тип вообще лучше использовать тип данных тогда, если Edit1.text:="1000". Получается по формуле 3-ей подстроки(где самые большие значения) - с=b^4+a^4, это получается 1 000 000 000 000(!!!). Чем можно работать с таким значением?

Ошибка такая выскакивает: [Fatal Error] Unit1.pas(69): Internal error: C1091
На форме 1 Edit и 1 кнопка

Код программы

var
 Form1: TForm1;
 x, y, a, b, i : Int64;
 ar  : array of array of array of Int64;
 f,d: TextFile;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 AssignFile(f,"Таблица.txt");
 ReWrite(f);
 AssignFile(d,"Пов_числа.txt");
 ReWrite(d);
 i:= StrToInt(Edit1.Text);
 SetLength(ar,i+1,i+1,3);

 //заполняю массив
 for b := 1 to i do
   for a := b to i do
   begin
     ar[b,a,0] := Int64(2*a*b);
     ar[b,a,1] := Int64(a*a*a*a-b*b*b*b);
     ar[b,a,2] := Int64(b*b*b*b+a*a*a*a);
   end;
 //создаю таблицу
 for a:= 1 to i do
 begin
   for b:=1 to a do if b=a then Writeln(f, IntToStr(ar[b,a,0])) else Write(f, IntToStr(ar[b,a,0])+" ");
   for b:=1 to a do if b=a then Writeln(f, IntToStr(ar[b,a,1])) else Write(f, IntToStr(ar[b,a,1])+" ");
   for b:=1 to a do if b=a then Writeln(f, IntToStr(ar[b,a,2])) else Write(f, IntToStr(ar[b,a,2])+" ");
 end;
 CloseFile(f);
 //произвожу сравнение
 for y := 1 to i do
   for x := y to i do
     for b:= 1 to i do
       for a:= b to i do
         if (ar[y,x,1]=ar[b,a,2]) then
         begin
           Writeln(d, IntToStr(ar[y,x,1]));
           Writeln(d,"Строка "+IntToStr(a)+" столбец "+IntToStr(b)+" - 3");
           Writeln(d,"Строка "+IntToStr(x)+" столбец "+IntToStr(y)+" - 2");
           Writeln(d," ");
         end;

 CloseFile(d);
 ShowMessage("Расчет закончен");
end;


 
Palladin ©   (2008-06-05 12:24) [1]


>      ar[b,a,0] := Int64(2*a*b);
>      ar[b,a,1] := Int64(a*a*a*a-b*b*b*b);
>      ar[b,a,2] := Int64(b*b*b*b+a*a*a*a);

Var
a_4,b_4:Int64;
...
a_4:=a*a*a*a;
b_4:=b*b*b*b;
ar[b,a,0] := 2*a*b;
ar[b,a,1] := a_4-b_4;
ar[b,a,2] := b_4+a_4;


так попробуй


 
Thrasher ©   (2008-06-05 15:28) [2]

Все динамические массивы индексируются с 0! Иначе они просто не заполняются.

for b := 0{(!)} to i do
  for a := b to i do
  begin
    ar[b,a,0] := Int64(2*a*b);
    ar[b,a,1] := Int64(a*a*a*a-b*b*b*b);
    ar[b,a,2] := Int64(b*b*b*b+a*a*a*a);
  end;


 
MBo ©   (2008-06-05 15:48) [3]

>Thrasher
У него SetLength с i + 1, так что нулевой индекс можно и не использовать


 
McSimm ©   (2008-06-05 16:51) [4]


> Internal error: C1091

Если не ошибаюсь, это ошибка IDE, а не времени исполнения или синтаксиса.
Тут надо шаманить


 
Ляпа   (2008-06-05 17:06) [5]

В D6 попытка компиляции кода (см. ниже) приводит к
Internal Error C1051


nit Unit1;

interface

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

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

var
 Form1: TForm1;
 b,i:int64;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
for b := 1 to i do begin end;
end;

end.


 
Игорь Шевченко ©   (2008-06-05 17:08) [6]

McSimm ©   (05.06.08 16:51) [4]


> Тут надо шаманить


например компилятор не может сгенерировать код для многомерных динамических массивов с индексами типа int64
первое шаманство, которое бы я сделал - объявил переменные для индексов типа Integer


 
Ляпа   (2008-06-05 17:21) [7]


> Игорь Шевченко ©   (05.06.08 17:08) [6]

Не только для индексов.
Если сделать переменные b,i в предыдущем коде не глобальными, а локальными, сообщение об ошибке будет более вразумительным...

[Error] Unit1.pas(30): For loop control variable must have ordinal type


 
Ляпа   (2008-06-05 17:24) [8]

Help:
You may see this error if a FOR loop uses an Int64 or Variant control variable. This results from a limitation in the compiler which you can work around by replacing the FOR loop with a WHILE loop.


 
Anatoly Podgoretsky ©   (2008-06-05 19:01) [9]

> McSimm  (05.06.2008 16:51:04)  [4]

Это ошибка компилятора, строка 1091


 
incm   (2008-06-06 15:52) [10]

Какой смысл делать индексы массивов, еще и многомерных, 64 битные ?
Кажись даже 2007 дельфя не умеет генерить 64 битный код (в смысле использовать 64 битные комманды проца). Так что больше 2Гб массива данных не возможно адресовать. А для этого обычного Integer хватит.



Страницы: 1 вся ветка

Текущий архив: 2008.07.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
15-1211460509
Tirael
2008-05-22 16:48
2008.07.06
чем грозит невключение шифрации в wi-fi сети?


11-1191179304
LazyBob
2007-09-30 23:08
2008.07.06
Глюк с изменением свойства caption


15-1211464189
БарЛог
2008-05-22 17:49
2008.07.06
Почтовый вервер не отправляет "во вне" :(


2-1212753107
opoloXAI
2008-06-06 15:51
2008.07.06
FileExists(myfName)


2-1213009498
Vyacheslav
2008-06-09 15:04
2008.07.06
Сменить вид иконки в трее