summaryrefslogtreecommitdiff
path: root/funcptrptr.c
diff options
context:
space:
mode:
Diffstat (limited to 'funcptrptr.c')
-rw-r--r--funcptrptr.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/funcptrptr.c b/funcptrptr.c
new file mode 100644
index 0000000..fdc1542
--- /dev/null
+++ b/funcptrptr.c
@@ -0,0 +1,78 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+int doub(int);
+int trip(int);
+int half(int);
+void fpv_exec(int (**fpv)(int), int n);
+void fpvv_exec(int (***fpvv)(int), int n);
+void fpvvv_exec(int (****fpvvv)(int), int n);
+
+int doub(int i) {
+ return i * 2;
+}
+
+int trip(int i) {
+ return i * 3;
+}
+
+int half(int i) {
+ return i / 2;
+}
+
+void fpv_exec(int (**fpv)(int), int n) {
+ int i;
+ for (i = 0; *(fpv + i) != NULL; i++) {
+ printf("%d\n", (*(fpv + i))(n));
+ }
+}
+
+void fpvv_exec(int (***fpvv)(int), int n) {
+ int i;
+ for (i = 0; *(fpvv + i) != NULL; i++) {
+ fpv_exec(*(fpvv + i), n);
+ }
+}
+
+void fpvvv_exec(int (****fpvvv)(int), int n) {
+ int i;
+ for (i = 0; *(fpvvv + i) != NULL; i++) {
+ fpvv_exec(*(fpvvv + i), n);
+ }
+}
+
+int main(int argc, char **argv) {
+ int (****fpvvv)(int);
+ fpvvv = calloc(2, sizeof(int (***)(int)));
+
+ fpvvv[0] = calloc(2, sizeof(int (**)(int)));
+ fpvvv[1] = calloc(2, sizeof(int (**)(int)));
+
+ fpvvv[0][0] = calloc(4, sizeof(int (*)(int)));
+ fpvvv[0][1] = calloc(4, sizeof(int (*)(int)));
+ fpvvv[1][0] = calloc(4, sizeof(int (*)(int)));
+ fpvvv[1][1] = calloc(4, sizeof(int (*)(int)));
+
+ fpvvv[0][0][0] = doub;
+ fpvvv[0][0][1] = trip;
+ fpvvv[0][0][2] = half;
+ fpvvv[0][0][3] = NULL;
+ fpvvv[0][1][0] = doub;
+ fpvvv[0][1][1] = trip;
+ fpvvv[0][1][2] = half;
+ fpvvv[0][1][3] = NULL;
+ fpvvv[1][0][0] = doub;
+ fpvvv[1][0][1] = trip;
+ fpvvv[1][0][2] = half;
+ fpvvv[1][0][3] = NULL;
+ fpvvv[1][1][0] = doub;
+ fpvvv[1][1][1] = trip;
+ fpvvv[1][1][2] = half;
+ fpvvv[1][1][3] = NULL;
+
+ for (argv++, argc--; argc; argv++, argc--) {
+ fpvvv_exec(fpvvv, atoi(*argv));
+ }
+
+ exit(EXIT_SUCCESS);
+}