Странная ошибка

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Странная ошибка

Сообщение Scorporat » 29.10.2015 15:42:07

fpc и lazarus использую из trunk
Код работал, изменений не вносилось (по крайней мере я не помню),
и вдруг перестало компилится. Привожу часть кода относящуюся к проблеме


Код: Выделить всё
type

  PPField = ^PField;

  PField = ^TField;

  TField = record
    val: pointer;
    at: byte;
    cls: byte;
    ln: byte;
    name: pointer;
    comm: pointer;
  end;

 
  PBase = ^TBase;

  TBase = record
    rlz: pointer;
    teg: byte;   
    settype: byte;
    attr: byte;   
    vers: byte;   
    bs: PBS;     
    tcm: ppfield;
    tfd: pointer;
    filename: pchar;
    ind: pointer;   
    comm: pchar;     
    name: pchar;     
    lq: word;       
    cntopen: word;   
  end;



  pfield_array = array [1..100, 1..200] of pfield;
  pbase_array = array [1..200] of pbase;     

  ppfield_array = ^pfield_array;
  ppbase_array = ^pbase_array;

var

pfield_array_base: ppfield_array;
pfield_array_sub: ppfield_array;
ppbase_array_base: ppbase_array;

function gst(array_off_pfield: ppfield_array; num_ppbase: integer): integer;
var
   i: integer;
begin
  i := 1;

  while ((ppbase_array_base[num_ppbase].tcm)^ + i - 1)^ <> nil) do        // Unit1.pas(1071,48) Error: Operation "+" not supported for types "PField" and "LongInt"
  begin
    array_off_pfield[num_ppbase, i] := ((ppbase_array_base[num_ppbase].tcm)^ + i - 1)^;  // Unit1.pas(1071,48) Error: Operation "+" not supported for types "PField" and "LongInt"
    i := i + 1;
  end;
  Result := i - 1;

end;


Я всегда наивно полагал что тип pointer и походящие от него типы можно инкрементировать и декрементировать
Где я накосячил, подскажите !
Scorporat
незнакомец
 
Сообщения: 5
Зарегистрирован: 13.04.2011 15:13:47

Re: Странная ошибка

Сообщение gluhow » 30.10.2015 15:15:48

Ну видать не хочет складывать числа и указатели. Можно преобразовать вручную через тип PtrUInt. Laz на это ругается что не подходит для портирования, но для обычных x86 и 64 все нормально
gluhow
новенький
 
Сообщения: 41
Зарегистрирован: 13.08.2015 15:30:20

Re: Странная ошибка

Сообщение Alex2013 » 05.11.2015 17:47:16

Гм.. я обычно делаю примерно так
...
Type
AR=array of byte;
Var
P1,P2:Pointer;
begin
P1:=pfield_array_base;
P2:=@Ar(P1^)[1000+i] ;// 1000+i просто любое смещение от начала
// то есть преобразую в "бесконечный байтовый массив"
// и получаю адрес конкретного элемента
// (и плевать мне на физическое устройство памяти...
// главное чтобы заграницы не выйти и выделений кусок был непрерывным )
end.
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: Странная ошибка

Сообщение Scorporat » 09.11.2015 14:30:35

Alex2013 писал(а):Гм.. я обычно делаю примерно так
...
Type
AR=array of byte;
Var
P1,P2:Pointer;
begin
P1:=pfield_array_base;
P2:=@Ar(P1^)[1000+i] ;// 1000+i просто любое смещение от начала
// то есть преобразую в "бесконечный байтовый массив"
// и получаю адрес конкретного элемента
// (и плевать мне на физическое устройство памяти...
// главное чтобы заграницы не выйти и выделений кусок был непрерывным )
end.


Интерестно. Есть пару вопросов.
1 Что означает "1000+i просто любое смещение от начала "? Я так понял что это либо смещение в памяти либо номер элемента массива ?
2 Как собственно работать с массивом (получить элемент, присвоить элемент) ?

Извиняюсь если туплю, раньше в си писал.

2
Scorporat
незнакомец
 
Сообщения: 5
Зарегистрирован: 13.04.2011 15:13:47

Re: Странная ошибка

Сообщение SSerge » 09.11.2015 14:50:44

Scorporat
Код: Выделить всё
int *pfield_array_base=getmem(10000*sizeof(int));
byte *p1=pfield_array_base;
byte p2=*(p1+1000);


по смыслу так примерно
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Странная ошибка

Сообщение resident » 09.11.2015 18:30:20

Scorporat писал(а):Код работал, изменений не вносилось

while ((ppbase_array_base[num_ppbase].tcm)^ + i - 1)^ <> nil) do

Да тут количество открывающихся скобок не равно количеству закрывающихся. Как такое могло компилироваться? :mrgreen:
Не знаю уж чего этот код делает, но может так?
Код: Выделить всё
  while (ppbase_array_base^[num_ppbase + i - 1]^.tcm^ <> nil) do        // Unit1.pas(1071,48) Error: Operation "+" not supported for types "PField" and "LongInt"
  begin
    array_off_pfield^[num_ppbase, i] := ppbase_array_base^[num_ppbase + i - 1]^.tcm^;  // Unit1.pas(1071,48) Error: Operation "+" not supported for types "PField" and "LongInt"
    i := i + 1;
  end;
  Result := i - 1;

Кстати у меня ваша ошибка даже не появилась. Чтобы "PField" привести к "LongInt" вроде нужно использовать PtrUInt.
http://www.freepascal.org/docs-html/rtl ... ruint.html
http://delphimaster.net/view/2-1282672625
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 245

Рейтинг@Mail.ru