Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-10319
bss
2003-05-29 09:32
2003.08.04
Создание ASP в Delphi


3-10137
cjiohobaji
2003-07-15 11:33
2003.08.04
получение данных с базы данных?


1-10177
Chlavik
2003-07-23 01:39
2003.08.04
Вызов метода класса программы из dll библтотеки. Можна ли так ?


1-10246
Seldon
2003-07-20 21:33
2003.08.04
Запуск Оперы


1-10212
Gorn
2003-07-20 11:26
2003.08.04
Работа со строками





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский