Вы здесь

Си и CA-Visual Objects: соответствие типов данных

Перевод

Время от времени, при программировании на CA-Visual Objects, приходится обращаться к наработкам, сделанных на других языках, в частности на Си. И здесь очень важно точно понимать не только синтаксис, но соответствие типов данных. Как правило, уже на этом, многие спотыкаются.

Эта статья позволит программистам CA-Visual Objects чуть глубже понять этот вопрос и решить некоторые проблемы при переносе (или использовании) кода на Си (или ему подобных языков) в среду CA-VO.

 

Не буду рассказывать, как я собрал данные и свёл их в нижеуказанную таблицу. Скажу просто – методом соотнесения диапазонов данных. Если кто-то что-то захочет добавить, то «милости просим», буду только рад. Как говорилось в мультфильме «Про барана и козла», где они собирались делать холодец: «Ну, тут собственно то, которое это…»

 

 

Си

Диапазон значений типа данных Си

CA-Visual Objects

 

unsigned char

0 ... 255

BYTE

 

BYTE

0 ... 255

BYTE

 

 

 

 

 

signed char

-128 ... 127

SHORT, SHORTINT

 

char

-128 ... 127

SHORT, SHORTINT

 

 

 

 

 

unsigned SHORT INT

0 ... 65535

WORD

 

unsigned SHORT

0 ... 65535

WORD

 

WORD

0 ... 65535

WORD

 

 

 

 

 

signed SHORT INT

-32768 ... 32767

SHORT, SHORTINT

 

SHORT

-32768 ... 32767

SHORT, SHORTINT

 

 

 

 

*

unsigned INT

0 ... 4294967295

DWORD

 

 

 

 

*

signed INT

-2147483648 ... 2147483647

INT

*

INT

-2147483648 ... 2147483647

INT

 

 

 

 

 

unsigned LONG INT

0 ... 4294967295

DWORD

 

unsigned LONG

0 ... 4294967295

DWORD

 

DWORD

0 ... 4294967295

DWORD

 

 

 

 

 

signed LONG

-2147483648 ... 2147483647

LONG, LONGINT

 

LONG

-2147483648 ... 2147483647

LONG, LONGINT

 

 

 

 

**

unsigned LONG LONG

0 ... 18446744073709551615

не используется

 

 

 

 

**

signed LONG LONG

-9223372036854775808 ... 9223372036854775807

не используется

**

LONG LONG

-9223372036854775808 ... 9223372036854775807

не используется

 

 

 

 

***

FLOAT

+/- 3.4 * 10+/-38

REAL4

***

double

+/- 1.7 * 10+/-308

REAL8

***

LONG double

+/- 1.2 * 10+/-4932

FLOAT

 
*INT:

в 16-разрядной среде соответствует SHORT INT (-32768 ... 32767),

а в 32-разрядной – LONG INT (-2147483648 ... 2147483647)

 

**LONG LONG:

в CA-Visual Objects прямого соответствия нет, но вопрос использования такого типа данных решается с помощью использования структур.

 

*** REAL4, REAL8, FLOAT:

в CA-Visual Objects имеют точность 1017

 

 

 

В CA-Visual Objects так же, как и в Си используются указатели. В CA-Visual Objects есть два типа указателей: PTR и PSZ. В общем случае используется PTR, а PSZ – это указатель на строку с нулём в конце (0x00). Поэтому, все указатели из Си можно переводить как PTR. Но…

 

Конечно, более правильно всё-таки переводить указатели как-то обдуманней…

Например: «unsigned char * abc» можно перевести как «abc AS PTR», а если подумать? Unsigned char – это BYTE, поэтому точнее будет: «abc AS BYTE PTR».

Идём дальше: «dword *abc» => «abc AS DWORD PTR». Вот теперь порядок!

 

Есть, правда частный случай: «char * abc» => «abc AS PSZ». Вот оно наше «PSZ»!

 

Массивы из Си практически совпадают с тем, как они определяются в CA-Visual Objects. Так же совпадают структуры. Но, с объявлением структур в CA-Visual Objects есть свои нюансы. А именно: если в Си на структуру нет указателя, то она объявляется как «IS», а если на неё есть указатель, то как «AS».

 

Пример:

Си                 charset_info_st        *charset

                                 MYSQL_FIELD         fields

 

CA-VO           CharSet AS charset_info_st

                                             Fields IS MYSQL_FIELD

 

Замечание. Вы спросите: но ведь можно же, всё-таки, объявлять структуры как «AS»? Можно. Но только локально. При этом, чтобы её правильно использовать, придётся сначала под неё выделить память, заполнить и дать ссылку (всё равно ссылка!), а потом ещё и убрать за собой (FreeMem). Так что, оно того не стоит…

 

Ещё одно интересное замечание. Вот пример:

 

typedef struct tagNCCALCSIZE_PARAMS {

  RECT       rgrc[3];

  PWINDOWPOS lppos;

} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;

 

где вроде бы надо в CA-VO писать так:

            MEMBER lppos IS _PWINDOWPOS

 

но PWINDOWPOS - это указатель на структуру WINDOWPOS, поэтому

            MEMBER lppos AS _WINDOWPOS

 

В Си много таких приколов, поэтому при переводе – будьте внимательны!

 

 

Данная статья появилась благодаря моему тесному общению с Александром Беловым (г.Рига). Низкий ему поклон за то, что он меня сподвигнул на изучение этой темы, которая в дальнейшем мне очень помогла. Большое ему спасибо!

 

03.03.2012 г.   Карандаш.

 

Комментарии

Хотелось бы позаимствовать эту статью и опубликовать у себя на блоге. Разумеется, будет ссылка на ваш сайт.

Не возражаем. Будем рады.

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer