next up previous contents
Next: Передача и прием данных Up: Обмен сообщениями Previous: Буферы сообщений   Contents

Упаковка данных

Каждая из следующих подпрограмм C упаковывает массив предоставленных данных определенного типа в активный буфер передачи. Они могут быть вызваны сколько угодно раз для упаковки данных в одно сообщение. Так, сообщение может содержать несколько массивов с данными различных типов. C-структуры в процессе упаковки должны принимать их индивидуальные элементы. На комплексность упаковываемых данных ограничений не накладывается, но приложение должно распаковывать сообщения точно в соответствии с тем, как они были упакованы. Этого требует практика безопасного программирования.

Аргументами для каждой из подпрограмм являются: указатель на первый из элементов для упаковки, nitem - суммарное число элементов для упаковки из данного массива и stride - ``шаг'' для использования во время упаковки. Шаг, равный 1, означает последовательную упаковку вектора, равный 2 - упаковку ``через раз'' и т.д. Исключение составляет подпрограмма pvm_pkstr(), которая завершает упаковку строки символов при появлении NULL и поэтому не требует наличия аргументов nitem и stride.

PVM также поддерживает подпрограммы упаковки с printf - подобными форматами выражений, которые указывают, как и какие данные упаковывать в буфер передачи. Все переменные передаются через адреса - если указаны счетчик и шаг; в противном случае, предполагается, что переменные будут передаваться значениями.

int info = pvm_pkbyte( char *cp, int nitem,

    int stride)

int info = pvm_pkcplx( float *xp, int nitem,

    int stride)

int info = pvm_pkdcplx( double *zp, int nitem,

    int stride)

int info = pvm_pkdouble( double *dp, int nitem,

    int stride)

int info = pvm_pkfloat( float *fp, int nitem,

    int stride)

int info = pvm_pkint( int *np, int nitem,

    int stride)

int info = pvm_pklong( long *np, int nitem,

    int stride)

int info = pvm_pkshort( short *np, int nitem,

    int stride)

int info = pvm_pkstr( char *cp)

int info = pvm_packfconst( char fmt, ...)

Единственная подпрограмма на Фортране реализует все упаковочные функции перечисленных подпрограмм на C.

call pvmfpack( what, xp, nitem, stride, info)
Аргумент xp - это первый элемент для упаковки из массива. Заметьте, что на Фортране количество символов в упаковываемой строке должно указываться через nitem. Целое число what указывает тип упаковываемых данных. Поддерживаются следующие опции.

STRING 0 REAL4 4
BYTE 1 COMPLEX8 5
INTEGER2 2 REAL8 6
INTEGER4 3 COMPLEX16 7

Эти имена уже предопределены в параметрических конструкциях заголовочного файла /pvm3/include/pvm3.h. Ряд производителей может расширять этот список и включать в него поддержку 64-битных архитектур в своей реализации. INTEGER8, REAL16 и др. уже будут добавлены, как только будет реализована XDR-поддержка этих типов данных.



2004-06-22