Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.04;
Скачать: CL | DM;

Вниз

Помогите преобразовать процедуру из С в паскаль:   Найти похожие ветки 

 
greenrul ©   (2003-07-19 13:23) [0]

Эта процедура преобразует строку в латинской кодировке в юникодный UInt16. Дело в том, что у меня есть процедура, которая рисует на видео поверхности текст а русский текст рисуется только в Юникоде, вот и хочется портировать процедурку под freepascal

static Uint16 *LATIN1_to_UNICODE(Uint16 *unicode, const char *text, int len)
{
int i;

for ( i=0; i < len; ++i ) {
unicode[i] = ((const unsigned char *)text)[i];
}
unicode[i] = 0;

return unicode;
}


 
Набережных С. ©   (2003-07-19 14:02) [1]

function LATIN1_to_UNICODE(const s: string): WideString;
begin
Result:=s;
end;


 
greenrul ©   (2003-07-19 14:07) [2]

не смешно...
во-первых работать не будет, а во вторых мне на выходе нужен именно UInt16 а не WideString


 
Palladin ©   (2003-07-19 14:15) [3]

а ты знаешь что такое UInt16 * ?


 
Набережных С. ©   (2003-07-19 14:24) [4]

>greenrul © (19.07.03 14:07)
>не смешно...

Действительно не смешно - печально


 
Marser ©   (2003-07-19 15:32) [5]


> greenrul ©

UINT16 это числовой тип, в Си нет жесткого контроля как в Паскале. Если для ANSI достаточно целого в один байт, то для Unicode нужно два. Uint16 означает Unsigned Int длиной 16 бит, то есть родной паскалистам Word. Соответственно, Uint16*(Си) = ^Word(Паскаль), хотя может (как в данном случае) указывать на динамический массив. Так что, естественно, получить результат в Uint16 не получится :-)


 
greenrul ©   (2003-07-19 18:05) [6]

но если результат требуется именно в UInt16?


 
Palladin ©   (2003-07-19 18:23) [7]

ты значек * видишь или нет?
ты Marser читал или нет?

Кому они нужны эти UInt16? Указатель нужен а не UInt16...


 
Marser ©   (2003-07-19 18:24) [8]


> greenrul © (19.07.03 18:05)
> но если результат требуется именно в UInt16?

Ты идиот или прикидываешся?! Какой к Карлу Марксу Uint16?


 
Набережных С. ©   (2003-07-19 19:18) [9]

>greenrul © (19.07.03 18:05)

Пытаться перевести "один в один" сишный код на паскаль нерационально, а иногда и невозможно. Нужно понять суть и реализовать то же самое средствами паскаля. Тебе нужно конвертировать Ansi в Unicode, т.е. паскалевский AnsiString в паскалевский WideString. Пример Набережных С. © (19.07.03 14:02) прекрасно с этим справится. Но и функция тебе не нужна. Достаточно переменной типа WideString присвоить значение переменной или константы типа AnsiString, остальное сделает за тебя компилятор.


 
greenrul ©   (2003-07-19 20:08) [10]

Я извиняюсь, я пока в паскале новичок и указатели в целом не прошел, но...

во-первых пример Набережных С. как я уже сказал не работает, ибо речь идет не о дельфи а о паскале. Во-вторых вот код самой функции которая требует UInt16, а вовсе не указатель -
function TTF_RenderUNICODE_Solid( font : PTTF_Font;
const text :Uint16; fg : TSDL_Color ): PSDL_Surface; cdecl;


Еще раз извините за мои скромные знания, но второй день мучаюсь - никак не получается


 
greenrul ©   (2003-07-19 20:13) [11]

var s:string;
Dest:^PWideChar;

begin
dest:=Btn.caption; {Error: Incompatible types: got "ANSISTRING" expected "^PWIDECHAR"}
..:=TTF_RenderUnicode_Solid(.., dest,..); {Error: Incompatible type for arg no. 2: Got ^PWIDECHAR, expected WORD}
end;


 
Palladin ©   (2003-07-19 20:24) [12]


> ибо речь идет не о дельфи а о паскале

угу, речь идет не о масле а о масле...


> function TTF_RenderUNICODE_Solid( font : PTTF_Font;
> const text :Uint16; fg : TSDL_Color ): PSDL_Surface; cdecl;

ты не ошибся?


 
greenrul ©   (2003-07-19 20:26) [13]

нет, но мог ошибиться человек, который писал эту функцию, т.к. пользуется ей мало кто.


> угу, речь идет не о масле а о масле...

не компилируется


 
Набережных С. ©   (2003-07-19 20:57) [14]

function MultiByteToWideChar(CodePage, Flags: Integer; MBStr: PChar;
MBCount: Integer; WCStr: PWideChar; WCCount: Integer): Integer; stdcall;
external "kernel32.dll" name "MultiByteToWideChar";

function LATIN1_to_UNICODE(unicode: PWord; text: PChar; len: integer): PWord;
begin
MultiByteToWideChar(CP_ACP, 0, text, len, PWideChar(unicode), len);
Result:=unicode;
end;



 
greenrul ©   (2003-07-20 01:09) [15]

Спасибо, Набережных С., это компилируется, но как передать в фукцию text который описывается как
function TTF_RenderUNICODE_Solid( ...; const text :Uint16; ... ): ...;


 
Набережных С. ©   (2003-07-20 04:50) [16]

Text: PWord;
TTF_RenderUNICODE_Solid( ..., text^, ... ):

А в предыдущую последней строкой добавь
Inc(unicode, len); unicode^:=0;


 
greenrul ©   (2003-07-20 11:17) [17]

Последний вопрос (компилится но не работает) -

function LATIN1_to_UNICODE(unicode: PWord; text: PChar; len: integer): PWord;
begin
MultiByteToWideChar(CP_ACP, 0, text, len, @PWideChar(unicode), len);
Result:=unicode;
Inc(unicode, len); unicode^:=0;
end;

txt:=LATIN1_to_UNICODE(txt,PChar(Btn.caption), SizeOf(Btn.caption));
srf:=TTF_RenderUnicode_Solid(font,txt^,forecol);



Я правильно все сделал? особенно не уверен по поводу SizeOf(Btn.caption)


 
greenrul ©   (2003-07-20 11:20) [18]

sorry, вместо

Result:=unicode;
Inc(unicode, len); unicode^:=0;


пишу

Inc(unicode, len); unicode^:=0;
Result:=unicode;


но проблема остается


 
Романов Р.В. ©   (2003-07-20 11:26) [19]

Length(Btn.caption)


 
greenrul ©   (2003-07-20 18:55) [20]

Умирает при unicode^:=0;, если его закоментировать то вылетает Acess Violation после любого обращения к text после LATIN1_to_UNICODE.

Код:

function LATIN1_to_UNICODE(unicode: PWord; text: PChar; len: integer): PWord;
begin
MultiByteToWideChar(CP_ACP, 0, text, len, @PWideChar(unicode), len);
writeln("1");
writeln("2");
Result:=unicode;
Inc(unicode, len);{ unicode^:=0;}
end;

procedure DoSmth(...):...;
var txt:PWord;
a:PChar;
begin
a:="АбВ";
txt:=LATIN1_to_UNICODE(txt,a,Length(a));
srf:=TTF_RenderUnicode_Solid(font,txt^,forecol); {ТУТ умирает}
end;


 
greenrul ©   (2003-07-21 11:28) [21]

plz Help!


 
Fay   (2003-07-21 13:36) [22]

2greenrul
Почту смотрел?


 
greenrul ©   (2003-07-21 14:54) [23]

смотрел, но ничего пока не получил.
можешь сюда кинуть?


 
Набережных С. ©   (2003-07-21 16:17) [24]

1)@PWideChar(unicode) - откуда ты взял этот бред?
2)Кто будет память под буфер выделять?


 
greenrul ©   (2003-07-21 16:21) [25]

1) .., PWideChar(unicode),..
Error: Incompatible type for arg no. 5: Got PWIDECHAR, expected LPWSTR

2) можно пример в коде - я мало понимаю в выделении памяти и пр.


 
icWasya ©   (2003-07-21 16:31) [26]

function LATIN1_to_UNICODE(unicode: PWord; text: PChar; len: integer): PWord;
begin
MultiByteToWideChar(CP_ACP, 0, text, len, @PWideChar(unicode), len *2);
writeln("1");
writeln("2");
Result:=unicode;
Inc(unicode, len);{ unicode^:=0;}
end;



 
Набережных С. ©   (2003-07-21 16:43) [27]

>я мало понимаю в выделении памяти и пр.
Тогда бросай это дело, пока не будешь хоть чуть-чуть понимать. Про выделение памяти в этом форуме едва ли не каждый день по несколько веток. И я понятия не имею, какие еще чудеса творятся в этом freepsacal

>icWasya © (21.07.03 16:31)

"Поздравляю Вас соврамши" (c)М. Булгаков.


 
greenrul ©   (2003-07-22 01:53) [28]


> Тогда бросай это дело, пока не будешь хоть чуть-чуть понимать.
>

Так и вообще программирование можно забросить. Понимают учась. Если не можете помочь так и скажите. Форум ведь для помощи создан.


 
Набережных С. ©   (2003-07-22 05:02) [29]

>greenrul © (22.07.03 01:53)

Да ты не обижайся. Не понимая основ работы с указателями и динамической памятью, портировать из Си - безнадежное дело. Так и будешь на каждом шаге спотыкаться. Вон, тебе сколько долдонили, что не нужен тебе в паскале UInt16 - и что толку? Понял ты что-нибудь? Нихрена. Или вот PWIDECHAR - LPWSTR, то же самое. Не понимаешь сути и сделать ничего не можешь, только народ смешишь. Ну дал я тебе код и что? Помог он тебе? Уж сколько долдонили, что без понимания сути указателей примеры не помогут - все без толку. Поищи какую-нибудь старую книжку по Паскалю и как следует разберись с указателями, тогда и сам справишься без проблем...или почти без проблем.



Страницы: 1 вся ветка

Текущий архив: 2003.08.04;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.012 c
3-10085
Apolon
2003-07-11 18:18
2003.08.04
Проверка обязательных полей таблиц из базы данных


4-10499
Rowell
2003-06-01 02:43
2003.08.04
Доступ к другому приложению


14-10376
Soft
2003-07-16 14:55
2003.08.04
Мышки и клавы


1-10289
Ivolg
2003-07-21 13:40
2003.08.04
Анимация


14-10398
Мыш
2003-07-17 11:18
2003.08.04
Несколько вопросов о хостинге