Страница 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
Херня какая то...:eek: Я вообще забыл, что такой массивы, не особо их используют в 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)
***
...вот ведь...: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)

Добавлено: 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
Попробуй вот так:

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

MaxArray    Long
LOC:Array   Long,DIM(MaxArray)
Не знаю, что из этого выйдет. Ещё можно посмотреть new() (наверно вообще тупиковый путь).
А зачем нужен массив такой? Выше сказано, что Queue - есть массив.

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

Добавлено: 10 Ноябрь 2015, 10:40
Admin
MaxArray должна быть константой.