![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает Int64 [D7, WinXP]
Kaer © (2008-06-05 12:18:00)Необходимо сделать пограмму для построения таблички значений(довольно больших) и дальнейшее сравнение 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;
incm (2008-06-06 15:52:00) [1]Какой смысл делать индексы массивов, еще и многомерных, 64 битные ?
Кажись даже 2007 дельфя не умеет генерить 64 битный код (в смысле использовать 64 битные комманды проца). Так что больше 2Гб массива данных не возможно адресовать. А для этого обычного Integer хватит.
Anatoly Podgoretsky (2008-06-05 19:01:00) [2]> McSimm (05.06.2008 16:51:04) [4]
Это ошибка компилятора, строка 1091
Ляпа (2008-06-05 17:24:00) [3]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.
Ляпа (2008-06-05 17:21:00) [4]
> Игорь Шевченко © (05.06.08 17:08) [6]
Не только для индексов.
Если сделать переменные b,i в предыдущем коде не глобальными, а локальными, сообщение об ошибке будет более вразумительным...
[Error] Unit1.pas(30): For loop control variable must have ordinal type
Игорь Шевченко (2008-06-05 17:08:00) [5]McSimm © (05.06.08 16:51) [4]
> Тут надо шаманить
например компилятор не может сгенерировать код для многомерных динамических массивов с индексами типа int64
первое шаманство, которое бы я сделал - объявил переменные для индексов типа Integer
Ляпа (2008-06-05 17:06:00) [6]В 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.
McSimm (2008-06-05 16:51:00) [7]
> Internal error: C1091
Если не ошибаюсь, это ошибка IDE, а не времени исполнения или синтаксиса.
Тут надо шаманить
MBo (2008-06-05 15:48:00) [8]>Thrasher
У него SetLength с i + 1, так что нулевой индекс можно и не использовать
Thrasher (2008-06-05 15:28:00) [9]Все динамические массивы индексируются с 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;
Palladin (2008-06-05 12:24:00) [10]
> 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;
так попробуй