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

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Вообще наверное стоит посмотреть в сторону очереди или malloc + memcpy
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

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

Сообщение kreator »

Admin писал(а):MaxArray должна быть константой.
На самом деле не обязательно. В момент определения массива MaxArray должна быть определена. Я конечно не точно написал, MaxArray должен приходить извне. Массивы как-то не кларионовская тема, поэтому и примера у меня нет. Можно посмотреть в libsrc, например, FuzzyClass.
We are hard at work… for you. :)
SuperMax
Посетитель
Сообщения: 47
Зарегистрирован: 25 Август 2015, 3:22
Поблагодарили: 2 раза

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

Сообщение SuperMax »

хочу массив байтов - те считать файл, провести обработку и записать новый

копаясь в старых исходниках нашел всякие тесты производительности различных драйверов (topspeed clarion итд) в различных режимах
и прочую фигню
той программки не нашел, но нашел переделку из нее - тест CPU - ALU/FPU - помню сравнивал тогда AMD k6-2 c P2
и в нем нашел декларацию:

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

AA                      LONG(0),DIM(1024000)    ! вход анализа - исходный реальный массив
CC                      SREAL(0),DIM(1024000)    ! вход анализа - исходный реальный массив
те комментарии от той программки регрессионного анализа

самое интересно что на CW10 прокатывает:

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

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
array to big
получается массив не может быть больше 4МБ
я-то сразу стал ставить массив в гигабайт и обломался, подумав что ограничение в 65535 (в интерфейсе кстати оно такое и есть)

а как я 300 мег сжирал регрессионным анализом так и не вспомнил.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

SuperMax писал(а): хочу массив байтов - те считать файл, провести обработку и записать новый
STRING и есть массив байтов. Объявляй bytearr &STRING и создавай bytearr &= NEW STRING(4000000)
С уважением, ДП
Ал
✯ Ветеран ✯
Сообщения: 1011
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия

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

Сообщение Ал »

Дед Пахом писал(а):
SuperMax писал(а): хочу массив байтов - те считать файл, провести обработку и записать новый
STRING и есть массив байтов. Объявляй bytearr &STRING и создавай bytearr &= NEW STRING(4000000)
:!: :cat: :)
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

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

Сообщение kreator »

Дед Пахом писал(а):STRING и есть массив байтов. Объявляй bytearr &STRING и создавай bytearr &= NEW STRING(4000000)
С 4 Мегами проблем нет. Товарищ хочет 300 или ещё лучше 1 Гиг. Можно посоветовать BLOB, но работа не тривиальна с этим делом.
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

В C10 help написано что
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.
Если бы размерность массива превышала 32 бита, к его элементам нельзя было бы обратиться через array, потому что I тоже 32 бита.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Вот 1 гиг

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

  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)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Если есть памяти достаточно, можете 10 или 20 таких блоков по 1Gb выделить. Все в ваших руках.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Кстати может через &BYTE и ADDRESS быстрее будет. если так можно. лениво вдаваться.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Ага... и считать в цикле с нуля до msize-1. А то за границу вылезти можно на байтик :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

Что-то я какую-то чушь про биты написал, не проснулся ещё :-)
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Дед Пахом писал(а): Что-то я какую-то чушь про биты написал, не проснулся ещё :-)
Бывает. Сам иногда напишу что то. И тут же удаляю :)
Ну или остается :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
SuperMax
Посетитель
Сообщения: 47
Зарегистрирован: 25 Август 2015, 3:22
Поблагодарили: 2 раза

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

Сообщение SuperMax »

Admin писал(а): Вот 1 гиг
у меня не получилось
те

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

        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
....
я что-то не так сделал ?
CW10 винда 7-ка 64бита

зы: откопал свою программку с регрессиями - там тоже порции по 4МБ, просто из-за количества массивов сумма получилась приличная
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Кстати я тут посмотрел еще раз код примера. Не уверен что он правильный.
Никогда не работал с malloc и memcpy и писал на коленке. Извиняюсь.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить