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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.035 c
4-1099159534
pika
2004-10-30 22:05
2005.01.16
как выключить компьютер ?


1-1103755615
Project1
2004-12-23 01:46
2005.01.16
Задачка. Какой код правильнее и почему ?


8-1097251674
Delphi5.01
2004-10-08 20:07
2005.01.16
Resample Image: Bicubic, Bicubic Smoother, Bicubic Sharper, ...


8-1097048026
V-Isa
2004-10-06 11:33
2005.01.16
Слои в DXDraw.


1-1104742021
leonidus
2005-01-03 11:47
2005.01.16
Получить массив содержащий все поддирректории данной директории