Максимальный размер массива в 32 битном приложении MAX DIM

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Гость

Сообщение Гость »

1)Ограничение для 32 битного приложения как для 16 битного ->> C50, с55 и это же ограничение (ясно что только 32 бита) ->> для с60))
В руководстве пользователя сказано, что для 32 битного приложения нет ограничений по максимальному размру массива.
Словарь в C50 и C55 не пропускает для File и Global , т.к. проверяет, по максимальному размеру колонки - ругается что слишком большой размер колонки. В с60 пропускает в Global в словаре, но ругается при генерации приложения.

Пробую сделать в APP - Делаю большой массив в глобальных данных в Embed вставка хдля С50, с55, С60. Ругается при генерации APP - слишком большой массив.

Мне нужно для с50. Просто попробовал для более новых версий и получил тоже самое.
С уважением, Кирил.


Написал: Kiril(161)
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

Херня какая то...:eek: Я вообще забыл, что такой массивы, не особо их используют в Clarion. Есть же другая структура: QUEUE - безразмерный "массив" - ее и используйте. Это раз..
Два... а что значит большой массив? Сколько это...в цифрах, какой тип, подробности короче...

Ну хрен с ним...решил я сам проверить как же дело обстоит...проверил на c55h, объявил массив LONG,DIM(100 000) в локальных данных и в глобальных - все на ура работает. Ни ошибок, ничего.
Написал: PAA(27)
Гость

Сообщение Гость »

Очередь это всё замечательно. Но массив бысрее и мне нужно именно массив, т.к. удобнее в в моей задаче пользоваться индексами, а не позиционироваться в очереди.

Сейчас в проекте 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.
Гость

Сообщение Гость »

В APP славлю массив с размерностью больше 1024 * 1024 и Ругается ! для 32 разрядного проекта. Вот в этом вопрос.

Т.е. если вставить одномерный массив с размерностью > 1024 * 1024 или двумерный [> 1024 , > 1024], то при генерации приложения, получаю сообщение об ошибке, что слишком большой массив.

С уважением. Кирил.
Гость

Сообщение Гость »

А массив [1000,1000,1000,1000] не пойдет ?
Ну и первый элемент это [1,1,1,1].
Второй [1,1,1,2]
Тысячный [1,1,1,1000]
1001-ый [1,1,2,1]
Удачи.
Фин.
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

да действительно массив размером 1025 на 1025 выдает array to big, даже если описать типо:

Код: Выделить всё

COMPILE('***',_WIDTH32_)
MyArray LONG,DIM(1025,1025)
***
...вот ведь...:mad:

...задело меня это - вариант с массивом не смог победить :mad:

Решение с очередью, можно оформить в виде процедур, типо 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)
Гость

Сообщение Гость »

Спасибо за ответ. Попробую с очередью.

Поискал ещё около клариона. Может быть подскажете - возможно подключить модуль на С с функцией '_alloca'. Раньше не работал
с комбинацией Кларион + С. Если получится, то тогда можно будет организовать массив прямо в стеке.

С уважением, Кирил.
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

Насчет связки С и Кларион - сам не пробовал, единственно чем могу :) см. примеры в Examples\SRC\SHOWIMG там часть проги написана на С, часть на Кларе.
И еще момент: SHORT,DIM(1025,1025) - канает :), может хватит SHORT-a ? :)
Написал: PAA(27)
Гость

Сообщение Гость »

Спасибо за ответы. Воспользуюсь советом для очереди для очень больших массивов.
Нашёл ещё один вариант в архивах. Может кому нужно.
Разработчики забыли отключить для 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 не катиит.

С уважением, Кирил.
Гость

Сообщение Гость »

Привет Кирил!
Посмотри, может поможет решить твои проблемы.
Когда-то где-то использовал динамически создаваемый двумерный массив. Пример:

Код: Выделить всё

    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
Гость

Сообщение Гость »

Красивое решение. Спасибо.

Спасибо всем кто ответил
Теперь есть решение для очень больших динамических "массивов" с очередью и динамических массивов меньшего размера в памяти.

С уважением, Кирил
Гость

Сообщение Гость »

Спасибо за ответ.
Здорово закручено. Этож надо сделать многомерный массив массив в строке.
С уважением, Кирил.
SuperMax
Посетитель
Сообщения: 47
Зарегистрирован: 25 Август 2015, 3:22
Поблагодарили: 2 раза

Максимальный размер массива в 32 битном приложении MAX DIM

Сообщение SuperMax »

Столкнулся со старой проблемой - не могу объявить массив с количеством элементов более 65535
Хотя точно помню, что на CW2 (или CW4 ?) короче на том что был в 1998ом) я грузил в память файлы в 300 мегабайт
были массивы LONG, и какая-то хитрость с объявлением.

а вот как - в упор не помню Ж(
может знает/помнит ?

зы:CW10
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Максимальный размер массива в 32 битном приложении MAX DIM

Сообщение kreator »

Попробуй вот так:

Код: Выделить всё

MaxArray    Long
LOC:Array   Long,DIM(MaxArray)
Не знаю, что из этого выйдет. Ещё можно посмотреть new() (наверно вообще тупиковый путь).
А зачем нужен массив такой? Выше сказано, что Queue - есть массив.
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Максимальный размер массива в 32 битном приложении MAX DIM

Сообщение Admin »

MaxArray должна быть константой.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить