![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
работа с памятью [D7, XP]
Andrey_ka © (2008-11-10 17:24:00)Удалено модератором
Примечание: СПАМ
Andrey_ka (2008-11-12 14:18:00) [1]ответа всего 2 остальное пустой треп....
ни один из ответов полностью модернизировать под цели не смог, а цели такие:
нужны 3 процедуры или функции
первая процедура на подобии move записывает из одного
участка памяти в другой определенное количество байт
procedure CopyBytes(ps,pd:pointer;size:byte);
begin
move(ps^,pd^,size);
end;
она вроди работает коректно
вторая возвращает строку со значением каждого байта (через запяту)
Function BufInStr( const Source; count : Integer;Rozdel:char = ','):string;
var
S: PChar;
I: Integer;
begin
S := PChar(@Source);
result:='';
for I :=0 to count-1 do
result:=result+Rozdel+inttostr(ord(S[I]));
delete(result,1,1);
end;
и третья обратная второй
Function StrInBuf(s:string;Dest:pointer;Rozdel:char = ','):boolean;
var
b: PChar;
I: Integer;
ch:char;
s1:string;
begin
b := Dest;
result:=false;
while length(s)>0 do
begin
s1:=copy(s,1,pos(rozdel,s)-1);
delete(s,1,length(s1)+1);
ch:=chr(StrToInt(s1));
b[i]:=ch;
inc(i);
end;
result:=true;
end;
а вот с другими двумя проблема
пока в качестве параметров передаем числа вроди работает, но вот если
передаем элемент масива, то вторая функция бред выводит:(
помогите плз!
procedure TForm1.Button1Click(Sender: TObject);
var i:longint;
t:cardinal;
b:array of byte;
begin
t:=StrToInt(e1.text);
Label1.Caption:=BufInStr(t,4);
setlength(b,4);
BufInbuf(t,@b[0],4);
label2.Caption:='';
for i:=0to length(b)-1 do
label2.Caption:=label2.Caption+inttostr(b[i]);
BufInbuf(b[0],@i,4);
Label3.Caption:=inttostr(i);
caption:=BufInStr(b,4);
i:=0;
StrInBuf(Label1.Caption+',',@i);
Label4.Caption:=inttostr(i);
StrInBuf(Label1.Caption+',',@b[0]);
label5.Caption:='';
for i:=0to length(b)-1 do
label5.Caption:=label5.Caption+inttostr(b[i]);
ShowMessage(BufInStr(b,4));
end;
Anatoly Podgoretsky (2008-11-10 20:32:00) [2]> Сергей М. (10.11.2008 20:24:13) [13]
Но выбор первичен, неправильный выбор никакой повар/доктор не исправит.
Сергей М. (2008-11-10 20:24:00) [3]
> Anatoly Podgoretsky © (10.11.08 20:13) [11]
Мало использовать правильные грибы - их еще надо и правильно использовать !
Иначе не вставит)
Anatoly Podgoretsky (2008-11-10 20:15:00) [4]
> palva © (10.11.08 20:01) [10]
Он стандартный и определен фирмой Интел и он простой, математически строгий - младшие байты по младшим адресам. С ним просто работать, в отличии от обратного порядка.
Anatoly Podgoretsky (2008-11-10 20:13:00) [5]> Сергей М. (10.11.2008 20:01:09) [9]
Что бы вставило надо правильные грибы использовать.
Сергей М. (2008-11-10 20:01:00) [6]Вот и нашу Сашу (с) тоже "не вставляет" то что не вставляет)
palva (2008-11-10 20:01:00) [7]Да еще не раскрыт вопрос о порядке байтов в типе Integer. В конференции для начинающих на это невредно обратить внимание.
Riply (2008-11-10 19:51:00) [8]> [6] Palladin © (10.11.08 17:44)
> уже целых два ответа дали... первый красивше
Неа. На топиковый вопрос не дали ни одного,
ибо они не "вставляют" а записывают :)
Andrey_ka (2008-11-10 17:49:00) [9]сори не замеил! спасибо
Palladin (2008-11-10 17:44:00) [10]
> Andrey_ka (10.11.08 17:37) [5]
уже целых два ответа дали... первый красивше
Andrey_ka (2008-11-10 17:37:00) [11]тип Integer состоит из 4 байт , вот я и хочу чтобы в масив были записаны эти байты. Если 1 переменная проблем нет, move справляется, а как вставить не сначала а с 5 байта ну или 8, неважно
Поросенок Винни-Пух (2008-11-10 17:35:00) [12]var pb : PByte;
begin
pb := адрес массива;
inc(pb,смещение_пятого_от_начала);
Move(source,pb^,4);
Сергей М. (2008-11-10 17:33:00) [13]
> move, но она вставляет
Меня тоже не "вставляет" move(), меня "вставляет" вставлялка попроще и поочевидней:
PInteger(@MyArray[5])^ := i;
Сергей М. (2008-11-10 17:31:00) [14]
> нужно вставить
Что значит "вставить" ?
Palladin (2008-11-10 17:27:00) [15]
> но она вставляет только сначала масива
то есть это move виновата?