Главная страница
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.027 c
14-1081339441
sHinE
2004-04-07 16:04
2004.05.02
C какими БД работает дельфи?


1-1081958684
WQSing
2004-04-14 20:04
2004.05.02
Oбработка события


1-1082202234
Mishenka
2004-04-17 15:43
2004.05.02
Не выводится TPrintDialog.


14-1081250112
Фикус
2004-04-06 15:15
2004.05.02
Подскажите, как решить.


1-1081776277
dmtr
2004-04-12 17:24
2004.05.02
Вызов формы из Dll, созданной в Delphi, в VC++