1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
5 
6 #include <stdio.h>
7 #include "mpi.h"
8 #include "mpitest.h"
9 
main(int argc,char * argv[])10 int main(int argc, char *argv[])
11 {
12     int errs = 0;
13     int position, pack_size, i;
14     int dis[2], blklens[2];
15     MPI_Datatype type;
16     int send_buffer[60];
17     int recv_buffer[60];
18     int pack_buffer[1000];
19 
20     MTest_Init(&argc, &argv);
21 
22     /* Initialize data in the buffers */
23     for (i = 0; i < 60; i++) {
24         send_buffer[i] = i;
25         recv_buffer[i] = -1;
26         pack_buffer[i] = -2;
27     }
28 
29     /* Create an indexed type with an empty first block */
30     dis[0] = 0;
31     dis[1] = 20;
32 
33     blklens[0] = 0;
34     blklens[1] = 40;
35 
36     MPI_Type_indexed(2, blklens, dis, MPI_INT, &type);
37     MPI_Type_commit(&type);
38 
39     position = 0;
40     MPI_Pack(send_buffer, 1, type, pack_buffer, sizeof(pack_buffer), &position, MPI_COMM_WORLD);
41     pack_size = position;
42     position = 0;
43     MPI_Unpack(pack_buffer, pack_size, &position, recv_buffer, 1, type, MPI_COMM_WORLD);
44 
45     /* Check that the last 40 entries of the recv_buffer have the corresponding
46      * elements from the send buffer */
47     for (i = 0; i < 20; i++) {
48         if (recv_buffer[i] != -1) {
49             errs++;
50             fprintf(stderr, "recv_buffer[%d] = %d, should = -1\n", i, recv_buffer[i]);
51         }
52     }
53     for (i = 20; i < 60; i++) {
54         if (recv_buffer[i] != i) {
55             errs++;
56             fprintf(stderr, "recv_buffer[%d] = %d, should = %d\n", i, recv_buffer[i], i);
57         }
58     }
59     MPI_Type_free(&type);
60 
61     MTest_Finalize(errs);
62     return MTestReturnValue(errs);
63 }
64