Возникла проблема с указанием переменных в функции при переводе с С++. Ниже указан С++ прототип функции + описание переменных - это надо перевести на дельфи, но без перевод структур переменных, то есть они мне не нужны и лишнего гемора не надо, просто указатель на них. Код (Text): typedef struct PRFileDesc PRFileDesc; struct PRFileDesc { const PRIOMethods *methods; /* the I/O methods table */ PRFilePrivate *secret; /* layer dependent data */ PRFileDesc *lower, *higher; /* pointers to adjacent layers */ void (PR_CALLBACK *dtor)(PRFileDesc *fd); /* A destructor function for layer */ PRDescIdentity identity; /* Identity of this particular layer */ }; /* *************************************************************************** * FUNCTION: PR_Write * DESCRIPTION: * Write a specified number of bytes to a file or socket. The thread * invoking this function blocks until all the data is written. * INPUTS: * PRFileDesc *fd * pointer to a PRFileDesc object that refers to a file or socket * const void *buf * pointer to the buffer holding the data * PRInt32 amount * amount of data in bytes to be written from the buffer * OUTPUTS: * None. * RETURN: PRInt32 * A positive number indicates the number of bytes successfully written. * A -1 is an indication that the operation failed. The reason * for the failure is obtained by calling PR_GetError(). *************************************************************************** */ NSPR_API(PRInt32) PR_Write(PRFileDesc *fd,const void *buf,PRInt32 amount); Пояснения: NSPR_API - это просто макрос для экспорта или импорта функции. Функция возвращает PRInt32 - это просто Integer 32 бита. Интересует перевод функции на дельфи - как неправильно сделал это я (без структуры PRFileDesc - она не нужна для доступа). Код (Text): type PRFileDesc = ^TRFileDesc; TRFileDesc = pointer; //видимо это неверно, но как иначе я не знаю, поэтому спрашиваю function PR_Write(var fd : PRFileDesc; const Buff; amount : LongInt) : LongInt; begin ... end; Спасибо за любую помощь!
ЗЫЫ Не пиши на дельфи (ИМХО), убьёшься апстену с извращениями над совместимостью с некоторыми структурами и типами. Хотя написать можно... и работать будет, просто изврат). Код (Text): type PRFileDesc = Pointer; TRFileDesc = record methods : ^PRIOMethods; { the I/O methods table } secret : ^PRFilePrivate; { layer dependent data } lower,higher: ^PRFileDesc; { pointers to adjacent layers } procedure dtor(var fd:PRFileDesc);stdcall;//PR_CALLBACK - какой тип соглашения о вызове?{ A destructor function for layer } //или //procedure dtor(fd:^PRFileDesc);stdcall; identity:PRDescIdentity; { Identity of this particular layer } end; //Integer начиная с дельфи 2.0 - 32 бита (4 байта) (сравняли с LongInt) function PR_Write(fd : ^PRFileDesc; const Buff : Pointer; amount : LongInt) : LongInt; //или //function PR_Write(var fd : PRFileDesc; const Buff : Pointer; amount : LongInt) : LongInt; begin ... end; Видимо как-то так
соре, кусочек не так, вот так верно : Код (Text): type PRFileDesc = ^TRFileDesc; И если тебе всё таки не упала структура для доступа, но например нужен её размер, то посчитай сколько там она весит, сделай тип массив на столько же элементов, а PRFileDesc указатель на этот тип Код (Text): type PRFileDesc = ^TRFileDesc; TRFileDesc = array [0..n] of byte;//n - твой размер -- sizeof(TRFileDesc);
multiarc Код (Text): TRFileDesc = array [0..n] of byte;//n - твой размер -- sizeof(TRFileDesc); Надёжнее все же ...packed array... - оно как бы гарантирует, что элементы массива не будут выравниваться на бОльшую границу ни при каких условиях.