English
Русский
Время от времени, при программировании на 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 |
в 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
Комментарии
Здравствуйте!
Хотелось бы позаимствовать эту статью и опубликовать у себя на блоге. Разумеется, будет ссылка на ваш сайт.
Заимствуйте :))