Форум: "Потрепаться";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
Внизперевод сишного хидера на Паскаль Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c