Вопрос про указатели
От: stuff Украина www.tarnet.pisem.net
Дата: 26.03.03 18:11
Оценка:
Допустим, есть такой код:

function MyPos(substr: string; str: PString): integer;
begin
  result := Pos(substr, str^); //ошибка, если использовать второй вариант
end;



procedure TForm1.Button1Click(Sender: TObject);
var
 str, str1: string;
begin
  str := 'The best for Magellan';
  str1 := Copy(str ,14, 8);

  //первый вариант  
  ShowMessage(IntToStr(MyPos('a', @str1)));                     //так работает
  //второй вариант
  ShowMessage(IntToStr(MyPos('a', PString(Copy(str ,14, 8))))); //работает но, возникает ошибка в функции MyPos
end;



Хотелось, что бы второй вариант работал, не пришлось бы создавать переменную str1.

Это можно как-то сделать?
Re: Вопрос про указатели
От: tim_ Россия  
Дата: 26.03.03 22:30
Оценка: 1 (1)
Здравствуйте, stuff, Вы писали:

S>Допустим, есть такой код:


S>
S>function MyPos(substr: string; str: PString): integer;
S>begin
S>  result := Pos(substr, str^); //ошибка, если использовать второй вариант
S>end;
S>


S>

S>
S>procedure TForm1.Button1Click(Sender: TObject);
S>var
S> str, str1: string;
S>begin
S>  str := 'The best for Magellan';
S>  str1 := Copy(str ,14, 8);

S>  //первый вариант  
S>  ShowMessage(IntToStr(MyPos('a', @str1)));                     //так работает
S>  //второй вариант
S>  ShowMessage(IntToStr(MyPos('a', PString(Copy(str ,14, 8))))); //работает но, возникает ошибка в функции MyPos
S>end;
S>


S>

S>Хотелось, что бы второй вариант работал, не пришлось бы создавать переменную str1.

S>Это можно как-то сделать?


По-моему никак. Вызов Copy(str ,14, 8) во втором варианте высвобождает память для строки на выходе функциию. В параметр str функции MyPos попадает неопределенное значение. Тут косвенная подсказка:

For all conventions except cdecl, the procedure or function removes parameters from the stack upon returning. With the cdecl convention, the caller removes parameters from the stack when the call returns

Так что, как ни крути, либо переходи на Pos (твой метод конвертации string->PString->string довольно странный и смысла в данном случае не имеет), либо используй первый вариант.
Re: Вопрос про указатели
От: mrhru Россия  
Дата: 27.03.03 02:22
Оценка:
Здравствуйте, stuff, Вы писали:

S>Допустим, есть такой код:


S>
S>function MyPos(substr: string; str: PString): integer;
S>begin
S>  result := Pos(substr, str^); //ошибка, если использовать второй вариант
S>end;
S>


Уже странно.

Зачем нужно использовать PString, если паскалевские string — сами по себе указатели?
Евгений
Re: Вопрос про указатели
От: ILS Россия  
Дата: 27.03.03 07:20
Оценка:
Здравствуйте, stuff, Вы писали:

S>Допустим, есть такой код:


S>
S>procedure TForm1.Button1Click(Sender: TObject);
[пожрато]
S>  ShowMessage(IntToStr(MyPos('a', PString(Copy(str ,14, 8))))); //работает но, возникает ошибка в функции MyPos
S>end;
S>


S>

S>Хотелось, что бы второй вариант работал, не пришлось бы создавать переменную str1.

S>Это можно как-то сделать?


Думаю, нельзя так просто взять и преобразовать строку в указатель в себя. Без промежуточной переменной, имхо, не обойтись. Можно, в принципе, не использовать переменную str1: String, а использовать p: PString. Но разницы вроде нету.
Re[2]: Вопрос про указатели
От: Аноним  
Дата: 27.03.03 08:39
Оценка: 8 (1)
Здравствуйте, mrhru, Вы писали:

M>Здравствуйте, stuff, Вы писали:


S>>Допустим, есть такой код:


S>>
S>>function MyPos(substr: string; str: PString): integer;
S>>begin
S>>  result := Pos(substr, str^); //ошибка, если использовать второй вариант
S>>end;
S>>


M>Уже странно.


M>Зачем нужно использовать PString, если паскалевские string — сами по себе указатели?


string это не указатель а динамический массив

M>
Re[3]: Вопрос про указатели
От: mrhru Россия  
Дата: 27.03.03 08:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>string это не указатель а динамический массив


Можно и так рассматривать.
Суть же в том, что передаются строки по "ссылке", поэтому в функции
function MyPos(substr: string; str: PString): integer;


имхо, нет никакого смысла передавать PString.

function MyPos(substr: string; str: string): integer;


и при вызове

  ShowMessage(IntToStr(MyPos('a', Copy(str ,14, 8))));
end;


гарантируется компилятором:
— передача в функцию MyPos валидной строки
— уничтожение строки, полученной от Copy(str ,14, 8)
Евгений
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.