#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define ROW_PTR_BLOCK_SIZE(TYPE, ROW_COUNT) ROW_COUNT * sizeof(TYPE *)
#define ROW_BLOCK_SIZE(TYPE, COL_COUNT) COL_COUNT * sizeof(TYPE)
#define BLOCK_SIZE(TYPE, ROW_COUNT, COL_COUNT) ROW_PTR_BLOCK_SIZE(TYPE, ROW_COUNT) + ROW_COUNT * ROW_BLOCK_SIZE(TYPE, COL_COUNT)
#define ALLOCATE(STACK_TOP, TARGET, TYPE, COUNT) do{TARGET = (TYPE *)STACK_TOP; STACK_TOP += COUNT * sizeof(TYPE);}while(0)
int func(int a1_row, int a1_col, int a2_row, int a2_col, int a3_row, int a3_col, double ***a1_dst, int ***a2_dst, float ***a3_dst)
{
char *stack[3];
char *stack_top[3];
int stack_size[3] =
{
BLOCK_SIZE(double, a1_row, a1_col),
BLOCK_SIZE(int, a2_row, a2_col),
BLOCK_SIZE(float, a3_row, a3_col)
};
double **a1 = NULL;
int **a2 = NULL;
float **a3 = NULL;
int i;
int succeeded = 1;
for(i = 0; i < 3 && succeeded; ++i)
{
stack_top
[i
] = stack
[i
] = (char *)malloc(stack_size
[i
]); if(!stack[i])
succeeded = 0;
}
if(!succeeded)
{
for(i = 0; i < 3; ++i)
if(!stack[i])
break;
for(i = i - 1; i >= 0; --i)
return 0;
}
ALLOCATE(stack_top[0], a1, double *, a1_row);
for(i = 0; i < a1_row; ++i)
ALLOCATE(stack_top[0], a1[i], double, a1_col);
ALLOCATE(stack_top[1], a2, int *, a2_row);
for(i = 0; i < a2_row; ++i)
ALLOCATE(stack_top[1], a2[i], int, a2_col);
ALLOCATE(stack_top[2], a3, float *, a3_row);
for(i = 0; i < a3_row; ++i)
ALLOCATE(stack_top[2], a3[i], float, a3_col);
assert(stack
[0] + stack_size
[0] == stack_top
[0]); assert(stack
[1] + stack_size
[1] == stack_top
[1]); assert(stack
[2] + stack_size
[2] == stack_top
[2]);
*a1_dst = a1;
*a2_dst = a2;
*a3_dst = a3;
return 1;
}
#define A1_ROW (300)
#define A1_COL (200)
#define A2_ROW (400)
#define A2_COL (300)
#define A3_ROW (500)
#define A3_COL (400)
int main(void)
{
double **a1 = NULL;
int **a2 = NULL;
float **a3 = NULL;
int result = func(A1_ROW, A1_COL, A2_ROW, A2_COL, A3_ROW, A3_COL, &a1, &a2, &a3);
printf("result = %d\n", result
);
if(result)
{
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2RlZmluZSBST1dfUFRSX0JMT0NLX1NJWkUoVFlQRSwgUk9XX0NPVU5UKSBST1dfQ09VTlQgKiBzaXplb2YoVFlQRSAqKQojZGVmaW5lIFJPV19CTE9DS19TSVpFKFRZUEUsIENPTF9DT1VOVCkgQ09MX0NPVU5UICogc2l6ZW9mKFRZUEUpCiNkZWZpbmUgQkxPQ0tfU0laRShUWVBFLCBST1dfQ09VTlQsIENPTF9DT1VOVCkgUk9XX1BUUl9CTE9DS19TSVpFKFRZUEUsIFJPV19DT1VOVCkgKyBST1dfQ09VTlQgKiBST1dfQkxPQ0tfU0laRShUWVBFLCBDT0xfQ09VTlQpCiNkZWZpbmUgQUxMT0NBVEUoU1RBQ0tfVE9QLCBUQVJHRVQsIFRZUEUsIENPVU5UKSBkb3tUQVJHRVQgPSAoVFlQRSAqKVNUQUNLX1RPUDsgU1RBQ0tfVE9QICs9IENPVU5UICogc2l6ZW9mKFRZUEUpO313aGlsZSgwKQoKaW50IGZ1bmMoaW50IGExX3JvdywgaW50IGExX2NvbCwgaW50IGEyX3JvdywgaW50IGEyX2NvbCwgaW50IGEzX3JvdywgaW50IGEzX2NvbCwgZG91YmxlICoqKmExX2RzdCwgaW50ICoqKmEyX2RzdCwgZmxvYXQgKioqYTNfZHN0KQp7CiAgICBjaGFyICpzdGFja1szXTsKCWNoYXIgKnN0YWNrX3RvcFszXTsKCWludCBzdGFja19zaXplWzNdID0KCXsKCQlCTE9DS19TSVpFKGRvdWJsZSwgYTFfcm93LCBhMV9jb2wpLAoJCUJMT0NLX1NJWkUoaW50LCBhMl9yb3csIGEyX2NvbCksCgkJQkxPQ0tfU0laRShmbG9hdCwgYTNfcm93LCBhM19jb2wpCgl9OwoKCWRvdWJsZSAqKmExID0gTlVMTDsKCWludCAqKmEyID0gTlVMTDsKCWZsb2F0ICoqYTMgPSBOVUxMOwoJaW50IGk7CglpbnQgc3VjY2VlZGVkID0gMTsKCglmb3IoaSA9IDA7IGkgPCAzICYmIHN1Y2NlZWRlZDsgKytpKQoJewoJCXN0YWNrX3RvcFtpXSA9IHN0YWNrW2ldID0gKGNoYXIgKiltYWxsb2Moc3RhY2tfc2l6ZVtpXSk7CgkJaWYoIXN0YWNrW2ldKQoJCQlzdWNjZWVkZWQgPSAwOwoJfQoKCWlmKCFzdWNjZWVkZWQpCgl7CgkJZm9yKGkgPSAwOyBpIDwgMzsgKytpKQoJCQlpZighc3RhY2tbaV0pCgkJCQlicmVhazsKCQlmb3IoaSA9IGkgLSAxOyBpID49IDA7IC0taSkKCQkJZnJlZShzdGFja1tpXSk7CgkJcmV0dXJuIDA7Cgl9CgoJQUxMT0NBVEUoc3RhY2tfdG9wWzBdLCBhMSwgZG91YmxlICosIGExX3Jvdyk7Cglmb3IoaSA9IDA7IGkgPCBhMV9yb3c7ICsraSkKCQlBTExPQ0FURShzdGFja190b3BbMF0sIGExW2ldLCBkb3VibGUsIGExX2NvbCk7CgoJQUxMT0NBVEUoc3RhY2tfdG9wWzFdLCBhMiwgaW50ICosIGEyX3Jvdyk7Cglmb3IoaSA9IDA7IGkgPCBhMl9yb3c7ICsraSkKCQlBTExPQ0FURShzdGFja190b3BbMV0sIGEyW2ldLCBpbnQsIGEyX2NvbCk7CgkKCUFMTE9DQVRFKHN0YWNrX3RvcFsyXSwgYTMsIGZsb2F0ICosIGEzX3Jvdyk7Cglmb3IoaSA9IDA7IGkgPCBhM19yb3c7ICsraSkKCQlBTExPQ0FURShzdGFja190b3BbMl0sIGEzW2ldLCBmbG9hdCwgYTNfY29sKTsKCglhc3NlcnQoc3RhY2tbMF0gKyBzdGFja19zaXplWzBdID09IHN0YWNrX3RvcFswXSk7Cglhc3NlcnQoc3RhY2tbMV0gKyBzdGFja19zaXplWzFdID09IHN0YWNrX3RvcFsxXSk7Cglhc3NlcnQoc3RhY2tbMl0gKyBzdGFja19zaXplWzJdID09IHN0YWNrX3RvcFsyXSk7CgoJKmExX2RzdCA9IGExOwoJKmEyX2RzdCA9IGEyOwoJKmEzX2RzdCA9IGEzOwoKCXJldHVybiAxOwp9CgojZGVmaW5lIEExX1JPVyAoMzAwKQojZGVmaW5lIEExX0NPTCAoMjAwKQojZGVmaW5lIEEyX1JPVyAoNDAwKQojZGVmaW5lIEEyX0NPTCAoMzAwKQojZGVmaW5lIEEzX1JPVyAoNTAwKQojZGVmaW5lIEEzX0NPTCAoNDAwKQoKaW50IG1haW4odm9pZCkKewoJZG91YmxlICoqYTEgPSBOVUxMOwoJaW50ICoqYTIgPSBOVUxMOwoJZmxvYXQgKiphMyA9IE5VTEw7CglpbnQgcmVzdWx0ID0gZnVuYyhBMV9ST1csIEExX0NPTCwgQTJfUk9XLCBBMl9DT0wsIEEzX1JPVywgQTNfQ09MLCAmYTEsICZhMiwgJmEzKTsKCQoJcHJpbnRmKCJyZXN1bHQgPSAlZFxuIiwgcmVzdWx0KTsKCglpZihyZXN1bHQpCgl7CgkJZnJlZShhMSk7CgkJZnJlZShhMik7CgkJZnJlZShhMyk7Cgl9CgoJcmV0dXJuIDA7Cn0=