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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразовать AnsiString в массив AnsiChar 
V
    Опции темы
former
Дата 9.7.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


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

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



Собственно сабж. И обратно.

Это сообщение отредактировал(а) former - 9.7.2009, 14:28


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
THandle
Дата 9.7.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Как то так:
Код


procedure TForm1.Button1Click(Sender: TObject);
var
  s, s1: AnsiString;
  a: array of AnsiChar;
begin
  s := 'Hello, world!';

  { Из строки в массив }
  SetLength(a, Length(s));
  Move(s[1], a[0], Length(s));
  { Обратно }
  SetLength(s1, Length(a));
  Move(a[0], s1[1], Length(a));

  ShowMessage(s1);
end;

PM   Вверх
Alexeis
Дата 9.7.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Смотря как использовать, если не выносить за пределы функции, то просто
Код

var
  s : AnsiString;
  a : PAnsiChar;
begin
  s := PAnsiChar(a);
  


Добавлено через 49 секунд
  Обратно должно работать простое присваение. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
former
Дата 9.7.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


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

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



THandle, 
Alexeis, спасибо.

Проблема решена.

Это сообщение отредактировал(а) former - 9.7.2009, 15:40


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Alexeis
Дата 9.7.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



former, поскольку функция TextDecline  не сохраняет строку, то делается так
Код

  SetLength(ImCase, 200); //на случай если результат будет больше исходника.
  TextDecline (PAnsiChar(ImCase), 3);
  ShowMessage(ImCase);


  Копия нужна только когда строка переданная в функцию где-то сохраняется.

 Мусор из-за того что ты не копируешь завершающий "0"
Move(AnsiChar(ImCase[1]),s,Length(ImCase));
Move(AnsiChar(ImCase[1]),s,Length(ImCase) + 1);

Добавлено через 2 минуты и 40 секунд
PAnsiChar(ImCase), еще опасна тем что может содержать константную строку, в этом случае правильным будет использование 
@ImCase[1] , в данном случае SetLength(ImCase, 200); - выделит новую память под строку, после чего ее константность пропадет.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
former
Дата 9.7.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


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

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



Alexeis, дело все в том, что массив должен быть заведомо больше исходной строки (DLL писал не я).
Получалось следующее. При многократном использовании (подряд) появлялись лишние символы.
Я решил эту проблему, используя
Код

FillChar(s, SizeOf(s), Ord(''));
 
после каждого вызова.
В передаваемом в DLL массиве последний элемент должен быть #0.

Все равно, спасибо за помощь. +

Это сообщение отредактировал(а) former - 9.7.2009, 17:41


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
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.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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