equate / equate !== equate ? wtf?

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Hello, All!

А как бы замечательной кларе объяснить сабж, а именно:

ругается на:
const:TranslitTableSize equate(size(mod:tmp:translitPairs) / size(type:translitPair))
хотя могла бы и не ругаться, размеры всех структур в точке объявления известны.

mod:TranslitTable like(type:translitPair), dim(const:TranslitTableSize), over(mod:tmp:translitPairs)

Альтернативный вопрос: как в кларе объявить и инициализировать массив, при этом глазами не пересчитывая количество его элементов?

--
Best regards,
Maxim Yemelyanov,
Enigma Soft Company
phone: (057) 2177977,759072(3!4)
WEB: http://enigmasoft.com.ua
e-mail: maxim@enigmasoft.com.ua
ICQ: 12253836

(Добавление)

Используй ConstantClass из клариной поставики
Альтернативный вопрос: как в кларе объявить и инициализировать массив, при этом глазами не пересчитывая количество его элементов?
???

Best regards,
Andrew Listiev
Work mailto:andrewl@inbox.lv
Home mailto:gidravlic@mhm.lv
ICQ UID: 169357390
MS Messenger: werdna_werdna@hotmail.com
Используй ConstantClass из клариной поставики
Брр... жуть какая. Нет, мне нужно нечто более простое.
???
Показываю:

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

Type:SomeStruct   group,Type
Foo               Long
Bar               String(20)
                  end

MyArray_inited    Group
    Long(1)
    String('this is an array    ')
    Long(2)
    String('initialized in      ')
    Long(122)
    String('very perverted way  ')
    Long(666)
    String('but we can do nothin')
    Long(667)
    String('cos os warped syntax')
    Long(667)
    String('of clarion :(((     ')
                  end

MyArray    Like(Type:SomeStruct), Over(MyArray_inited), Dim(???)
                                                что здесь?  ^^^
Если у меня элементов массива переваливает за сотню, то становится лень считать их глазами и прописывать число в DIM. Хочу, чтобы компилятор это сам сделал.
Но компилятор видимо не понимает, чего от него хотят.

Хотелось бы как в си:

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

Type_SomeStruct MyArray[]={
    {1, this is an array" },
    {2, "initialized in" },
    {122, "very perverted way" },
    {666, "but we can do nothin" },
    {667, "cos os warped syntax" },
    {667, "of clarion :(((" }
};

#define MyArray_size = sizeof(MyArray)/sizeof(Type_SomeStruct)
А вот клара аналогичный equate не хавает ;-(

--
Best regards,
Maxim Yemelyanov

Dim(1), снимаешь контроль за индексами и считаешь размер в рантайм.

WBR, Nick Tsigouro mailto:nick@arsis.ru
Брр... жуть какая. Нет, мне нужно нечто более простое.
Сделай попроще :)
#define MyArray_size = sizeof(MyArray)/sizeof(Type_SomeStruct)
Да, сие есть проблема. Можно так:

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

SomeProcedure Procedure(Count Long)
MyArray    Like(Type:SomeStruct), Over(MyArray_inited), Dim(Count)
           Code
   ...
Вызов SomeProcedure(Size(MyArray_inited)/Size(Type_SomeStruct))

Хотя конечно же геморрно :(

Best regards,
Andrew Listiev

Копилятор тупой! Сам недавно столкнулся с похожей ситуацией.

A EQUATE(4 + 2) - понимает
B EQUATE(4 * 2) - понимает
С EQUATE(4 * 0.5) - понимает
D EQUATE(4 / 2) - не понимает!!!!!

С уважением, Ставич Олег
Укрсиббанк г.Харьков
oldstav@ukrsibbank.com

Написал: ClaList(2)
Гость

Сообщение Гость »

А откуда вы взяли, что он арифметику понимать должен? По доке там только константа.

WBR, Nick Tsigouro mailto:nick@arsis.ru

(Добавление)

Судя по всему у него серьезные проблемы с делением. Кстати он еще много чего не понимает....

Например конструкция SIZE(LONG) вызывает у него серьезное замешательство.

OldStav

Судя по всему у него серьезные проблемы с делением

А можно конкретно?

Например конструкция SIZE(LONG) вызывает у него серьезное замешательство.


А LONG это variable, constant или picture?

WBR, Nick Tsigouro

(Добавление)

LONG - это тип переменной, и я хочу знать без ее объявления, сколько она жрет памяти.

С уважением, Ставич Олег
Написал: ClaList(2)
Гость

Сообщение Гость »

Это то я догадался, а вот ты догадался доку посмотреть, что можно писать в параметре SIZE()

WBR, Nick Tsigouro

А ты как думаешь???? Потому и был несколько разочарован....
Получается для того, что бы определить размер типа в памяти приходится объявлять переменную. Корявенько получается. На тех же сях SIZEOF() такую конструкцию воспринимает адекватно.

С уважением, Ставич Олег
Написал: ClaList(2)
Гость

Сообщение Гость »

А ты как думаешь???? Потому и был несколько разочарован....
Тем, что через Size() нельзя узнать длину LONG-а? Мне бы ваши заботы.
Получается для того, что бы определить размер типа в памяти приходится объявлять переменную. Корявенько получается.
Ты хочешь скзать, что если ты определил свой тип:

MyType ...,Type

, то size(MyType) не сработает? Что-то я сильно сомневаюсь.

WBR, Nick Tsigouro

Да сработает конечно. Но это через Ж:

Кстати вот еще неприятный момент.

SIZEBUFFER EQUATE(16000)
BufferStr STRING(SIZEBUFFER)

Требуется определить массивы, например:

BufferShort SHORT,OVER(BufferStr),DIM(DimShort)
BufferLONG LONG,OVER(BufferStr),DIM(DimLong)

так, чтобы BufferShort и BufferLONG имели размер в точности BufferStr. При этом значение SIZEBUFFER - разработчику не известо, только спецификация имени переменной. Подскажите че делать??

tLONG LONG,TYPE
EQUATE(SIZEBUFFER / SIZE(tLONG)) - не работает деление

С уважением, Ставич Олег

Если SIZEBUFFER - EUQATE(16000), то что мешает завести SIZEBUFFER_LONG EQUATE(4000)

Если же размер BufferStr определяется в рантайм, то Николай Цигуро уже ответил: объявляем массив размерностью 1, отключаем контроль за выходом за пределы массива (прям как в C++ :)) и спокойно работаем.

Дык об чем сыр-бор?

Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)

О том что значение SIZEBUFFER НЕ ИЗВЕСТНО. Кроме того нужно знать размер OVER массивов.

С уважением, Ставич Олег
BufferShort SHORT,OVER(BufferStr),DIM(DimShort)

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

BufferShort    SHORT,OVER(BufferStr),DIM(1)
BufferLONG LONG,OVER(BufferStr),DIM(DimLong)

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

BufferLONG   LONG,OVER(BufferStr),DIM(1)

  Code
  DimShort = SIZEBUFFER/Size(BufferShort[1])
  DimLong = SIZEBUFFER/Size(BufferLONG[1])

  Loop i# = 1 to DimShort
    DimShort[i#] = ...
  end

  Loop i# = 1 to DimLong
    BufferLONG[i#] = ...
  end
Nick Tsigouro
Написал: ClaList(2)
Ответить