Каждая из следующих C-подпрограмм упаковывает массив предоставленных данных определенного типа в активный буфер передачи. Они могут быть вызваны сколь угодно раз для упаковки данных в одно сообщение. Так, сообщение может содержать несколько массивов с данными различных типов. C-структуры, в процессе упаковки, должны принимать их индивидуальные элементы. На комплексность упаковываемых данных ограничений не накладывается, но приложение должно распаковывать сообщения точно в соответствие тому, как они были упакованы. Хотя этого строго и не требуется, но сложилась практика безопасного программирования.
Аргументами для каждой из подпрограмм являются: указатель на первый из элементов для упаковки, nitem - суммарное число элементов для упаковки из данного массива и stride - "шаг" для использования во время упаковки. Шаг, равный 1, означает последовательную упаковку вектора, равный 2 - упаковку "через раз" и т.д. Исключение составляет pvm_pkstr(), которая завершает упаковку строки символов при "встрече" NULL и поэтому не требует наличия аргументов nitem и stride.
ПВМ так же поддерживает подпрограммы упаковки с printf-подобным форматами выражений, которыми указывается, какие данные упаковывать в буфер передачи и как. Все переменные передаются через адреса - если указаны счетчик и шаг; в противном случае, предполагается, что переменные будут передаваться значениями.
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, ...)
STRING 0 | REAL4 4
BYTE 1 |
Эти имена уже предопределены в параметрических конструкциях включаемого файла /pvm3/include/pvm3.h. Ряд производителей может расширять этот список и включать в него поддержку 64-битных архитектур в своей реализации. INTEGER8, REAL16 и др. будут добавлены, как только XDR-поддержка этих типов данных будет реализована.