Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.23;
Скачать: CL | DM;

Вниз

Приветствую Мастеров! Вопрос простой но интересный ...   Найти похожие ветки 

 
IronHawk ©   (2003-01-14 03:34) [0]

String to PChar and back conversions всё ли правда что написано в хелпе?
Long string to PChar conversions are not automatic. Some of the differences between strings and PChars can make conversions problematic:

Long strings are reference-counted, while PChars are not.
Assigning to a string copies the data, while a PChar is a pointer to memory.
Long strings are null-terminated and also contain the length of the string, while PChars are simply null-terminated.

Situations in which these differences can cause subtle errors are discussed in this section.

И можно ли это без особого напряга реализовать в 1-2 строки?


 
IronHawk ©   (2003-01-14 17:47) [1]

Мастера, не стесняйтесь, очень интересно узнать Вашу точку зрения!


 
MBo ©   (2003-01-14 17:51) [2]

Вопрос неконкретный


 
Reindeer Moss Eater   (2003-01-14 17:52) [3]

Что именно реализовать-то ?


 
IronHawk ©   (2003-01-14 18:15) [4]


> MBo © (14.01.03 17:51)
> Reindeer Moss Eater (14.01.03 17:52)

Как реализовать String to PChar and back conversions в 1-2 (ну максимум 5) строки?
А так?


 
Reindeer Moss Eater   (2003-01-14 18:23) [5]

Для каких целей?


 
Reindeer Moss Eater   (2003-01-14 18:24) [6]

Ну вот например:
-------------------------------------------
MyPCharVar:=StrAlloc(Length(MyStringVar));
StrPCopy(MyPCharVar,MyStringVar);
--------------------------------------------
MyPCharVar:=StrNew(MyStringVar);
--------------------------------------------


 
IronHawk ©   (2003-01-14 18:30) [7]

Ага, или что-то типа :

var
StringVar: String;
PCharVar: PChar;
begin
StringVar:= String(PCharVar);
PCharVar:= PChar(StringVar);
end;

Это не метод!

Хотя метод
> Reindeer Moss Eater (14.01.03 18:24)

Надо опробовать ...
спасибо!


 
Reindeer Moss Eater   (2003-01-14 18:34) [8]

Ты не сказал для каких целей нужно преобразование.
От этого правильный ответ зависит


 
UltraFreak ©   (2003-01-14 19:11) [9]


> var
> StringVar: String;
> PCharVar: PChar;
> begin
> StringVar:= String(PCharVar);
> PCharVar:= PChar(StringVar);
> end;
>
> Это не метод!

Почему?


 
Anatoly Podgoretsky ©   (2003-01-14 20:18) [10]

В принципе тут все просто, для насала добавим следующии объявления

var
StringVar: String;
PCharVar: PChar;
Buf: array [x..y] of char;
begin
PCharVar := Buf;
здесь все одназначно, PCharVar = @Buf
PCharVar:= StringVar;
а вот здесь нет, если по аналогии, то PCharVar = @StringVar, но это не то что нам нужно, а нужно StringVar^, но StringVar может быть равен nil, что не допустимо, если функция не проверяет подобную возможность. Отсюда и не одназначность
С неодназначность бороться просто, или PChar(StringVar) или Pointer(StringVar) или @StringVar[0]
end;

Первый, второй и третий варианты дадут разные варианты при StringVar = nil

1. будет указатель на внутренню строку, длина которой равна 0 и находится она будет в памяти ReadOnly или @StringVar[0] в противном случае
2. nil, но это же все таки не указатель на PChar строку, а Pointer
3. nil, но не безопасно, так как может проиэойти обращение по nil^ (зависит от функции)

Этих трех вариантов,только первый обеспечивает, стопроцентную совместимость с PChar, но с успехом может использоваться и вариант с Pointer, тогда когда надо передавать и nil значения.

Единственная проблема, которая указана в теме - это проблема интерпритациии, а не совместимости. Обратной проблемы интерпритации для PCharToStr не существует, там одназначность.
Так что если есть необходимость, передавать PChar в WinAрi функции, то SetLength(S,N) и/или PChar(S). Обратное присвоение при возврате из функции, лучше всего делать так
S := {PChar(}Func(Pchar(S)){)}


 
Anatoly Podgoretsky ©   (2003-01-14 20:21) [11]

Да обратная совместимость полная, с учетом выше приведенной инструкции.


 
IronHawk ©   (2003-01-15 00:32) [12]


> UltraFreak © (14.01.03 19:11)

А хотяб проверь на тех же Едитах!

> Anatoly Podgoretsky © (14.01.03 20:18)

Супер спасибо, теперь осталось написать письмо в Борланд!



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
14-72485
Andrey-k
2003-01-06 00:34
2003.01.23
TAdvStringGrid v2.4


6-72432
Интересующийся...
2002-11-22 23:48
2003.01.23
Не знаю что лучше....


1-72344
scorpi
2003-01-11 17:51
2003.01.23
DOS-кодировка


3-72108
sanilo
2002-12-28 21:20
2003.01.23
Доступ к Базе Данных


3-72035
Ig0r
2002-12-27 18:09
2003.01.23
Тип поля таблицы