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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PChar->String, Присвоение string'y pchar'a 
V
    Опции темы
Proxin
Дата 6.6.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


Амеба
Group Icon


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

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



Да ладно. Никакой ошибки нет. Проверьте сами
Код

procedure TForm1.FormCreate(Sender: TObject);
var
 p : PChar;
 s : String;
begin
  p := 'текст';
  s := p;
end;



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

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

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


Опытный
**


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

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



Есть ошибка.
Дело в том, что в pchar я читаю строку из tfilestream. Размер её известен - проходит всё нормально. После того, как присваиваю полученное значение строке, программа вылетает с acsess violation.

Это сообщение отредактировал(а) Proxin - 6.6.2009, 16:04
PM MAIL   Вверх
kami
Дата 6.6.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Proxin @  6.6.2009,  16:04 Найти цитируемый пост)
в pchar я читаю строку из tfilestream. Размер её известен - проходит всё нормально. После того, как присваиваю полученное значение строке, программа вылетает с acsess violation.

код в студию . ИМХО, под PChar не выделена память.

Добавлено через 40 секунд
а может - PChar не завершена #0
PM MAIL WWW   Вверх
Alexeis
Дата 6.6.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Proxin @  6.6.2009,  15:04 Найти цитируемый пост)
Дело в том, что в pchar я читаю строку из tfilestream. Размер её известен - проходит всё нормально. После того, как присваиваю полученное значение строке, программа вылетает с acsess violation.

  Ошибка в 17й строке.

А вообще, подозреваю что память под строку в pchar не выделяется.


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

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

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


Опытный
**


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

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



Код

var s:tfilestream;
    a:string[12];
    b:byte;t:systemtime;k:ulong;
    i:byte;d:pchar;o:string;
begin
s:=tfilestream.Create('C:\mqend.ess',fmOpenRead);
s.Read(a,12);{reads header. Header must be SG var}
form1.M.Text:='MagHeader: T'+a+#13#10;
s.Read(b,1);
form1.M.Text:=form1.M.Text+'MajorVersion: '+inttostr(b)+#13#10;
s.Read(b,1);
form1.M.Text:=form1.M.Text+'MinorVersion: '+inttostr(b)+#13#10;
s.Read(t,16);
form1.M.Text:=form1.M.Text+'SaveTime: '+#13#10;
s.Read(k,4);
form1.M.Text:=form1.M.Text+'HeaderVersion: '+inttostr(k)+#13#10;
s.Read(k,4);
form1.M.Text:=form1.M.Text+'SaveHeaderSize: '+inttostr(k)+#13#10;
s.Read(k,4);
form1.M.Text:=form1.M.Text+'SaveNum: '+inttostr(k)+#13#10;
{здесь всё нормально. а дальше нужно читать строку, описание которой такое:
A string prefixed with a byte length and terminated with a zero (\x00).
Я делаю следущее:}
s.Read(i,1); {как думается, читаю размер строки. Размер выводит - 7, а в строке -
точно знаю - шеть буков}
form1.M.Text:=form1.M.Text+'PCNameLength: '+inttostr(i)+#13#10;
s.Read(d,i); 
form1.M.Text:=form1.M.Text+'PCName: '+d+#13#10;
{вот тут и есть мякотка. когда выполняется последняя строка, вылетает acsess voitation}

все энды есть, сюда не пишу, ибо некритично. всё остальное, кроме этого, выводится правильно. строка завершена абсолютно точно.
где может ускальзать память? или переполняться? делаю s.free один раз, перед ендом.




Это сообщение отредактировал(а) Proxin - 6.6.2009, 17:52
PM MAIL   Вверх
kami
Дата 6.6.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Proxin @  6.6.2009,  17:11 Найти цитируемый пост)
s.Read(d,i);

Как и предсказывалось - не выделена память.
Названия переменных - ужость smile

Нужно так (хотя не вижу в этом случае причин использовать PChar):

Код

d:=AllocMem(i);
s.Read(d[1],i);
 //и так далее.


Во-первых, d - это указатель.
Используя его "напрямую" в методе Read вы меняете область памяти, на которую он адресуется. А не данные, которые находятся в нем.
Более того - первоначально d указывает на nil, то есть - никуда. Считав в него что-то вы передвигаете указатель в неизвестность. И - само собой - при попытке вывода содержимого неизвестности возникает AV.

Добавлено через 28 секунд
Ну и не забыть после использования сделать
Код

FreeMem(d)

PM MAIL WWW   Вверх
Proxin
Дата 6.6.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Почему-то не помогает.
Получается пусто, в d.
А как вы предлагаете со строками работать? 
При чтении в строковой тип выскакивает AV.
UPD:
Разобрался. Оказывается, нужно было 
Код

s.Read(d[0],i);

Спасибо вам.
А, вообще - где можно почитать о чтении различных типов данных с потока?

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


Эксперт
***


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

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



Цитата(Proxin @  6.6.2009,  18:34 Найти цитируемый пост)
Разобрался. Оказывается, нужно было 

ага, обшибся smile У PChar адресация идет с [0] и признаком конца строки является символ #0. Так как в моем коде память, забираемая под переменную инициировалась нулями (F1 на AllocMem), а заполнять начиналась не с [0], а с [1], то при попытке ее вывода сразу натыкался на #0 и в результате считалось, что строка пустая.


Цитата(Proxin @  6.6.2009,  18:34 Найти цитируемый пост)
А как вы предлагаете со строками работать? 

PChar и тому подобные переменные - указатели предполагают, что программист САМ заботится о выделении для них памяти и ее освобождении. При работе с указателями и первое и второе на начальных этапах (а бывает и не на начальных) вызывает трудности. То одно забудешь и выскочит AV, то второе и будут утечки памяти.

Если есть возможность (а в приведенном вами коде /именно приведенном, что дальше - я не знаю/ она есть), лучше воспользоваться string-ом. Бо в этом случае освобождение памяти компилятор возьмет на себя.

Пример:
Код

var
  s:string;
//===========
SetLength(s, i-1); // при выделении памяти под PChar нужно резервировать ее и под завершающий #0.Со String это излишне.
Stream.Read(s[1], i-1); // и нумерация у string начинается именно с [1].


Это сообщение отредактировал(а) kami - 6.6.2009, 20:21
PM MAIL WWW   Вверх
Proxin
Дата 6.6.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А. Понятно. Спасибо.
Всё-таки, вы не знаете, где можно почитать о чтении с потока - конкретно интересует тип float -  и как потом преобразовать его в строку, и чтение изображения - загрузить в пикчебокс? Кода конкретного не прошу, есть ли какие туториалы по этим темам - а то ничего так и не нашёл, по Сети.

Это сообщение отредактировал(а) Proxin - 6.6.2009, 21:24
PM MAIL   Вверх
THandle
Дата 7.6.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Про потоки можно дать ссылку на такую статью:
http://forum.vingrad.ru/articles/topic-211911.html

Можно дать даже ссылку на мою статью о TReader/TWriter, которые упрощают немного ввод данных в поток...

http://forum.vingrad.ru/forum/topic-250409.html

Но толку мне кажется не будет.

Proxin, Вам следует почитать, как мне кажется, какую нибудь книгу для начинающих где рассказывается про различные типы данных.

И еще, ознакомьтесь:

 Правила форума: http://forum.vingrad.ru/index.php?act=boardrules

Пункт №10.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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