Unfortunately, that's a hard thing to do in C without some sort of preprocessing before compilation. You'll need to write special pack and unpack routines for any struct you want to pack, for example:
struct foo {
int *values; /* vector of (length) elements */
short length;
double perf;
int flags;
};
int
pkfoo(foop, cnt, std)
struct foo *foop; /* vector of foos */
int cnt; /* number of foos */
int std; /* stride between foos */
{
int cc;
while (cnt-- > 0) {
if (cc = pvm_packf("%hd %*d %lf %d",
foop->length,
(int)foop->length,
foop->values,
foop->perf,
foop->flags))
return cc;
foop += std;
}
return PvmOk;
}
int
upkfoo(foop, cnt, std)
struct foo *foop;
int cnt;
int std;
{
int cc;
while (cnt-- > 0) {
if ((cc = pvm_unpackf("%hd", &foop->length))
|| (!(foop->values = (int*)malloc(foop->length
* sizeof(int)))
&& (cc = PvmNoMem))
|| (cc = pvm_packf("%*d %lf %d",
(int)foop->length,
foop->values,
&foop->perf,
&foop->flags)))
return cc;
foop += std;
}
return PvmOk;
}
Note that if the struct contains only primitive types (or other structs that contain only primitive types), that is, no pointers, and you're passing it to a host of identical type (not just one with the same data representations (because they might not build structs the same way)), you could get away with:
struct foo foo1;
pvm_pkbyte((char*)&foo1, n * sizeof(struct foo), 1);
...
pvm_upkbyte((char*)&foo1, n * sizeof(struct foo), 1);