source: SHX/trunk/sandbox/voidtest.c @ 130

Revision 130, 1.9 KB checked in by marcus, 11 years ago (diff)
  • some pointer arithmetic tests
Line 
1/*
2 * test of void pointer access
3 * gcc -shared -o voidtest.so voidtest.c
4 */
5
6#include <malloc.h>
7#include <stdio.h>
8
9#define LENGTH 5
10
11typedef struct voidtest {
12    unsigned int num;
13    short data;
14    void *pnt[2];
15} VOIDTEST;
16
17static VOIDTEST foo[2];
18static float data[LENGTH];
19
20VOIDTEST *getroot() {
21    return foo;
22}
23
24float *getdata() {
25    return data;
26}
27
28void init() {
29    VOIDTEST *ptr, *ptr2;
30    int i;
31
32    foo[0].num = 43;
33    puts("you called init!");
34
35    /* first one */
36    ptr = (VOIDTEST *)malloc((int)sizeof(VOIDTEST));
37    ptr->num = 122;
38    ptr->data = 2;
39    /* data referenced in both structs */
40    ptr->pnt[1] = data;
41
42    foo[0].pnt[0] = ptr;
43    foo[0].pnt[1] = NULL;
44
45    /* second one */
46    ptr2 = (VOIDTEST *)malloc((int)sizeof(VOIDTEST));
47    ptr2->num = 133;
48    ptr2->data = 1;
49    ptr2->pnt[0] = NULL;
50    /* data referenced in both structs */
51    ptr2->pnt[1] = data;
52
53    /* save reference to second struct */
54    ptr->pnt[0] = ptr2;
55
56    /* init data */
57    for (i=0;i<LENGTH;data[i++]=i*1.1) {}
58}
59
60void resolve() {
61    VOIDTEST *ptr;
62    float *y;
63    unsigned int i;
64
65    //~ printf("%u\n", foo->num);
66
67    ptr = foo[0].pnt[0];
68    //~ while (ptr->pnt[0] != NULL) {
69        //~ printf("here is %u\n", ptr->num);
70        //~ ptr = (VOIDTEST *)ptr->pnt[0];
71    //~ }
72
73    printf("last one: %u - data? %s\n", ptr->num, (ptr->data != 0 ? "Y" : "N"));
74
75    for (i=0; i<LENGTH; i++) {
76        y = ptr->pnt[1] + (i*sizeof(float));
77        printf("%.2f\n", *y);
78    }
79}
80
81void inspect() {
82    VOIDTEST *bar;
83
84    bar = getroot();
85    printf("inspect: %p = Addr foo\n", &foo);
86    printf("inspect: %p = Addr getroot\n", bar);
87
88    printf("inspect: %p = Addr one\n", bar[0].pnt[0]);
89
90    //~ bar = bar[0].pnt[0];
91    //~ printf("%u\n", bar->data);
92
93    printf("inspect: %p = Addr of floats\n", &data);
94}
95
96int main() {
97    init();
98    resolve();
99    inspect();
100}
Note: See TracBrowser for help on using the repository browser.