Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1104302001
Rouse_
2004-12-29 09:33
2005.01.16
C Днем Рождения 29 Декабря


3-1102756670
OlegL
2004-12-11 12:17
2005.01.16
dbf


1-1104831450
markers
2005-01-04 12:37
2005.01.16
Del в TListView


1-1104836002
Andrewp
2005-01-04 13:53
2005.01.16
Загрузка файлов.


6-1098888843
boban
2004-10-27 18:54
2005.01.16
Приложение видит, юзер - нет. Как сделать ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский