Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2009, 23:36   #1
Superlotles
Пользователь
 
Аватар для Superlotles
 
Регистрация: 18.08.2009
Сообщений: 86
По умолчанию PChar

Код:
Читаю Флемова
Тип PChar нельзя использовать напрямую, потому что это указать на память. По этому указателю должны быть выделена какая-то область памяти. Это значит, что следующий пример будет недействителен:
var
s:PChar
begin
s:=’Привет’;
end;

В этом примере я объявил строку s типа PChar и пытаюсь присвоить ей текст. Такая операция невозможна, потому что s – указатель и ни на что не указывает. Но пример работает, как это понимать ???
Skype: Lotles-XXXX
Superlotles вне форума Ответить с цитированием
Старый 19.09.2009, 00:27   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Почему же невозможна?) Вы указателю присвоили адрес строки "Привет")
Иное дело, если Вы потом попробуете нечто вроде s := s + ', друг'; это компилятор не пропустит
netrino вне форума Ответить с цитированием
Старый 19.09.2009, 09:24   #3
Superlotles
Пользователь
 
Аватар для Superlotles
 
Регистрация: 18.08.2009
Сообщений: 86
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Вы указателю присвоили адрес строки "Привет")
Код:
А здесь тогда почему ShowMessage читает адрес, ведь она не может адреса читать ???

Form1: TForm1;
S:PChar;
R:^integer;
i:integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
S:='Привет';
ShowMessage(S);// результат 'Привет'(как ShowMessage прочитал S, если это адрес)-не понимаю
i:=45;
R:=@i;
ShowMessage(R);//Ошибка, ShowMessage не может читать адрес,как я понимаю так и должно быть
end;
end.
Skype: Lotles-XXXX

Последний раз редактировалось Superlotles; 19.09.2009 в 09:56.
Superlotles вне форума Ответить с цитированием
Старый 19.09.2009, 13:24   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Первый вариант работать тоже не должен, просто делфи об этом не говорит, чтоб нас не расстраивать, и молча проделывает всю необходимую работу сам
пыщь
JTG вне форума Ответить с цитированием
Старый 19.09.2009, 19:34   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Первый вариант работать тоже не должен, просто делфи об этом не говорит, чтоб нас не расстраивать, и молча проделывает всю необходимую работу сам
По-моему, слова "не должен" к приведению типов не очень подходят, а то начинает казаться, что это неправильно, но работает.
Somebody вне форума Ответить с цитированием
Старый 19.09.2009, 19:40   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

константу то присваивать можно
ShowMessage проглатывает потму что и string по сути похож на PChar.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2009, 20:23   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
По-моему, слова "не должен" к приведению типов не очень подходят, а то начинает казаться, что это неправильно, но работает.
Да, действительно
ShowMessage в данном случае выводит не строку pchar, а результат работы ф-ции LStrFromPchar, просто это происходит совершенно прозрачно для программиста и не требует вмешательства с его стороны
пыщь

Последний раз редактировалось JTG; 19.09.2009 в 20:27.
JTG вне форума Ответить с цитированием
Старый 26.09.2009, 18:58   #8
Superlotles
Пользователь
 
Аватар для Superlotles
 
Регистрация: 18.08.2009
Сообщений: 86
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Да, действительно
ShowMessage в данном случае выводит не строку pchar, а результат работы ф-ции LStrFromPchar, просто это происходит совершенно прозрачно для программиста и не требует вмешательства с его стороны
А что является результатом фуекции LStrFromPchar ?

Цитата:
Сообщение от netrino Посмотреть сообщение
Почему же невозможна?) Вы указателю присвоили адрес строки "Привет")
Иное дело, если Вы потом попробуете нечто вроде s := s + ', друг'; это компилятор не пропустит
А что бы пропустил s := s + ', друг' что надо сделать? Может память выделить или еще что-нибудь
Skype: Lotles-XXXX

Последний раз редактировалось Stilet; 08.10.2009 в 08:34.
Superlotles вне форума Ответить с цитированием
Старый 07.10.2009, 23:16   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Superlotles Посмотреть сообщение
А что бы пропустил s := s + ', друг' что надо сделать? Может память выделить или еще что-нибудь
Чтобы пропустил нужно использовать тип string. Для указателя на строку(PChar) операция конкатенации(+) не определена.
netrino вне форума Ответить с цитированием
Старый 08.10.2009, 08:35   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Superlotles
Если нет объективных причин пользовать указателями - не пользуйся ими.
String гораздо надежнее работает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эквивалент \n в PChar VladimirVB Общие вопросы Delphi 1 28.08.2009 13:46
Вопрос по PChar Armorer Общие вопросы Delphi 12 12.02.2009 20:17
PChar Роман Радер Общие вопросы Delphi 2 02.11.2008 18:50
String to PChar D7_beginner Общие вопросы Delphi 2 21.11.2007 14:05
Access violation на строке вида StrLCopy(PChar(st1),PChar(st2),10); malor Общие вопросы Delphi 1 11.07.2007 13:39