![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приветствую Мастеров! Вопрос простой но интересный ... [D5, Win95/98, NT4, Win2k]
IronHawk © (2003-01-14 03:34:00)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-15 00:32:00) [1]
> UltraFreak © (14.01.03 19:11)
А хотяб проверь на тех же Едитах!
> Anatoly Podgoretsky © (14.01.03 20:18)
Супер спасибо, теперь осталось написать письмо в Борланд!
Anatoly Podgoretsky (2003-01-14 20:21:00) [2]Да обратная совместимость полная, с учетом выше приведенной инструкции.
Anatoly Podgoretsky (2003-01-14 20:18:00) [3]В принципе тут все просто, для насала добавим следующии объявления
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)){)}
UltraFreak (2003-01-14 19:11:00) [4]
> var
> StringVar: String;
> PCharVar: PChar;
> begin
> StringVar:= String(PCharVar);
> PCharVar:= PChar(StringVar);
> end;
>
> Это не метод!
Почему?
Reindeer Moss Eater (2003-01-14 18:34:00) [5]Ты не сказал для каких целей нужно преобразование.
От этого правильный ответ зависит
IronHawk (2003-01-14 18:30:00) [6]Ага, или что-то типа :
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:24:00) [7]Ну вот например:
-------------------------------------------
MyPCharVar:=StrAlloc(Length(MyStringVar));
StrPCopy(MyPCharVar,MyStringVar);
--------------------------------------------
MyPCharVar:=StrNew(MyStringVar);
--------------------------------------------
Reindeer Moss Eater (2003-01-14 18:23:00) [8]Для каких целей?
IronHawk (2003-01-14 18:15:00) [9]
> 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 17:52:00) [10]Что именно реализовать-то ?
MBo (2003-01-14 17:51:00) [11]Вопрос неконкретный
IronHawk (2003-01-14 17:47:00) [12]Мастера, не стесняйтесь, очень интересно узнать Вашу точку зрения!