Максимальный размер массива в 32 битном приложении MAX DIM
Добавлено: 10 Ноябрь 2015, 10:54
Вообще наверное стоит посмотреть в сторону очереди или malloc + memcpy
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
На самом деле не обязательно. В момент определения массива MaxArray должна быть определена. Я конечно не точно написал, MaxArray должен приходить извне. Массивы как-то не кларионовская тема, поэтому и примера у меня нет. Можно посмотреть в libsrc, например, FuzzyClass.Admin писал(а):MaxArray должна быть константой.
Код: Выделить всё
AA LONG(0),DIM(1024000) ! вход анализа - исходный реальный массив
CC SREAL(0),DIM(1024000) ! вход анализа - исходный реальный массив
Код: Выделить всё
AC ULONG(0),DIM(1024000),STATIC
AB ULONG(0),DIM(1024000),STATIC
AV byte(0),DIM(4025000),STATIC
Код: Выделить всё
AD long(0),DIM(4025000),STATIC
AB ULONG(0),DIM(2024000),STATIC
С 4 Мегами проблем нет. Товарищ хочет 300 или ещё лучше 1 Гиг. Можно посоветовать BLOB, но работа не тривиальна с этим делом.Дед Пахом писал(а):STRING и есть массив байтов. Объявляй bytearr &STRING и создавай bytearr &= NEW STRING(4000000)
Если бы размерность массива превышала 32 бита, к его элементам нельзя было бы обратиться через array, потому что I тоже 32 бита.In general, there is a limit to size of data objects declared in global, module or local scope: 4MB. The compiler can report different errors depending from the type of data object exceeding this limit. Particularly, arrays with variable dimensions may be of a slightly greater size than 4MB.
Код: Выделить всё
PROGRAM
MAP
module('runtime')
malloc(signed),long,name('_malloc')
free(long),name('_free')
memcpy(Long,Long,Unsigned),Name('_memcpy')
end
END
msize long(1024*1024*1024)
mem long
buff byte
all long
CODE
mem = malloc(msize)
! пишем в память
LOOP W# = 1 TO msize
buff = 1
memcpy(mem+W#, ADDRESS(buff), 1)
END
! читаем из памяти
LOOP W# = 1 TO msize
buff = 0
memcpy(ADDRESS(buff), mem+W#, 1)
all += buff
END
MESSAGE(all)
free(mem)
у меня не получилось
Код: Выделить всё
mem = malloc(msize) ! выделение памяти
IF mem = ''
MESSAGE('Insufficient memory available','ERROR',ICON:Hand)
RETURN
END
Код: Выделить всё
buff = 1
memcpy(mem, ADDRESS(buff), 1)
я что-то не так сделал ?Exception occurred at address 0101BDF4
Exception code C0000005: Access Violation
....