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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при возврате очень большой строки 
V
    Опции темы
CynicRus
Дата 31.5.2013, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ещё раз приветствую уважаемых форумчан. Преобразовываю массив структур в троку, всё здорово. А вот при попытке присвоить значение этой строки какой либо переменной приводит к Access Violation at 0x0040538c: read of address 0x00000008. При этом строка может быть достаточно большой, но до 2 гигабайт точно не дотягивает.

Собственно код преобразования в строку:

Код

var
  i : integer;
  DestLen : longword;
  DataStr,S : string;
  CorrectData : TRGB24Array;
begin
  SetLength(DataStr,w*h*3);
  CorrectData:= TRGB24Array(@DataStr[1]);
  for i := w*h - 1 downto 0 do
  begin
    CorrectData[i].R := FData^[i].R;
    CorrectData[i].G := FData^[i].G;
    CorrectData[i].B := FData^[i].B;
  end;
  if compress(pbyte(BufferString),destlen,Pbyte(DataStr),w*h*3) = Z_OK then
  begin;
    SetLength(DataStr,DestLen);
    move(bufferstring[0],dataStr[1],DestLen);
    s := 'm' + Base64EncodeStr(datastr);
    SetLength(datastr,0);
  end;
  Result:=S;
end;

На выходе, в отладчике я вижу что значение присвоилось. Строка длинная. А вот начинаю в тексте программы пытаться присоить значение из этой функции, и получаю вышеизложенно. Работаю в Delphi XE и Delphi XE 3, и в обеих средах получаю такое поведение. Ну и вопрос, собственно - как присвоить значение из этой функции строковой переменной без ошибки.

Добавлено через 7 минут и 38 секунд
Так...дальнейшая отладка показала, что ошибка происходит при попытке освободить временный массив CorrectData. DataStr - освобождается, а вот CorrectData - видимо ошибка и происходит, когда уничтожается эта локальная переменная. И чего тут делать - пока ума не приложу.
PM MAIL   Вверх
Чучмек
Дата 31.5.2013, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



А какая необходимость использовать строку?


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
CynicRus
Дата 31.5.2013, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Чучмек @ 31.5.2013,  09:59)
А какая необходимость использовать строку?

Совместимость. Хотя я сейчас пробую отказаться от временного массива, и работать с указателем на массив...Но дела идут не очень:)

Код

var
  i : integer;
  DestLen : longword;
  DataStr : PRGB24;
  CorrectData : TRGB24;
  Procedure WriteRGB24(Data: TRGB24);
   begin
     PRGB(DataStr)^ := Data;
     Inc(PRGB(DataStr),SizeOf(TRGB24))
   end;
begin
 // CorrectData:= TRGB24Array(@DataStr[1]);
  for i := w*h - 1 downto 0 do
  begin
    CorrectData.R := FData^[i].R;
    CorrectData.G := FData^[i].G;
    CorrectData.B := FData^[i].B;
    WriteRGB24(CorrectData);
  end;
  if compress(pbyte(BufferString),destlen,Pbyte(DataStr),w*h*3) = Z_OK then
  begin;
    SetLength(Result,DestLen);
    move(bufferstring[0],result[1],DestLen);
    Result := 'm' + Base64EncodeStr(result);
   // SetLength(DataStr,0);
  end;
end;

PM MAIL   Вверх
DarkProg
Дата 3.6.2013, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Зачем вы динамическому типу string пытаетесь задать длину строки функцией SetLength?
Delphi сама выделит память, если требуется, просто инициализируйте переменную, а потом используйте s:=s+'чего-то там'.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
DarkProg
Дата 3.6.2013, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Я вам рекомендую преобразовывать не в строку, а в TStringList, а потом можете спокойно взять TStringList.Text и получите одну строку.
Причём организация будет типа как в обычном блокноте.

Приведите более полный код, потому что у меня такое ощущение, что есть лишние операции у вас с указателями.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
northener
Дата 4.6.2013, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(CynicRus @  31.5.2013,  10:14 Найти цитируемый пост)
move(bufferstring[0],result[1],DestLen);

Почему bufferstring[0]?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
CynicRus
Дата 11.6.2013, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Почему bufferstring[0]?


Потому что bufferstring - PChar.
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.0769 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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