Форум: "Основная";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];
ВнизПриветствую Мастеров! Вопрос простой но интересный ... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c