Привет всем!
Как динамически создать массив? Вроде где-то инфа проходила, но не нашел...
Динамическое создание массива
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Andrew Listiev
- Активист
- Сообщения: 166
- Зарегистрирован: 07 Июль 2005, 11:16
- Откуда: Латвия, Рига
Если вы имеете в виду создание массива через оператор New, то увы, никак. Можно немного схитрить и использовать дополнительную процедуру:
CreateArray Procedure(Long ArrayLength)
MyArray String(16), Dim(ArrayLength)
Code
!
! Далее стандартно работаем с массивом
!
Я давно отказался от использования массивов, заменив подход использованием очереди:
MyArray Queue
Element Long
End
CreateArray Procedure(Long ArrayLength)
MyArray String(16), Dim(ArrayLength)
Code
!
! Далее стандартно работаем с массивом
!
Я давно отказался от использования массивов, заменив подход использованием очереди:
MyArray Queue
Element Long
End
Всем привет!
Эх, раньше было демократичней, мог войти в качестве Гостя,
а сейчас нужно регистрироваться!
Простите, год отключен от Клариона, может ляпну что-либо невпопад.
В свое время подумал, что 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)
Эх, раньше было демократичней, мог войти в качестве Гостя,
а сейчас нужно регистрироваться!
Простите, год отключен от Клариона, может ляпну что-либо невпопад.
В свое время подумал, что 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)