Нужен правильный тип переменной (заходить гуру С и дельфи - не пинать)

Тема в разделе "WASM.WIN32", создана пользователем d2k9, 24 июл 2009.

  1. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Возникла проблема с указанием переменных в функции при переводе с С++.
    Ниже указан С++ прототип функции + описание переменных - это надо перевести на дельфи, но без перевод структур переменных, то есть они мне не нужны и лишнего гемора не надо, просто указатель на них.

    Код (Text):
    1. typedef struct PRFileDesc       PRFileDesc;
    2.  
    3. struct PRFileDesc {
    4.     const PRIOMethods *methods;         /* the I/O methods table */
    5.     PRFilePrivate *secret;              /* layer dependent data */
    6.     PRFileDesc *lower, *higher;         /* pointers to adjacent layers */
    7.     void (PR_CALLBACK *dtor)(PRFileDesc *fd);
    8.                                         /* A destructor function for layer */
    9.     PRDescIdentity identity;            /* Identity of this particular layer  */
    10. };
    11.  
    12. /*
    13.  ***************************************************************************
    14.  * FUNCTION: PR_Write
    15.  * DESCRIPTION:
    16.  *     Write a specified number of bytes to a file or socket.  The thread
    17.  *     invoking this function blocks until all the data is written.
    18.  * INPUTS:
    19.  *     PRFileDesc *fd
    20.  *         pointer to a PRFileDesc object that refers to a file or socket
    21.  *     const void *buf
    22.  *         pointer to the buffer holding the data
    23.  *     PRInt32 amount
    24.  *         amount of data in bytes to be written from the buffer
    25.  * OUTPUTS:
    26.  *     None.
    27.  * RETURN: PRInt32
    28.  *     A positive number indicates the number of bytes successfully written.
    29.  *     A -1 is an indication that the operation failed. The reason
    30.  *     for the failure is obtained by calling PR_GetError().
    31.  ***************************************************************************
    32.  */
    33.  
    34. NSPR_API(PRInt32) PR_Write(PRFileDesc *fd,const void *buf,PRInt32 amount);
    Пояснения:
    NSPR_API - это просто макрос для экспорта или импорта функции.
    Функция возвращает PRInt32 - это просто Integer 32 бита.
    Интересует перевод функции на дельфи - как неправильно сделал это я (без структуры PRFileDesc - она не нужна для доступа).

    Код (Text):
    1. type
    2. PRFileDesc = ^TRFileDesc;
    3. TRFileDesc = pointer; //видимо это неверно, но как иначе я не знаю, поэтому спрашиваю
    4.  
    5. function PR_Write(var fd : PRFileDesc; const Buff; amount : LongInt) : LongInt;
    6. begin
    7. ...
    8. end;
    Спасибо за любую помощь!
     
  2. multiarc

    multiarc New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2008
    Сообщения:
    21
    Адрес:
    РБ Жодино
    ЗЫЫ Не пиши на дельфи (ИМХО), убьёшься апстену с извращениями над совместимостью с некоторыми структурами и типами. Хотя написать можно... и работать будет, просто изврат).
    Код (Text):
    1. type
    2. PRFileDesc = Pointer;
    3. TRFileDesc = record
    4.     methods : ^PRIOMethods;         { the I/O methods table }
    5.     secret : ^PRFilePrivate;              { layer dependent data }
    6.     lower,higher: ^PRFileDesc;         { pointers to adjacent layers }
    7.     procedure dtor(var fd:PRFileDesc);stdcall;//PR_CALLBACK - какой тип соглашения о вызове?{ A destructor function for layer }
    8.    //или
    9.    //procedure dtor(fd:^PRFileDesc);stdcall;
    10.     identity:PRDescIdentity;            { Identity of this particular layer  }
    11. end;
    12.  
    13. //Integer начиная с дельфи 2.0 - 32 бита (4 байта) (сравняли с LongInt)
    14. function PR_Write(fd : ^PRFileDesc; const Buff : Pointer; amount : LongInt) : LongInt;
    15. //или
    16. //function PR_Write(var fd : PRFileDesc; const Buff : Pointer; amount : LongInt) : LongInt;
    17. begin
    18. ...
    19. end;
    Видимо как-то так
     
  3. multiarc

    multiarc New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2008
    Сообщения:
    21
    Адрес:
    РБ Жодино
    соре, кусочек не так, вот так верно :
    Код (Text):
    1. type
    2. PRFileDesc = ^TRFileDesc;
    И если тебе всё таки не упала структура для доступа, но например нужен её размер, то посчитай сколько там она весит, сделай тип массив на столько же элементов, а PRFileDesc указатель на этот тип
    Код (Text):
    1. type
    2. PRFileDesc = ^TRFileDesc;
    3. TRFileDesc = array [0..n] of byte;//n - твой размер -- sizeof(TRFileDesc);
     
  4. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Хех а через что я могу подсчитать?
     
  5. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    multiarc
    Код (Text):
    1. TRFileDesc = array [0..n] of byte;//n - твой размер -- sizeof(TRFileDesc);
    Надёжнее все же ...packed array... - оно как бы гарантирует, что элементы массива не будут выравниваться на бОльшую границу ни при каких условиях.
     
  6. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    CyberManiac
    Спасибо, учту нюанс.
     
  7. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Темку можно закрыть, вопрос решён.