Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача: procedure change(pCh: PChar); изменить значение "по месту" в процедуре 
:(
    Опции темы
Лиходей
Дата 6.9.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Такая задача:
изменить значение ноль терминальной строки  "по месту" в процедуре, при этом параметр в процедуру передается по значению. 
схема такая:
Код

procedure change(pCh: PChar);
begin
 //любые действия изменяющие строку pChSorse
end;
............
var pChSorse: PChar; 
............
pChSorse := 'asd';
change(pChSorse); // после этой строки значение pChSorse должно быть не равно 'asd'
...........

Использование функции или var перед pCh: PChar не предлагайте, условия задачи жесткие.
Не могу понять как это возможно, прошу помощи.
PM MAIL   Вверх
Данкинг
Дата 6.9.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Не особо понял, но предложу: ну так а глобально pChSorse объявить?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
MetalFan
Дата 6.9.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



не понял проблемы... ну меняй в change pCh как тебе надо... ты же фактически указатель передал в процедуру. что тебе мешает изменять находящиеся по нему данные?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Лиходей
Дата 6.9.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Пробовал не меняется. Сейчас код выложу...........

Код

procedure change(pCh: PChar);
begin
  pch := '1234';
end;


procedure TForm1.Button2Click(Sender: TObject);
var pChSorse : PChar;
begin
 pChSorse := 'asdfg';
 change(pChSorse);
 caption:=  pChSorse;
end;


Если прототип обьявить как 
Код
procedure change(var pCh: PChar);
 то все работает, но нужно без var адрес pChSorse узнать.


Это сообщение отредактировал(а) Лиходей - 6.9.2009, 19:44
PM MAIL   Вверх
Лиходей
Дата 6.9.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Блин, проверил с помощью точек останова адреса pChSorse и pCh совпадают. smile 

PM MAIL   Вверх
Amphiluke
Дата 6.9.2009, 21:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 6
Всего: 112



Код

procedure change(pCh: PChar);
begin
  StrPCopy(pCh, '1234');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  pChSorse : PChar;
begin
  GetMem(pChSorse, 255);
  try
    StrPCopy(pChSorse, 'asdfg');
    change(pChSorse);
    Caption := StrPas(pChSorse);
  finally
    FreeMem(pChSorse, 255);
  end;
end;

Нет? smile 
PM   Вверх
~FoX~
Дата 6.9.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 5
Всего: 68



Лиходей, Не нравится var используй out...можно превратить процедуру в функцию...Заведи лишнюю глобальную переменную...Или работай с PChar как с указателем....



--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Fedia
Дата 7.9.2009, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: нет
Всего: 13



Лиходей, 
если допустимо поменять тип параметра:
Код

procedure ChangeStr(const s);
var
  new_s: PChar;
begin
  new_s := '123';
  Move(new_s, (@s)^, SizeOf(new_s));
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  s: PChar;
begin
  s := '111';
  ChangeStr(s);
  Caption := s
end;



--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
CodeMonkey
Дата 7.9.2009, 08:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



А новая и старая строки по длинам как отличаются? В pCh можно записать ровно столько же или меньше символов, но не больше. 

Кроме того:

Код

S := 'asdfg';        // asdfg - константа, находится в read-only памяти. Вы её при всём желании не измените.
UniqueString(S); // теперь asdfg скопировано в изменяемую память


Добавлено через 6 минут и 42 секунды
P.S. Вообще задача выглядит подозрительно.

Например:
Код

var
  S: String;
  H: String;
...
  S := 'qwerty' + IntToStr(1);
  ...
  H := S;
  ...
  ChangeStr(S); // <- внутри мы записываем в S 'abc'
  ...
  Caption := H; // <- Caption будет равен вовсе не 'qwerty1', а 'abc'



Это сообщение отредактировал(а) CodeMonkey - 7.9.2009, 08:59


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Лиходей
Дата 7.9.2009, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Amphiluke, большое спасибо. То что нужно. 

Значит нужно указывать компилятору конкретно сколько памяти выделять под строку? 
Если можно, в двух словах, прокоментируйте свой код. Разница между вашим кодом и моим в том, что вы используете функции GetMem, FreeMem (по большому счету).  Как я и говорил адреса фактического и формального параметра оказались одинаковы, однако без явного выделения памяти код не работает. Хотя по логике должен, PChar это же просто указатель на место в памяти первого символа строки.
Думаю не мне одному будет интересно.

~FoX~, что вы имели ввиду?
Цитата
Или работай с PChar как с указателем....


 
  
PM MAIL   Вверх
MetalFan
Дата 7.9.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Лиходей @  7.9.2009,  09:50 Найти цитируемый пост)
Значит нужно указывать компилятору конкретно сколько памяти выделять под строку? 

конечно. например с пом. SetLength.

Цитата(Лиходей @  7.9.2009,  09:50 Найти цитируемый пост)
однако без явного выделения памяти код не работает. Хотя по логике должен

по какой такой логике?
вообще перечитай что CodeMonkey написал. подумай.




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.3997 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.