Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Преобразование строки в массив структур.


Автор: CynicRus 31.5.2013, 09:08
Приветствую уважаемых форумчан. Имеется массив структур в котором содержатся значения типа:
Код

TRGB32 = packed record
    B, G, R, A: Byte;
  end;


Так же имеется структура:
Код

TRGB24 = packed record
    B, G, R : byte;
  end;


Собственно мне нужно этот массив структур засунуть в строку, что я и пытаюсь сделать следующим способом:
Код

var
  i : integer;
  DestLen : longword;
  DataStr : string;
  CorrectData : PRGB24;
begin
  SetLength(DataStr,w*h*3);
 //getmem(correctdata, w*h*3);
  CorrectData:= PRGB24(@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;

Тип PRgb24 - указатель на массив TRGB24. В вышеприведённом коде, каждый раз при попытке записать в преобразованную строку - я получаю ошибку записи, в строке CorrectData^[i].R := FData^[i].R;. Так вот собственно вопрос, как мне преобразовать этот самый массив структур TRGB32 в строку в виде массива TRGB24. 

PS: Оу, чего-то я заработался. Тема должна называться запись массива структур в строку. Чем-то не тем я подумал, когда название темы писал-(

Автор: CynicRus 31.5.2013, 09:32
Заработало вот в таком виде:
Код

var
  i : integer;
  DestLen : longword;
  DataStr : 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;

Но я так и не понял, почему не захотело работать через указатель.

Автор: Чучмек 31.5.2013, 09:47
Код

var
  s:ansistring;
  mRGB24:array[0..?] of TRGB24;
  L:integer;
begin
L:=length(mRGB24);
SetLength(s,L*sizeof(TRGB24));
for i:=0 to  L-1 do
  PRGB24(@s[i*sizeof(TRGB24)+1])^:=mRGB24[i];
end;


Автор: CynicRus 31.5.2013, 10:25
Цитата(Чучмек @ 31.5.2013,  09:47)
Код

var
  s:ansistring;
  mRGB24:array[0..?] of TRGB24;
  L:integer;
begin
L:=length(mRGB24);
SetLength(s,L*sizeof(TRGB24));
for i:=0 to  L-1 do
  PRGB24(@s[i*sizeof(TRGB24)+1])^:=mRGB24[i];
end;


Супер. Спасибо!

Теперь в работоспособно состоянии это выглядит вот так:
Код

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)