Динамическое создание массива

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Динамическое создание массива

Сообщение ru_alex »

Привет всем!
Как динамически создать массив? Вроде где-то инфа проходила, но не нашел...
Аватара пользователя
Andrew Listiev
Активист
Сообщения: 166
Зарегистрирован: 07 Июль 2005, 11:16
Откуда: Латвия, Рига

Сообщение Andrew Listiev »

Если вы имеете в виду создание массива через оператор New, то увы, никак. Можно немного схитрить и использовать дополнительную процедуру:

CreateArray Procedure(Long ArrayLength)
MyArray String(16), Dim(ArrayLength)
Code
!
! Далее стандартно работаем с массивом
!

Я давно отказался от использования массивов, заменив подход использованием очереди:

MyArray Queue
Element Long
End
Mit

Сообщение Mit »

Всем привет!
Эх, раньше было демократичней, мог войти в качестве Гостя,
а сейчас нужно регистрироваться!
Простите, год отключен от Клариона, может ляпну что-либо невпопад.

В свое время подумал, что NEW выделяет память каким-нибудь
сишным malloc и ему до лампочки, какой объект ему подсунуть.
Подсунул STRING и ,вроде, получилось. Но лучше CSTRING
с учетом нуль-терминатора. Помнится в 32-битных приложениях
есть ограничения на размер STRING, а на CSRTING - нет.
Вот примеры из архива (кажется, я их уже отправлял на форум).

С уважением,
Владимир Митраков


PROGRAM
!*********************************************************************
! Пример создания 2-мерного динамического массива
! Владимир Митраков
!*********************************************************************
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
!========================================================



PROGRAM
!*********************************************************************
!Пример аналога массивам структур в С
!Динамическое выделение памяти
!Владимир Митраков
!*********************************************************************
MAP
END !map

!DynRef &STRING
DynRef &CSTRING
CELL GROUP,DIM(1),OVER(DynRef)
x real
y REAL
z REAL
osv REAL
iterF REAL
END

CODE

N# = 3 !Кол-во элементов
DynRef &= NEW(CSTRING((N# * SIZE(CELL)+1))) !Выделяем память
loop i#=1 to N#
CELL[i#].x = i#+0.1
CELL[i#].y = i#+0.2
CELL[i#].z = i#+0.3
CELL[i#].osv = i#+0.4
CELL[i#].iterF = i#+0.5
end
k# = 3
message(CELL[k#].x &' '& CELL[k#].y&' '&CELL[k#].z&' '&CELL[k#].osv&' '&CELL[k#].iterF)
DISPOSE(DynRef)
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сообщение Admin »

Проблема в том что в качестве гостя сюда мог заходить не только ты но и куча СПАМЕРОВ :-\
Так что селяви...
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

DynRef &CSTRING
CELL GROUP,DIM(1),OVER(DynRef)
супер, особенно dim(1) :)
Mit

Сообщение Mit »

To Admin
Все понял...Согласен...
To Александр
Рад, если чем-то помог

С уважением, Mit
Ответить