Страница 1 из 4
Добавлено: 20 Ноябрь 2004, 8:51
Гость
1)Ограничение для 32 битного приложения как для 16 битного ->> C50, с55 и это же ограничение (ясно что только 32 бита) ->> для с60))
В руководстве пользователя сказано, что для 32 битного приложения нет ограничений по максимальному размру массива.
Словарь в C50 и C55 не пропускает для File и Global , т.к. проверяет, по максимальному размеру колонки - ругается что слишком большой размер колонки. В с60 пропускает в Global в словаре, но ругается при генерации приложения.
Пробую сделать в APP - Делаю большой массив в глобальных данных в Embed вставка хдля С50, с55, С60. Ругается при генерации APP - слишком большой массив.
Мне нужно для с50. Просто попробовал для более новых версий и получил тоже самое.
С уважением, Кирил.
Написал: Kiril(161)
Добавлено: 20 Ноябрь 2004, 9:29
StillZero
Херня какая то...
Я вообще забыл, что такой массивы, не особо их используют в Clarion. Есть же другая структура: QUEUE - безразмерный "массив" - ее и используйте. Это раз..
Два... а что значит большой массив? Сколько это...в цифрах, какой тип, подробности короче...
Ну хрен с ним...решил я сам проверить как же дело обстоит...проверил на c55h, объявил массив LONG,DIM(100 000) в локальных данных и в глобальных - все на ура работает. Ни ошибок, ничего.
Написал: PAA(27)
Добавлено: 20 Ноябрь 2004, 12:43
Гость
Очередь это всё замечательно. Но массив бысрее и мне нужно именно массив, т.к. удобнее в в моей задаче пользоваться индексами, а не позиционироваться в очереди.
Сейчас в проекте lдля с50 илм С55 ставлю 32 бита.
Для файла это понятно - для TPS есть лограничение по размеру колонки 15000 - поэтому ругается словарь.
В APP славлю массив больше 64000 и ругается для 32 разрядного проекта. Вот в этом вопрос
program
Map
.
arr_long long,DIM(1025,1025) ! (1024,1024) ! если <= 1024, то нормально
M long
N long
code
M = 1025 !1024
N = 1025 !1024
loop i# = 1 to M
loop j#=1 to N
arr_long[i#,j#] = i# +j#
.
.
message(arr_long[1,1] & '/' & arr_long[M,N])
Если поставить 1024, то всё норально.
Но мне нужен простой большой массив, который по доке ограничен по размерам только размерами виртуальной памяти.
С уважением. Кирил.
P.S. Очередь это очень удобная вещь, но мне сейчас очень нужен большой - большой массив для С50.
Добавлено: 20 Ноябрь 2004, 13:46
Гость
В APP славлю массив с размерностью больше 1024 * 1024 и Ругается ! для 32 разрядного проекта. Вот в этом вопрос.
Т.е. если вставить одномерный массив с размерностью > 1024 * 1024 или двумерный [> 1024 , > 1024], то при генерации приложения, получаю сообщение об ошибке, что слишком большой массив.
С уважением. Кирил.
Добавлено: 22 Ноябрь 2004, 2:56
Гость
А массив [1000,1000,1000,1000] не пойдет ?
Ну и первый элемент это [1,1,1,1].
Второй [1,1,1,2]
Тысячный [1,1,1,1000]
1001-ый [1,1,2,1]
Удачи.
Фин.
Добавлено: 22 Ноябрь 2004, 4:36
StillZero
да действительно массив размером 1025 на 1025 выдает array to big, даже если описать типо:
Код: Выделить всё
COMPILE('***',_WIDTH32_)
MyArray LONG,DIM(1025,1025)
***
...вот ведь...
...задело меня это - вариант с массивом не смог победить
Решение с очередью, можно оформить в виде процедур, типо GetElement(row,col), FillElement и т.п.
Код: Выделить всё
! описываем очереди
queueJ QUEUE
arrJ LONG
END
queueArr QUEUE
I LONG
J &queueJ
END
! заполняем очереди
loop i#=1 to 3
queueArr.I=i#
queueArr.J &= new(queueJ)
loop j#=1 to 2
if NOT queueArr.J &= NULL
queueArr.J.arrJ=j#
add(queueArr.J)
end
end
add(queueArr)
end
! пробежаться по всей очереди
loop i#=1 to 3
get(queueArr,i#)
loop j#=1 to 2
get(queueArr.J,j#)
message(queueArr.I &'-'&queueArr.J.arrJ)
end
end
! взять определенный элемент (1.2)
queueArr.I=1
get(queueArr,queueArr.I)
if ~errorcode()
queueArr.J.arrJ=2
get(queueArr.J,queueArr.J.arrJ)
if ~errorcode()
message(queueArr.I &'-'&queueArr.J.arrJ)
end
end
естественно, что можно в очередь добавить дополнительные поля, т.е. i и j это будут индексы, а элемент, допустим, с именем data - собственно данные.
PS
понимаю что херня
Написал: PAA(27)
Добавлено: 22 Ноябрь 2004, 18:40
Гость
Спасибо за ответ. Попробую с очередью.
Поискал ещё около клариона. Может быть подскажете - возможно подключить модуль на С с функцией '_alloca'. Раньше не работал
с комбинацией Кларион + С. Если получится, то тогда можно будет организовать массив прямо в стеке.
С уважением, Кирил.
Добавлено: 23 Ноябрь 2004, 2:26
StillZero
Насчет связки С и Кларион - сам не пробовал, единственно чем могу
см. примеры в Examples\SRC\SHOWIMG там часть проги написана на С, часть на Кларе.
И еще момент: SHORT,DIM(1025,1025) - канает
, может хватит SHORT-a ?
Написал: PAA(27)
Добавлено: 24 Ноябрь 2004, 10:41
Гость
Спасибо за ответы. Воспользуюсь советом для очереди для очень больших массивов.
Нашёл ещё один вариант в архивах. Может кому нужно.
Разработчики забыли отключить для 32 бит ограничение, которое
есть для 16.
Есть другое решение, но только для процедуры.
program
Map
Arr procedure(LONG,LONG)
end
code
...
Arr procedure(M,N)
Arr_L long(M,N)
code
loop i# = 1 to M
loop j# =1 to N
Arr[i#,j#] = i# + j#
.
.
Динмически будет создаваться массив.
Есть ограничение, по виртуальной памяти - т.е. если массив где-то по размерам на пределах размеров доступной виртуальной памяти, то поолучаем сообщение, что виртуальная память заканчивается, ели больше, то получаем ошибку доступа.
Как через Win API проверить доступную виртальную память и проверить доступный по памяти размер массива?
Получается, что Long * M * N не катиит.
С уважением, Кирил.
Добавлено: 24 Ноябрь 2004, 11:40
Гость
Привет Кирил!
Посмотри, может поможет решить твои проблемы.
Когда-то где-то использовал динамически создаваемый двумерный массив. Пример:
Код: Выделить всё
PROGRAM
!
MAP
GetMatr(LONG I, LONG J, LONG NN),REAL
PutMatr(LONG I, LONG J, LONG NN, REAL U)
END !map
DynRef &STRING
Arr REAL,DIM(1),OVER(DynRef)
sz LONG
rr REAL
CODE
M# = 3000 !Кол-во строк
N# = 4000 !Кол-во столбцов
sz= M# * N#
DynRef &= NEW(STRING((sz * 8)))
loop i#=1 to M#
loop j#=1 to N#
ri$ = i#+0.1
rj$ = j#+0.1
rr = ri$+rj$
PutMatr(i#,j#,N#,rr)
end
end
R$ = GetMatr(3,4,N#)
message(R$)
DISPOSE(DynRef)
GetMatr PROCEDURE(LONG I, LONG J, LONG NN)
indx long
code
indx = (I-1)*NN + J
return(Arr[indx])
PutMatr PROCEDURE(LONG I, LONG J, LONG NN, REAL U)
indx long
code
indx = (I-1)*NN + J
Arr[indx]=U
! return(Arr[indx])
С уважением,
Mit
Добавлено: 25 Ноябрь 2004, 9:47
Гость
Красивое решение. Спасибо.
Спасибо всем кто ответил
Теперь есть решение для очень больших динамических "массивов" с очередью и динамических массивов меньшего размера в памяти.
С уважением, Кирил
Добавлено: 26 Ноябрь 2004, 9:24
Гость
Спасибо за ответ.
Здорово закручено. Этож надо сделать многомерный массив массив в строке.
С уважением, Кирил.
Максимальный размер массива в 32 битном приложении MAX DIM
Добавлено: 10 Ноябрь 2015, 9:11
SuperMax
Столкнулся со старой проблемой - не могу объявить массив с количеством элементов более 65535
Хотя точно помню, что на CW2 (или CW4 ?) короче на том что был в 1998ом) я грузил в память файлы в 300 мегабайт
были массивы LONG, и какая-то хитрость с объявлением.
а вот как - в упор не помню Ж(
может знает/помнит ?
зы:CW10
Максимальный размер массива в 32 битном приложении MAX DIM
Добавлено: 10 Ноябрь 2015, 9:55
kreator
Попробуй вот так:
Не знаю, что из этого выйдет. Ещё можно посмотреть new() (наверно вообще тупиковый путь).
А зачем нужен массив такой? Выше сказано, что Queue - есть массив.
Максимальный размер массива в 32 битном приложении MAX DIM
Добавлено: 10 Ноябрь 2015, 10:40
Admin
MaxArray должна быть константой.