Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: 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 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.022 c
3-1081258516
Julia_
2004-04-06 17:35
2004.05.02
Сообщение об ошибке


8-1075051942
Batoon
2004-01-25 20:32
2004.05.02
Мультимедиа


3-1081008085
YurikGl
2004-04-03 20:01
2004.05.02
varchar в IB


6-1078175716
ser_ega
2004-03-02 00:15
2004.05.02
Explorer


14-1081360469
Verg
2004-04-07 21:54
2004.05.02
Про CVS