Символьный тип переменной (какой выбрать)

Предыдущая тема Следующая тема Перейти вниз

Символьный тип переменной (какой выбрать)

Сообщение  Bagamut в Сб Янв 22, 2011 8:09 pm

Доброго времени суток.

Есть один сильно мучащий вопрос, а именно какой символьный тип выбрать. Есть библиотека (dll), написанная на С++, там функция в качестве параметра принимает символьную переменную типа "const char", которая занимает 4 байта. Вопрос в следующем, какой тип символьных переменных в FreeBasic (string, zstring или wstring) соответствует 4 байтовому типу const char в C++?
avatar
Bagamut

Сообщения : 10
Дата регистрации : 2010-05-14
Возраст : 28
Откуда : Мурманск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  Саня в Сб Янв 22, 2011 9:58 pm

блин, не знаю, а char для уникода используется? и она платформо-зависима? если это так, то wstring. Если стреть по мануалу, то для линукса( скорей всего и прочих никсов) wstring занимает 4 байта, для винды - 2, а для доса 1, но там никакого уникода не получится - будет вести себя как zstring.
Zstring занимает 1 байт/символ и сделан примерно как строки в С. String не более чем класс-оболочка для zstring и, соответственно, также без уникода размер 1 байт/сим., то есть паааалюбому не подойдет.
В качестве самого тупого и наипоследнейшего варианта - это применить uinteger, но будет вообще весело Mad No alien
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  Bagamut в Сб Янв 22, 2011 10:52 pm

Саня пишет:блин, не знаю, а char для уникода используется? и она платформо-зависима? если это так, то wstring. Если стреть по мануалу, то для линукса( скорей всего и прочих никсов) wstring занимает 4 байта, для винды - 2, а для доса 1, но там никакого уникода не получится - будет вести себя как zstring.
Zstring занимает 1 байт/символ и сделан примерно как строки в С. String не более чем класс-оболочка для zstring и, соответственно, также без уникода размер 1 байт/сим., то есть паааалюбому не подойдет.
В качестве самого тупого и наипоследнейшего варианта - это применить uinteger, но будет вообще весело Mad No alien
Целевая платформа - это Windows 32 bit, по возможности 64 bit тоже. В добавок к первому посту, забыл пояснить, определить наиболее подходящий тип необходимо для объявляемой функции.
avatar
Bagamut

Сообщения : 10
Дата регистрации : 2010-05-14
Возраст : 28
Откуда : Мурманск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  Саня в Вс Янв 23, 2011 2:34 pm

судя по всему, это был не тип char, а wchar_t, я по codepad - у проверил. и по вики для винды размер равен 2 байтам, и для уникода, следовательно, надо использовать wstring Smile , усё.
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  Bagamut в Вс Янв 23, 2011 3:53 pm

Саня пишет:судя по всему, это был не тип char, а wchar_t, я по codepad - у проверил. и по вики для винды размер равен 2 байтам, и для уникода, следовательно, надо использовать wstring Smile , усё.
Wstring здесь подходит больше всего, хоть и занимает 2 байта. Поясню, почему вообще возник такой вопрос. Функция в моей DLL, использует "соглашение вызова" stdcall, и принимает один параметр, для никого не секрет что, если открыть dll и посмотреть экспортированные функции какой-либо утилитой, к примеру, depends, то после названия функции идет символ @, а за ним число, показывающее количество байт, занимаемых параметрами этой функции, у меня утилита показала 4 байта, соответственно и возник такой вопрос какой тип лучше использовать, так как заврапленная функция работает и с wstring и с zstring.
avatar
Bagamut

Сообщения : 10
Дата регистрации : 2010-05-14
Возраст : 28
Откуда : Мурманск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  DiG. GeRR в Вс Янв 23, 2011 8:28 pm

Вообще-то в библиотеке скорее всего использовался стандартный wchar_t (двухбайтовый), так как четырехбайтового wchar_t под виндой обычно не бывает. А число 4 после имени функции стоит потому, что в 32-х битных процессорах через стек передается кратное 4 количество байт - даже если переменная занимает всего один байт, она расширяется инструкцией push до четырех.

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  Bagamut в Вс Янв 23, 2011 8:48 pm

DiG. GeRR пишет:Вообще-то в библиотеке скорее всего использовался стандартный wchar_t (двухбайтовый), так как четырехбайтового wchar_t под виндой обычно не бывает. А число 4 после имени функции стоит потому, что в 32-х битных процессорах через стек передается кратное 4 количество байт - даже если переменная занимает всего один байт, она расширяется инструкцией push до четырех.
Спасибо, это как раз то, что я хотел знать. Тему можно закрывать.
avatar
Bagamut

Сообщения : 10
Дата регистрации : 2010-05-14
Возраст : 28
Откуда : Мурманск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  VerhoLom в Чт Янв 27, 2011 3:26 pm

Bagamut пишет:Доброго времени суток.

Есть один сильно мучащий вопрос, а именно какой символьный тип выбрать. Есть библиотека (dll), написанная на С++, там функция в качестве параметра принимает символьную переменную типа "const char", которая занимает 4 байта. Вопрос в следующем, какой тип символьных переменных в FreeBasic (string, zstring или wstring) соответствует 4 байтовому типу const char в C++?

Не, сяшная функция принимает не const char, а (const char *), что является указателем на набор 8 битных символов (с \0 в конце) с запретом редактирования, что, если верить мануалу ФБ, соответствует константному типу ZString ptr (или, при желании, ANY PTR - что обойдется дешевле в плане работы с памятью/перекодированием). Все w_char'ы - это указатели на набор символов в WIDE-кодировке, т. е. каждый занимает по 2 байта. В сяшных функциях со строками работают только с указателями (как, впрочем, и с любым языком). bounce
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  VerhoLom в Чт Янв 27, 2011 3:38 pm

Саня пишет:блин, не знаю, а char для уникода используется? и она платформо-зависима? если это так, то wstring. Если стреть по мануалу, то для линукса( скорей всего и прочих никсов) wstring занимает 4 байта, для винды - 2, а для доса 1, но там никакого уникода не получится - будет вести себя как zstring.
Zstring занимает 1 байт/символ и сделан примерно как строки в С. String не более чем класс-оболочка для zstring и, соответственно, также без уникода размер 1 байт/сим., то есть паааалюбому не подойдет.
В качестве самого тупого и наипоследнейшего варианта - это применить uinteger, но будет вообще весело Mad No alien

Юникод можно хранить где угодно - вопрос в том, как с ним работать. Если функция требует буфер юникод-символов (wide, w_char), то из ФБ разумно будет передать WSTRING PTR, под который предварительно надо выделить память (либо локальную переменную, dim buf as wstring*1024), либо так: передать указатель на ZSTRING (dim buf as zstring*2048, либо dim buf as zstring ptr=allocate(sizeof(wstring)*1024), или размер посчитать в уме). Надо помнить, что натив-апи функции (NTDLL) часто принимают именно ЮНИКОД-строку, которая не есть набор на буфер с wide-символами, это структура, выглядит где-то так:

Type UNICODE_STRING
as USHORT _len, _maxLen
as WString ptr _buf
End Type

PS: WString - всегда набор 2-байтовых символов. Указатели - другое дело.
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  VerhoLom в Пн Янв 31, 2011 2:05 pm

И еще: откомпилируйте любое простейшее приложение с ключем -r -gen gcc и найдите в папке созданный *.с файл: ФБ вначале файла поместит сяшное определение всех своих типов. Занимательное зрелище.

Хотя с таким подходом не мешало бы создать в ФБ конструкцию типа:
Код:
GCC
...
End GCC

или чтото похожее. Есть же генератор ГАСа и соответствующая интрукция есть: asm...end asm. Почему бы для Си такого не сделать... Rolling Eyes
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  Саня в Пн Янв 31, 2011 4:20 pm

по-мойму нафиг, asm..end asm есть, т.к. компилер переводит на ассемблер и потом передает управление gas-у, следовательно, асмовские вставки можно сразу же вставлять в объектный модуль, практически не проверяя.. а для Си ет нужно дополительно компилятор встраивать, и получится, что вместо компилятора для одного языка, нужно писать ещё один для этой вот фичи - честно, чо то не хочется Sad Да и вообще, хочется С? пишите на нем, а не на фрибе тогда. Если нужно вместе соединить код на си и на фри, статические и динамические либы в помощь, имхо.
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  Bagamut в Пн Янв 31, 2011 5:19 pm

Саня пишет:Если нужно вместе соединить код на си и на фри, статические и динамические либы в помощь, имхо.
Есть еще более простой способ - перейти на BCX (basic to c translator). Там есть поддержка и C и C++ и ASM, даже ООП поддерживается.
avatar
Bagamut

Сообщения : 10
Дата регистрации : 2010-05-14
Возраст : 28
Откуда : Мурманск

Посмотреть профиль

Вернуться к началу Перейти вниз

Прошу прощения за нецензурщину...

Сообщение  VerhoLom в Чт Фев 03, 2011 4:04 pm

Саня пишет:по-мойму нафиг, asm..end asm есть, т.к. компилер переводит на ассемблер и потом передает управление gas-у, следовательно, асмовские вставки можно сразу же вставлять в объектный модуль, практически не проверяя.. а для Си ет нужно дополительно компилятор встраивать, и получится, что вместо компилятора для одного языка, нужно писать ещё один для этой вот фичи - честно, чо то не хочется Sad

Компилятор для Си уже есть - это gcc. ФБ пытается откомпилировать с его помощью созданные си-файлы. В ФБ, в принципе, все уже добавлено. Попытайтесь откомпилировать любую прогу так:

Код:
fbc -gen gcc -s gui file.bas

(ну или какой проект будет) и получите сообщение о недоступности файла gcc.exe. Повторюсь: все уже есть, нету только соответствующей кодогенератору встроенной инструкции языка. Было бы занимательно посмотреть на результат работы (и сравнить) программ, откомпилировпанных с ключом "-gen gcc" и "-gen gas " (работает по-умолчанию). Да и если есть кодогенератор, почему бы не дать возможность напрямую вставлять код на его языке в программу, как это сделано с ассемблером? Зачем тогда было добавлять поддержку еще одного языка на выходе?

По поводу:
Саня пишет:Да и вообще, хочется С? пишите на нем, а не на фрибе тогда. Если нужно вместе соединить код на си и на фри, статические и динамические либы в помощь, имхо
скажу так: надо развивать фактически встроенные в язык средства и не забывать, что ФБ - это не компилятор, это - транслятор в код на ассемблере (теперь и на Си, т. е. ГЦЦ). ФБ, по заявлениям авторов, стремится к включению в пакет GCC (есть же там ADA, Fortran, C++, Жаба pig ). Отсюда и развитие языка и включение в него новых возможностей.

Иметь кодогенератор на Си и не дать возможность включать в код сяшные вставки - это pig pig pig !
Да и с такими рассуждениями всех нас постигнет судьба дельфийских программистов (поверьте, я с этим гавенным людом сталкивался по работе и не дай Бог самому так): народ сидит на непонятно кем написанных классах и не в курсе, как это все работает изнутри... А вот ФБ-программеры в курсе! Я надеюсь... cyclops

А вообще, я люблю ФБ! Basketball Просто хочется развиваться и знать что-то еще... В знании сила! Сейчас вон пытаюсь прикрутить ГЦЦ к Фб, но, п...дла, выдает ошибку создания процесса из самого gcc.exe...
Учиться! Учиться! Учиться!
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  Саня в Чт Фев 03, 2011 6:22 pm


. Да и если есть кодогенератор, почему бы не дать возможность напрямую вставлять код на его языке в программу, как это сделано с ассемблером? Зачем тогда было добавлять поддержку еще одного языка на выходе?
Хех, тут не в кодогенераторе дело.. Кодогенератор это по сути функция( -ии, скорееSmile ), которой на вход подается программа в промежуточном виде, не ввиде текста, а на выходе появляется эта же прога на другом языке, либо екзешник. Кодогенератор, фактически, работает с промежуточным представлением. А чтобы получилось это представление проги нужно, чтоб до этого лексер разобрал прогу на токены, а парсер представил её в пром.виде. Как следствие, даже для асмовских вставок, нужно чтоб лексер его мог разобрать, а парсер мог это представить в пром. виде, и сделать статические проверки...Как пример можно привести такую прогу:
Код:

 dim i as uinteger = 9
  dim j as integer
 asm
      mov eax, [ i ]
      mov [ j ], eax
end asm
print j
end
Если посмотреть в откомпилированном виде, то скорее всего увидите вместо вставки чо нидь подобное:
Код:

  mov eax, [ ebp - ... ]
  mov [ ebp - .... ], eax
 
Если поставить -gen gcc, то помойму асмовставка практичски не изменится - так же будет "mov eax, [ i ]" А может и нет Smile Поэтому даже для асма у парсера есть функции для разбора inline-asm. И соответственно для сишных вставок тоже должны быть:
Код:

  ' Пусть есть этот самый GCC ... END GCC
      Gcc
          #include <stdio.h>
          int i = 4373;      /* 1 */
          printf( "%d", i);
    End Gcc               
      for i = i to 9000
            ? i
      next
Даже для этой проги нельзя без парсера для Си, т.к. тогда непонятно будет где объявлена ' i '( а чтоб этого не произошло нужно чтоб переменная i была в таблице имен, а это уже делает парсер). Эт раз. Во вторых, если парсер( и лексер, и ваще front-end часть компилера) разбирает нескоко языков программирования( а вдруг alien ) и создает подобные деревья разбора, всм промеж. вид, а нескоко кодогенераторов генерируют разные коды( к примеру для разных платформ ), то для каждого из начальных язык компилер может создать разный код для разных платформ или для одной и тойже, и тогда можно попытаться сделать вставки одного или нескольких языков в другой( -ие). тогда можно. и кодогенератор тут будет ни причем.

Зачем тогда было добавлять поддержку еще одного языка на выходе?
ну, судя по ману,

-gen gcc

The compiler will emit C code to a .c file which will then be compiled to an object file using 'gcc' as a high level assembler. Note: the C emitter is a work in progress, incomplete, and certainly not bug free. However, the goal of the C emitter (when complete) will be to make porting FreeBASIC compiled programs (and fbc itself) to other platforms.
.

А вообще, я люблю ФБ! Просто хочется развиваться и знать что-то еще... В знании сила!

Учиться! Учиться! Учиться!
+ 100500 Very Happy
ЗЫ: может быть всё выше сказанное - это просто тупой бред.
ЗЗЫ: Помойму мы уже достаточно на оффтопили, может перенести это в отдельный тред, а? Smile
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  VerhoLom в Вт Фев 08, 2011 1:27 pm

Ладно, все-равно не переспорим (ся)! lol! afro afro afro
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Символьный тип переменной (какой выбрать)

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения