Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
ВнизПомогите преобразовать процедуру из С в паскаль: Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.008 c