Форум: "Начинающим";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];
ВнизНе работает 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.044 c