Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-72029
Ahmad K
2002-12-28 00:39
2003.01.23
А можно без BDE?


4-72606
Evgeny
2002-12-06 10:54
2003.01.23
Файл CGI


1-72294
smok_er
2003-01-15 12:01
2003.01.23
Инициализация record ов


1-72289
shok
2003-01-15 09:34
2003.01.23
password


1-72288
Delph
2003-01-15 11:25
2003.01.23
QuickReport печать с N страницы по K возможна?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский