Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизPCHAR Найти похожие ветки
← →
GanibalLector © (2004-12-21 01:23) [0]Имеется Pchar наполненный некоторыми данными(Р1).Необходимо создать еще один Pchar(Р2),который будет заполнен по некоторому алгоритму.
Предположим,необходимо скопировать первые 3 байта из Р1,затем добавить 4 и 2 байт и т.д.
Сделал такой сабж и не пойму где ошибся:
var P1,P2:Pchar;
begin
P1 := PChar(AllocMem(10));
P2 := PChar(AllocMem(4));
StrCat(P1,Pchar("123456789"));
Move(P1^,P2^,3);
Move(StrLcat(p2,@p1[4],1)^,p2^,1);// НЕ РАБОТАЕТ
Move(StrLcat(p2,@p1[2],1)^,p2^,1);//ЭТО ТОЖЕ
Freemem(P1);
Freemem(P2);
end;
← →
GuAV © (2004-12-21 02:27) [1]GanibalLector © (21.12.04 1:23)
StrLcat(p2,@p1[4],1)
StrLCat appends at most MaxLen - StrLen(Dest) characters from Source to the end of Dest and returns Dest. That is, MaxLen indicates the maximum length that is allowed in the result string.
← →
GuAV © (2004-12-21 02:34) [2]StrCat(P1,Pchar("123456789")); и ? к чему строка присоединена ? к нуль терминатору мусора.
не проверял но имхо так:
P1 := PChar(AllocMem(10));
P2 := PChar(AllocMem(6));
StrCopy(P1,Pchar("123456789"));
StrLCopy(p2, p1, 3);
StrLCat(p2, p1+4, 4);
StrLCat(p2, p1+2, 5);
А ваще забей на PChar - string рулит.
← →
GanibalLector © (2004-12-21 02:37) [3]2 GuAV
Извини,но с инглишем плохо(да и переводчики толком не переводят).В чем трабл?
← →
GuAV © (2004-12-21 02:46) [4]Виноват это снимается - AllocMem с GetMem попутал
GuAV © (21.12.04 2:34) [2]
StrCat(P1,Pchar("123456789")); и ? к чему строка присоединена ? к нуль терминатору мусора.
GanibalLector © (21.12.04 2:37) [3]
В чем трабл?
Последний параметр StrLcat - длина результата, а не добавляемой строки.
← →
GuAV © (2004-12-21 02:47) [5]Виноват это снимается - AllocMem с GetMem попутал
GuAV © (21.12.04 2:34) [2]
StrCat(P1,Pchar("123456789")); и ? к чему строка присоединена ? к нуль терминатору мусора.
GanibalLector © (21.12.04 2:37) [3]
В чем трабл?
Последний параметр StrLcat - длина результата, а не добавляемой строки.
← →
jack128 © (2004-12-21 02:50) [6]Вот потому что пытаетесь всякими сишным функциями извращаться, потому и путаетесь ;-))
Если бы поставили жесткое условие не использовать длинные строки, то я бы написал так:
GetMem(Result, 6);
Move(Source^, Result^, 3);
Result[3] := Source[3]; // не забываем, что индексация начинается с нуля.
Result[4] := Source[1];
Result[5] := #0;
А вообще см
GuAV © (21.12.04 2:34) [2]
А ваще забей на PChar - string рулит.
← →
GanibalLector © (2004-12-21 02:52) [7]>А ваще забей на PChar - string рулит.
P1 := PChar(AllocMem(10));
StrCat(P1,Pchar("1234567"+chr(0)+"1"));
Caption:=String(p1);
Freemem(P1);
А как это побороть?
← →
jack128 © (2004-12-21 03:06) [8]А чтот побороть?? Если про тоо, что вторая единичка в Caption"e не показывается, то так и должно быть. И вообще - не проще Caption := "1234567"; - эффект будет то же ;-)
← →
GanibalLector © (2004-12-21 03:17) [9]2 jack128 © [8]
Я знаю,что так должно быть.Но у меня в Pchar сидит много нулей и мне нужно с ними работать.А Вы советуете в string.Вот и спрашиваю...
← →
jack128 © (2004-12-21 03:23) [10]А стринг от нулей не зависит. В отличии от PChar"а. Так и делаешь StringVar := "Const" + #0 + OtherStringVar + #0 + PCharVar;
← →
Anatoly Podgoretsky © (2004-12-21 11:31) [11]GanibalLector © (21.12.04 03:17) [9]
А не считай это PChar, все его функции работают с ASCIIZ. используй string
← →
GuAV © (2004-12-21 13:06) [12]2 GanibalLector ©
SetString(S, P, Count)
копирует из PChar в string Count символов с нулями, если они там есть.
Но заголовок всё равно будет прерван нулём
← →
GanibalLector © (2005-01-03 21:44) [13]На самом деле,есть решение по-проще ;)
Забить на Pchar и поставить Pointer.
Что-то типа :
function potok(Param: Pointer): DWord; stdcall;
var hFile:HWND;Size:Cardinal;
pOldInfo,Res:Pointer;
iBytesRead:Cardinal;
i,n_addr:integer;
begin
//читаем
hFile:=CreateFile(
pChar(File_Name),
GENERIC_READ ,
0,
nil,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);
if hFile=invalid_handle_value then begin
sendmessage(MainWnd,WM_USER+2,0,0); //Error
Result:=0;exitthread(Result);exit;end;
Size := GetFileSize(hFile,nil);
GetMem(pOldInfo, GetFileSize(hFile,nil));
ReadFile(hFile,pOldInfo^,GetFileSize(hFile,nil),iBytesRead,nil);
CloseHandle(hFile);
// создаем "правильный" буфер
GetMem(Res,(Size-$0d)*2 );
//Move(pOldInfo^,Res^,$10);
n_addr:=$0;
for i:=$0e to Size-1 do begin
PByte(integer(res)+n_addr)^:=PByte(integer(pOldInfo)+i)^ and $f0;
PByte(integer(res)+n_addr+1)^:=(PByte(integer(pOldInfo)+i)^ and $0f)shl 4;
inc(n_addr,2); end;
...
//там много всего
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.046 c