Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-7018
Skif
2002-05-23 14:40
2002.06.03
Имя файла.


3-6918
DPashin
2002-05-07 09:18
2002.06.03
Как получить в Delphi выходной параметр из процедуры в пакете?


3-6940
AndrewK
2002-05-14 13:19
2002.06.03
Как программно зарегистрировать ODBC алиас?


14-7226
Agent Smith
2002-04-28 13:11
2002.06.03
ИИ


4-7255
Vulsim
2002-03-31 06:48
2002.06.03
Как из Char Virtual key code получить?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский