4096

May. 3rd, 2005 03:59 pm
kibirov: (Default)
[personal profile] kibirov
Ну вот, через 8 лет после написания программы выяснилось, что в Клиппере массивы не могут содержать больше 4096 элементов. Конечно, тогда никто и не думал такими огромными пачками информацию компьютерам скармливать, так что я даже и не знал о таком лимите...

Спрашивается, что делать? Писать на чём-нибудь новом то же самое - долго, им нужно прямо сейчас кипу бланков просчитать.

О, зато в клипперовских массивах ничем не ограничено число измерений. Вот лучше б было наоборот, ей-богу...

Date: 2005-05-03 05:49 am (UTC)
From: [identity profile] j-j-j.livejournal.com
создай второй массив, как первый заполнится

Date: 2005-05-03 06:07 am (UTC)
From: [identity profile] kibirov.livejournal.com
Да, это первое, что в голову пришло, но я теперь и не знаю, сколько элементов теоретически может быть. Как забабахают десять тысяч бланков - тогда и второй рухнет.

Заманчивей сделать его двумерным - типа massiv[int(i/4096)+1, i]. Обдумываю эту мысль, в исходник лезть боюсь пока :) Экий выигрыш во времени получится: пока они 4096 в квадрате бланков насобирают - я успею новую программу написать...

Date: 2005-05-03 06:09 am (UTC)
From: [identity profile] j-j-j.livejournal.com
не, это скучно
а ты не можешь просто счетчик поставить - как дошел до 4096, так сразу следующий начинается...
и обратно

Date: 2005-05-03 06:13 am (UTC)
From: [identity profile] kibirov.livejournal.com
то есть massiv[int(i/4096)+1,mod(i/4096)], чего это я...

Date: 2005-05-03 06:28 am (UTC)
From: [identity profile] kibirov.livejournal.com
Так это как раз скучно, потому что там всякие процедуры из массива берут данные потом для разных нужд, и вот сейчас им всем объяснять, что массивов два... или больше... мам-ма дорогая :)

Я хочу меньшим количеством правки кода отделаться, чего там говорить ;)

Вот с двумерным - оно как бы так и получится: дошла первая строка до 4096 - пошла вторая... и дописать-то всего ничего...

Date: 2005-05-03 06:33 am (UTC)
From: [identity profile] j-j-j.livejournal.com
не забудь тогда указать обработчику строк, что у тебя их не одна
а то были случаи

Date: 2005-05-03 06:45 am (UTC)
From: [identity profile] kibirov.livejournal.com
:)
завтра буду додумывать, посмотрим, что получится. А то это я такой умный до тех пор, пока в исходник не влез :)

Date: 2005-05-03 06:50 am (UTC)
From: [identity profile] j-j-j.livejournal.com
это да
я вот исходники уже не правлю, зарекся
проще с самого начала все переписать, чем разбирать чьи-то (а хотя бы и свои старые) исходники

Date: 2005-05-03 06:53 am (UTC)
From: [identity profile] krayniy.livejournal.com
Что такое Клиппер?

Clipper

Date: 2005-05-03 07:15 am (UTC)
From: [identity profile] kibirov.livejournal.com
Язык программирования. Старый. Для разработки независимых исполняемых модулей под ДОС. С очень мощной поддержкой работы с БД. Много общего с FoxPro и Dbase III. Пенсионный фонд и налоговая распространяли (если до сих пор не распространяют) по учреждениям ДОС-проги для сбора всяких данных - они вот как раз клипперовские были по большей части, это было видно по вываливающимся ошибкам :)

Исходник выглядит примерно так:

static function IdSqPart(n,i)
local j
if layout>len(_parts)
return .F.
end
if i>len(_parts[layout]) .or. i==0
j:=0
do while j
[Error: Irreparable invalid markup ('<len(_parts[layout])>') in entry. Owner must fix manually. Raw contents below.]

Язык программирования. Старый. Для разработки независимых исполняемых модулей под ДОС. С очень мощной поддержкой работы с БД. Много общего с FoxPro и Dbase III. Пенсионный фонд и налоговая распространяли (если до сих пор не распространяют) по учреждениям ДОС-проги для сбора всяких данных - они вот как раз клипперовские были по большей части, это было видно по вываливающимся ошибкам :)

Исходник выглядит примерно так:

static function IdSqPart(n,i)
local j
if layout>len(_parts)
return .F.
end
if i>len(_parts[layout]) .or. i==0
j:=0
do while j<len(_parts[layout])
j++
if IdSqPart(n,j)
return .T.
end
end
else
if ascan(_parts[layout][i][2],{|ss|n>=ss[1] .and. n<=ss[2]})!=0
return .T.
end
end
return .F.

или так:

use fishes
lenfish=lastrec()
fishes=array(lastrec(),2)
for i=1 to lastrec()
go i
fishes[i,1]=fieldget(1)
fishes[i,2]=fieldget(2)
next
close databases
asort(fishes,,,{|x,y| x[1]<y[1] })

Date: 2005-05-03 08:09 am (UTC)
From: [identity profile] a-konst.livejournal.com
ЭЭЭ...
я так понял, что "количество" элементов в массиве - это именно количество, а не максимальная координата поодному измерению.

Или это именно ограничение максимума координаты?

Date: 2005-05-03 10:29 am (UTC)
From: [identity profile] kibirov.livejournal.com
А, да, не очень внятно написал. Именно максимум координаты ограничен. А[{1..4096},{1..4096},{1..4096},...], как-то так. Координат самих сколько угодно.

В руководстве дословно сказано: максимальное количество элементов в каждом измерении 4096, максимальное количество измерений ограничено только возможностями памяти. Хочется верить, что для такого решения у разработчиков был какой-то резон :)

Уф, вот стыдно: понятия не имел, что в клиппере с массивами всё так непросто. Если б наши рыбники не захотели загнать туда результаты пяти тысяч замеров...
Page generated Feb. 13th, 2026 05:57 am
Powered by Dreamwidth Studios