Вниз
Скачать: CL | DM;

работа с указателями   Найти похожие ветки 

← →
han   (2004-04-14 11:21) [0]

function SomeFunction(const Value: String);
var
 p: Pointer;
begin
 p := AllocMem(SizeOf(...));
 String(p^) := Value;
 ... ... ...
end;

Как узнать требуемый размер для указателя?


← →
panov ©   (2004-04-14 11:22) [1]

p := AllocMem(Length(Value));


← →
VAleksey ©   (2004-04-14 11:24) [2]

Length(Value)


← →
Skier ©   (2004-04-14 11:53) [3]

а SetLength(...) не проще будет использовать ?


← →
Владислав ©   (2004-04-14 12:05) [4]

 p := AllocMem(SizeOf(...));
 String(p^) := Value;


Что то я с трудом верю в работоспособность такой конструкции.


← →
han   (2004-04-14 12:08) [5]

Так вот именно что не работает, Length точно не канает, так как String занимает больше чем его длина


← →
Владислав ©   (2004-04-14 12:10) [6]

Чего сделать то надо?


← →
Amoeba ©   (2004-04-14 13:09) [7]

Пусть автор по-человечески опишет свою задачу. Есть подозрение, что он просто идет не по тому пути (IMHO).


← →
han   (2004-04-14 19:35) [8]

Надо в Pointer загнать значение переменной типа String.


← →
Гаврила   (2004-04-14 19:38) [9]

Почему бы не использовать такой поинтер, как PChar ?
StrNew, и так далее


← →
Jack128 ©   (2004-04-14 19:39) [10]


> Надо в Pointer загнать значение переменной типа String.


так??
function SomeFunction(const Value: String);
var
p: Pointer;
begin
p := AllocMem(SizeOf(string));
String(p^) := Value;
... ... ...
end;
Только перед FreeMem незабудь сделать Finalize..


← →
panov ©   (2004-04-14 19:43) [11]

>han   (14.04.04 19:35) [8]

Надо в Pointer загнать значение переменной типа String.

Ну в pointer ты его не загонишь, так как SizeOf(Pointer)=4.

function SomeFunction(const Value: String):Pointer;
var
p: Pointer;
begin
p := AllocMem(Length(Value)+1);
move(value[1],p^,Length(Value));
Result := p;
end;


← →
han   (2004-04-14 19:43) [12]

Так я и делал, вот только SizeOf(string) всегда = 4.

А что касается
"Почему бы не использовать такой поинтер, как PChar ?
StrNew, и так далее"

то что имелось ввиду так далее? а использовать надо только Pointer, так как функция которая обрабатывает его может тянуть оттуда как строковые значения, так и числа.. все зависит от случая


← →
Fay ©   (2004-04-14 19:43) [13]

GetMem(p, Length(Value+1));
Move(PChar(Value)^, p^, Length(Value)+1)


2Jack128 ©   (14.04.04 19:39) [10]
p := AllocMem(SizeOf(string));
Это шутка?


← →
han   (2004-04-14 19:45) [14]

а это уже интересснее, а почему +1 ? Типа там хранится еще информация о длинне строки поэтому на один байт больше?


← →
Fay ©   (2004-04-14 19:46) [15]

Там #0. Не хочешь его - не бери 8)


← →
Jack128 ©   (2004-04-14 19:47) [16]


>  [12] han   (14.04.04 19:43)
как так? Как я или как Панов?

> SizeOf(string) всегда = 4
Естественно, ведь string - это тоже указатель


> а использовать надо только Pointer, так как функция которая
> обрабатывает его может тянуть оттуда как строковые значения,
> так и числа.. все зависит от случая
То есть функция принимает указатель на данные? Тогда см Панов или можно проще

var
 s: string
begin
 s := "Мой входной параметр";
 MyFunc(Pointer(PChar(s)));
end;


← →
panov ©   (2004-04-14 19:48) [17]

>Fay ©   (14.04.04 19:43) [13]
Move(PChar(Value)^, p^, Length(Value)+1)

Длина строки Length(Value).


← →
Jack128 ©   (2004-04-14 19:50) [18]


> 2Jack128 ©   (14.04.04 19:39) [10]
> p := AllocMem(SizeOf(string));
> Это шутка?
Отнюдь. Такой код вполне работоспособен, другое дело, что редко используется. К достоинством можно отнести то, что он работает при {$H-}


← →
Fay ©   (2004-04-14 19:50) [19]

2panov ©   (14.04.04 19:48) [17]
Я знаю, что ты знаешь, что я это (Длина строки Length(Value)) знаю


← →
Anatoly Podgoretsky ©   (2004-04-14 20:17) [20]

Еще ьольшее сомнение вызывает этот код
function SomeFunction(const Value: String);


← →
Fay ©   (2004-04-14 20:19) [21]

Вас смущает const или лишняя переменная?


← →
Тимохов ©   (2004-04-14 20:20) [22]

отсутствие результата


← →
Fay ©   (2004-04-14 20:23) [23]

Здесь?
function SomeFunction(const Value: String):Pointer;
var
p: Pointer;
begin
p := AllocMem(Length(Value)+1);
move(value[1],p^,Length(Value));
Result := p;
end;


← →
Тимохов ©   (2004-04-14 20:25) [24]

нет, здесь

han   (14.04.04 11:21)

function SomeFunction(const Value: String);
var
p: Pointer;
begin
p := AllocMem(SizeOf(...));
String(p^) := Value;
... ... ...
end;


← →
Fay ©   (2004-04-14 20:27) [25]

8)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.022 c
7-1078989745
DuchmanSoft
2004-03-11 10:22
2004.05.02
Как убрать отображение чужего окна на панели задачь?


1-1081912401
i2e
2004-04-14 07:13
2004.05.02
Выбор папки - есть аналоги функции SelectDirectory(..) ?


14-1081685357
anpsoft
2004-04-11 16:09
2004.05.02
xp и 1гб озу


14-1081685140
Undert
2004-04-11 16:05
2004.05.02
Windows XP logon


1-1082264464
garry79
2004-04-18 09:01
2004.05.02
Как правильно сделать форму-заставку в отдельном потоке?




   Наверх