Проблемы с типами

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Проблемы с типами

Сообщение MIX@ » 03.10.2006 19:40:24

Доброго времени суток.
Для создания двумерного динамического массива стал воять простенькую прогу:
Program dyn_mas;
Uses crt;
const
m=7;
n=7;
type
real_pointer = farpointer;
Var
i,j: word;
a: array [1..20] of pointer;
function addrm (i,j:word) : real_pointer;
begin
addrm:=ptr(seg(a[i]^),ofs(a[i]^)+(j-i)*sizeof(real));
end;
function getr (i,j:word) : real;
begin
getr:=addrm(i,j)^;
end;
Begin
Clrscr;
writeln('*');
readkey;
end.

При попытке компиляции жалуется на строку, содержащую getr:=addrm(i,j)^; таким образом: "Error: Incompatible types: got "untyped" expected "Double""
В Turbo Pascal 7.0 всё компилится на ура. При указании параметра -So (режим совместимости с TP7) при компиляции результат не меняется - ошибка так и остаётся.
Заранее большое спасибо за помощь!
MIX@
незнакомец
 
Сообщения: 5
Зарегистрирован: 03.10.2006 19:30:22

Сообщение Alexander » 03.10.2006 22:30:59

MIX@ писал(а):В Turbo Pascal 7.0 всё компилится на ура.


Эээ... А как это ? Ведь там не было динамических массивов.

И что означает эта строка ?

MIX@ писал(а):addrm:=ptr(seg(a[i]^),ofs(a[i]^)+(j-i)*sizeof(real));


По моему тут реальным режимом 80х86 попахивает. Напомню,
что Фри Паскаль - 32 битный компилятор. Нету тут сегментов - смещений.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение mr.denton » 04.10.2006 01:44:18

Не уверен, что это скомпилировалось в tp7.0. Так как в паскале (по крайней мере в известных мне диалектах) невозможно разыменование нетипизированного указателя, коим и является результат функции addrm. В Delphi, TP7.0 по крайней мере так. В fpc похоже тоже, о чем тебе напомнил компилятор.
Аватара пользователя
mr.denton
новенький
 
Сообщения: 23
Зарегистрирован: 30.04.2006 03:23:07

Сообщение Alexander » 04.10.2006 02:34:04

Пардон, поспешил, не понял. Это же и есть поддержка динамических
массивов.

Но сегментов в защищённом режиме точно нет. Только смещения (DWORD).
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение MIX@ » 04.10.2006 14:30:05

С помощью addrm:=ptr(seg(a[i]^),ofs(a[i]^)+(j-i)*sizeof(real)); я хотел вычислить указатель на i,j элемент массива.
Насчёт нетипизированных указателей. Я пытался прямо указать ^real, вместо farpointer, но это тоже не увенчалось успехом (снова ошибка несовместимости типов farpointer и preal (preal = ^real)).
Я в курсе, что во фрипаскале уже есть расширенные динамические структуры, в частности двумерные динамические массивы, но код должен быть совместим с TP7, ибо в конечном итоге компилироваться будет им (у меня фрипаскаль, в институте - TP7).
Если нет структуры сегментов и смещений, то встаёт вопрос: как организовать подобную структуру и вычислять адрес j элемента i строки!?
Всем спасибо за своевременные ответы!
MIX@
незнакомец
 
Сообщения: 5
Зарегистрирован: 03.10.2006 19:30:22

Сообщение mr.denton » 04.10.2006 16:25:10

Так, не понял :o
Ага, тогда объясни что подразумевается под типом farpointer. Я то думал, что farpointer=pointer.
Аватара пользователя
mr.denton
новенький
 
Сообщения: 23
Зарегистрирован: 30.04.2006 03:23:07

Сообщение MIX@ » 04.10.2006 16:50:58

Я тоже думал, но выходит, что они несовместимы, ибо если изменить в процедуре вычисления указателся на i,j элемент массива тип значения, возвращаемой функцией указателся на pointer, т.е.
function addrm (i,j:word) : pointer;
begin
addrm:=ptr(seg(a[i]^),ofs(a[i]^)+(j-i)*sizeof(real));
end;

жалуется на строку
addrm:=ptr(seg(a[i]^),ofs(a[i]^)+(j-i)*sizeof(real));
Error: Incompatible types: got "FarPointer" expected "Pointer"
т.е. выдаваемый функцией ptr указатель типа farpoint не совместим с addrm типа pointer.
MIX@
незнакомец
 
Сообщения: 5
Зарегистрирован: 03.10.2006 19:30:22

Сообщение mr.denton » 04.10.2006 17:23:32

из документации к tp7:
Описание: function Ptr(Seg, Offs: Word): Pointer;

Про farpointer ничего вроде нет. Если он описан как синоним типа pointer, то по идее функция getr должна выглядеть так:
Код: Выделить всё
type preal=^real;
function getr (i,j:word) : real;
begin
getr:=preal(addrm(i,j))^;
end;

from Delphi help писал(а):But a Pointer variable cannot be dereferenced; placing the ^ symbol after a Pointer variable causes a compilation error. To access the data referenced by a Pointer variable, first cast it to another pointer type and then dereference it.
Аватара пользователя
mr.denton
новенький
 
Сообщения: 23
Зарегистрирован: 30.04.2006 03:23:07

Сообщение MIX@ » 04.10.2006 20:37:34

Всё, всем спасибо за помощь, а отдельный респект mr.denton. Он-то и подсказал, то что было нужно: явное преобразование типа указателя.
Итого, после преобразования функции addrm таким образом:
type preal=^real;
function addrm (const array_point: parray; const i,j:word) : preal;
begin
addrm:=preal(ptr(seg(array_point[i]^),ofs(array_point[i]^)+(j-i)*sizeof(real)));
end;

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

P.S. Тему можно закрывать
MIX@
незнакомец
 
Сообщения: 5
Зарегистрирован: 03.10.2006 19:30:22


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru