Допустим, есть такой код:
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.
Это можно как-то сделать?
Здравствуйте, 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 довольно странный и смысла в данном случае не имеет), либо используй первый вариант.
Здравствуйте, stuff, Вы писали:
S>Допустим, есть такой код:
S>S>function MyPos(substr: string; str: PString): integer;
S>begin
S> result := Pos(substr, str^); //ошибка, если использовать второй вариант
S>end;
S>
Уже странно.
Зачем нужно использовать PString, если паскалевские string — сами по себе указатели?
Евгений
Здравствуйте, 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. Но разницы вроде нету.
Здравствуйте, 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>
Здравствуйте, <Аноним>, Вы писали:
А>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)
Евгений