Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.03;
Скачать: CL | DM;

Вниз

перевод сишного хидера на Паскаль   Найти похожие ветки 

 
team   (2002-04-23 12:52) [0]

не знаю... модератор переместил мой вопрос в данный форум, но его что-то я не вижу (вопрос). прошу заранее прощения, но я еще раз его задам.

я в Си не знаток. вот тут надо перевести сишный хидер на Паскаль. как следующий код будет выглядеть на Паскале:


struct PDF_s {
[skipped]
size_t (*writeproc)(PDF *p, void *data, size_t size);
void (*errorhandler)(PDF *p, int level, const char* msg);
void *(*malloc)(PDF *p, size_t size, const char *caller);
void *(*calloc)(PDF *p, size_t size, const char *caller);
void *(*realloc)(PDF *p, void *mem, size_t size, const char *caller);
void (*free)(PDF *p, void *mem);
[skipped]
};

как я думаю:

type
size_t = Integer;
PPointer = ^Pointer;
writeproc_t = function(p : PDF; data : Pointer; size : size_t) : size_t;
errorproc_t = function(p1 : PDF; ttype : Integer; const msg : PChar) : Pointer;
allocproc_t = function(p2 : PDF; size : size_t; const caller : PChar) : PPointer;
reallocproc_t = function(p3 : PDF; mem : Pointer; size : size_t; const caller : PChar) : PPointer;
freeproc_t = function(p4 : PDF; mem : Pointer) : Pointer;

PDF_s = record
[skipped]
writeproc : writeproc_t;
errorhandler : errorproc_t;
malloc : allocproc_t;
calloc : allocproc_t;
realloc : reallocproc_t;
free : freeproc_t;
[skipped]
end;

а также:

typedef struct {
pdf_colorspace cs;
union {
float gray;
int pattern;
struct {
float r;
float g;
float b;
} rgb;
struct {
float c;
float m;
float y;
float k;
} cmyk;
struct {
float tint;
int cs;
} sep;
} val;
} pdf_color;

Паскаль:

type
_rgb = packed record
r, g, b : Single;
end;

_cmyk = packed record
c, m, y, k : Single;
end;

_sep = packed record
tint : Single;
cs : Integer;
end;

pdf_color = packed record
cs : pdf_colorspace;
case Integer of
^^^^^^^
0 : (gray : Single);
1 : (pattern : Integer);
2 : (rgb : _rgb);
3 : (cmyk : _cmyk);
4 : (sep : _sep);
end;


вот только не пойму, что вместо Integer должно стоять.

и в догонку: какой эквивалент типу FILE в Си, в Паскале?

заранее спасибо.


 
VictorT ©   (2002-04-23 13:17) [1]

Я в Паскале не знаток, поэтому только укажу на ошибки, которые мне сразу бросились в глаза.

void *(*malloc)(PDF *p, size_t size, const char *caller);
Звёздочка до скобки относится к возвращаемому типу, после скобки - к самой функции.

size_t определён в Си как беззнаковое целое.


 
panov ©   (2002-04-23 13:17) [2]

http://delphi.mastak.ru/cgi-bin/forum.pl?n=0&id=1019199600&look=1


 
team   (2002-04-23 13:36) [3]

2VictorT:

спасибо.
что-то я совсем запутался. значит это указатель на указатель на функцию.


Pallocproc_t = ^allocproc_t;
allocproc_t = function(p2 : PDF; size : size_t; const caller : PChar) : Pointer;


как я понял. а как тип FILE определен в Си?


 
Дмитрий Баранов   (2002-04-23 13:57) [4]

Вообще вот так,
=====
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
=======
Но здесь imho лучше подойти творчески и переписать функции осмысленно на паскаль с использованием Assign, Reset etc.


 
VictorT ©   (2002-04-23 13:59) [5]


> что-то я совсем запутался. значит это указатель на указатель
> на функцию.
Не совсем. Это указатель на функцию, у которой возвращаемым параметром есть указатель.

Pallocproc_t = ^allocproc_t; Это нужно выкинуть
allocproc_t = function(p2 : PDF; size : size_t; const caller : PChar) : Pointer;

Вот определение типа FILE:
typedef struct {
short level;
unsigned flags;
char fd;
unsigned char hold;
short bsize;
unsigned char *buffer, *curp;
unsigned istemp;
short token;
} FILE;

Но мне показалось, что тебе не это надо.


 
АрТем3   (2002-04-23 22:25) [6]

Уважаемый VictorT, Вы писали:
> "Это указатель на функцию, у которой возвращаемым параметром есть указатель".
Я немного знаком со стандартом ANSI C. И, как мне кажется, сомнения Team-а о том, что это все же Указатель на (Указатель на Функцию) более близки к истине.
Мои доводы:
1. Насколько мне известно, в С среди типов данных не указано значение - Указатель.
Эти типы данных, в свою очередь, определяют все возможные типы значений, которые может принимать любая функция.

Значение возвращаемого параметра - это значение функции. Если допустить, что возвращаемый параметр - это указатель, то возникнет ошибка - несоответствие типа значения функции и типа значения возвращаемого параметра.


2. При объявлении

int * Имяфункции (Параметры);

получаем указатель, ссылающийся на функцию, возвращающую значение типа int. Косвенно Указатель ссылается на возвращаемое значение функции. Поэтому считается, что функция "возвращает" указатель.
НО!!! Реально возвращаемый параметр функции - Не Указатель!
С реальным значением функции можно работать через Указатель на саму функцию


На основании изложенного, считаю, что в рассматриваемом случае
void *(*malloc)(PDF *p, size_t size, const char *caller);
мы имеем Указатель1 на (Указатель2 на Функцию со значением типа void)
Кстати, Указатель1 это Пустой указатель (типа void). Он может указывать на объект любого типа. В том числе и на другой указатель (Указатель2 в нашем примере).

Чтобы работать с реальным значением, возвращяемым функцией, требуется ДВАЖДЫ использовать операцию разыменования.

Разумеется, это мое мнение, которое претендует на истину в той же мере, в какой и ваше, VictorT, суждение. Если вы приведете объективную аргументацию в пользу своего высказывания, я думаю это будет полезно и Team-у, и всем нам :)). Компилятор нас рассудит :))).
Кстати, Team! Надеюсь, ты не допустил в листинге никаких оЧеПяток, а?! :)).





 
Suntechnic ©   (2002-04-24 00:57) [7]

Проблема данной ветки в том, что здесь полно народу которые прекрасно разбираются в Паскале, и плохо в С, а другая часть представляет из себя знатоков С с общими понятиями в Паскале :). Я отношусь ко второй категории :)). И должен вам заметить, что VictorT © (тоже судя по всему человек из второй категегории :)) абсолютно правильно растолковал вот этот прототип
void *(*malloc)(PDF *p, size_t size, const char *caller);

Теперь несколько замечаний
АрТем3
Насколько мне известно, в С среди типов данных не указано значение - Указатель.

Да нет тип указатель это всё таки отдельный тип, который объявляется символом "*". Под хранение этого типа отводится 4 байта (в Win32 по крайней мере).

Значение возвращаемого параметра - это значение функции. Если допустить, что возвращаемый параметр - это указатель, то возникнет ошибка - несоответствие типа значения функции и типа значения возвращаемого параметра.

Я не совсем понял о чём идёт речь. Возврашать из ф-ции можно любой тип другой вопрос в том, что ты ожидаешь получить. И если они не совпадают то получишь несоответствие типа. В рассматриваемом примере неискушённых С-шников беспокоит тип указателя на void. Дело в том, что в С этот тип стоит особняком, потому как к типу "указатель на void" ковертируется любой указательный тип неявно. А вот чтобы получить это значение назад необходимо явное преобразование. Проще показать это на примере.

void * fun(int * a)
{
return a; // явное приведение к типу "указатель на void" не требуется
}

int i = 10;
int * pi = fun(i);// ошибка!!! требуется явное преобразование
int * pi = (int*) fun(i);// Правильно!!!


Так вот, не стоит путать тип void и тип "указатель на void" это две разные вещи!!! Если мы пишем void fun() это означает что наша ф-ция ничего не возвращает. А если вот так void * fun() то это значит что ф-ция возвращает по крайней мере 4 байта (указатель на н ечто).

Просто в рассматриваемом примере
void *(*malloc)(PDF *p, size_t size, const char *caller); всё смешалось. Мы имеем тип указателя на ф-цию, которая возврашает указатель на void.
И ещё одно замечание. Тип указателя на void обычно используют в низкоуровневых манипуляциях с памятью. Там, где нас особенно не интересует тип объекта, а интересует его место в памяти. Судя по прототипам ф-ции об этом и идёт речь.


 
Suntechnic ©   (2002-04-24 01:01) [8]

Сорри, там конечно же в примере необходимо взятие адреса:
void * fun(int * a)
{
return a; // явное приведение к типу "указатель на void" не требуется
}

int i = 10;
int * pi = fun(&i);// ошибка!!! требуется явное преобразование
int * pi = (int*) fun(&i);// Правильно!!!



Страницы: 1 вся ветка

Текущий архив: 2002.06.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
8-7114
Анатолий
2002-01-12 07:40
2002.06.03
Медиаплеер


8-7124
Blackweber
2002-01-06 01:53
2002.06.03
Как бороться с инвертированными координатами.


14-7173
XEL
2002-04-24 22:48
2002.06.03
декомпиляторы delphi


1-7014
Zak
2002-05-23 13:01
2002.06.03
Путь к папке WINDOWS!


1-7106
ymin
2002-05-22 15:44
2002.06.03
Qreport