Максимальный размер массива в 32 битном приложении MAX DIM
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
1)Ограничение для 32 битного приложения как для 16 битного ->> C50, с55 и это же ограничение (ясно что только 32 бита) ->> для с60))
В руководстве пользователя сказано, что для 32 битного приложения нет ограничений по максимальному размру массива.
Словарь в C50 и C55 не пропускает для File и Global , т.к. проверяет, по максимальному размеру колонки - ругается что слишком большой размер колонки. В с60 пропускает в Global в словаре, но ругается при генерации приложения.
Пробую сделать в APP - Делаю большой массив в глобальных данных в Embed вставка хдля С50, с55, С60. Ругается при генерации APP - слишком большой массив.
Мне нужно для с50. Просто попробовал для более новых версий и получил тоже самое.
С уважением, Кирил.
Написал: Kiril(161)
В руководстве пользователя сказано, что для 32 битного приложения нет ограничений по максимальному размру массива.
Словарь в C50 и C55 не пропускает для File и Global , т.к. проверяет, по максимальному размеру колонки - ругается что слишком большой размер колонки. В с60 пропускает в Global в словаре, но ругается при генерации приложения.
Пробую сделать в APP - Делаю большой массив в глобальных данных в Embed вставка хдля С50, с55, С60. Ругается при генерации APP - слишком большой массив.
Мне нужно для с50. Просто попробовал для более новых версий и получил тоже самое.
С уважением, Кирил.
Написал: Kiril(161)
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
Херня какая то... Я вообще забыл, что такой массивы, не особо их используют в Clarion. Есть же другая структура: QUEUE - безразмерный "массив" - ее и используйте. Это раз..
Два... а что значит большой массив? Сколько это...в цифрах, какой тип, подробности короче...
Ну хрен с ним...решил я сам проверить как же дело обстоит...проверил на c55h, объявил массив LONG,DIM(100 000) в локальных данных и в глобальных - все на ура работает. Ни ошибок, ничего.
Написал: PAA(27)
Два... а что значит большой массив? Сколько это...в цифрах, какой тип, подробности короче...
Ну хрен с ним...решил я сам проверить как же дело обстоит...проверил на 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.
Сейчас в проекте 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], то при генерации приложения, получаю сообщение об ошибке, что слишком большой массив.
С уважением. Кирил.
Т.е. если вставить одномерный массив с размерностью > 1024 * 1024 или двумерный [> 1024 , > 1024], то при генерации приложения, получаю сообщение об ошибке, что слишком большой массив.
С уважением. Кирил.
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
да действительно массив размером 1025 на 1025 выдает array to big, даже если описать типо:
...вот ведь...
...задело меня это - вариант с массивом не смог победить
Решение с очередью, можно оформить в виде процедур, типо GetElement(row,col), FillElement и т.п.
естественно, что можно в очередь добавить дополнительные поля, т.е. i и j это будут индексы, а элемент, допустим, с именем data - собственно данные.
PS
понимаю что херня
Написал: PAA(27)
Код: Выделить всё
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
PS
понимаю что херня
Написал: 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 не катиит.
С уважением, Кирил.
Нашёл ещё один вариант в архивах. Может кому нужно.
Разработчики забыли отключить для 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 не катиит.
С уважением, Кирил.
Привет Кирил!
Посмотри, может поможет решить твои проблемы.
Когда-то где-то использовал динамически создаваемый двумерный массив. Пример:
С уважением,
Mit
Посмотри, может поможет решить твои проблемы.
Когда-то где-то использовал динамически создаваемый двумерный массив. Пример:
Код: Выделить всё
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
Максимальный размер массива в 32 битном приложении MAX DIM
Столкнулся со старой проблемой - не могу объявить массив с количеством элементов более 65535
Хотя точно помню, что на CW2 (или CW4 ?) короче на том что был в 1998ом) я грузил в память файлы в 300 мегабайт
были массивы LONG, и какая-то хитрость с объявлением.
а вот как - в упор не помню Ж(
может знает/помнит ?
зы:CW10
Хотя точно помню, что на CW2 (или CW4 ?) короче на том что был в 1998ом) я грузил в память файлы в 300 мегабайт
были массивы LONG, и какая-то хитрость с объявлением.
а вот как - в упор не помню Ж(
может знает/помнит ?
зы:CW10
-
- ✯ Ветеран ✯
- Сообщения: 4994
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 21 раз
Максимальный размер массива в 32 битном приложении MAX DIM
Попробуй вот так:
Не знаю, что из этого выйдет. Ещё можно посмотреть new() (наверно вообще тупиковый путь).
А зачем нужен массив такой? Выше сказано, что Queue - есть массив.
Код: Выделить всё
MaxArray Long
LOC:Array Long,DIM(MaxArray)
А зачем нужен массив такой? Выше сказано, что Queue - есть массив.
We are hard at work… for you.
- Admin
- Администратор
- Сообщения: 3962
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 27 раз
- Поблагодарили: 22 раза
- Контактная информация:
Максимальный размер массива в 32 битном приложении MAX DIM
MaxArray должна быть константой.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса