Hi folks!
I'm having issues initializing complex data structures.
matchcontroller.h
Code:
typedef struct { char *key;
char *value;
} matcher;
typedef void(*matchaction)(void);
typedef struct {
matcher **matchers;
matchaction action;
} matchentry;
void matchcontroller(matchentry **entries);
matchcontroller.c
Code:
#include "matchcontroller.h"#include <stdio.h>
#include <stddef.h>
void matchcontroller(matchentry **entries)
{
matchentry *entry = entries[0];
while (NULL != entry) {
printf("Action: %p\n", entry->action);
matcher *matcher = entry->matchers[0];
while (NULL != matcher) {
printf("Key: %s\tValue: %s\n", matcher->key, matcher->value);
matcher += 1;
}
entry += 1;
}
}
prog.c
Code:
#include "matchcontroller.h"
#include <stddef.h>
void setaaeon() {}
void setoriginal() {}
int main(int argc, char **argv)
{
matchentry *entries = {
{
{
{"/sys/devices/virtual/dmi/id/sys_vendor", "AAEON"},
{"/sys/devices/virtual/dmi/id/board_vendor", "AAEON"},
{"/sys/devices/virtual/dmi/id/chassis_vendor", "AAEON"},
NULL
},
setaaeon
},
{
{
{"/sys/devices/virtual/dmi/id/sys_vendor", "JLT_Mobile_Computers"},
{"/sys/devices/virtual/dmi/id/board_vendor", "AMI Corporation"},
{"/sys/devices/virtual/dmi/id/chassis_vendor", "JLT_Mobile_Computers"},
NULL
},
setoriginal
},
};
matchcontroller(entries);
}
Makefile
Code:
CC=gcc
CFLAGS+=-Wall -g
LIBPATH=.
all: prog
clean:
rm -f prog progstatic lib*.so *.a *.o
prog: prog.c libmatchcontroller.so
${CC} ${CFLAGS} -o prog prog.c -L${LIBPATH} -lmatchcontroller
progstatic: prog.c matchcontroller.a
${CC} ${CFLAGS} -o progstatic prog.c matchcontroller.a
.c.o:
${CC} ${CFLAGS} -c -o $@ $<
lib%.so: %.o
${CC} ${CFLAGS} -shared -o $@ $<
%.a: %.o
${AR} rcs $@ $<
And the output when I'm trying to make:
Code:
gcc -Wall -g -c -o matchcontroller.o matchcontroller.c
gcc -Wall -g -shared -o libmatchcontroller.so matchcontroller.o
gcc -Wall -g -o prog prog.c -L. -lmatchcontroller
prog.c: In function ‘main’:
prog.c:9:3: warning: braces around scalar initializer
9 | {
| ^
prog.c:9:3: note: (near initialization for ‘entries’)
prog.c:10:4: warning: braces around scalar initializer
10 | {
| ^
prog.c:10:4: note: (near initialization for ‘entries’)
prog.c:11:5: warning: braces around scalar initializer
11 | {"/sys/devices/virtual/dmi/id/sys_vendor", "AAEON"},
| ^
prog.c:11:5: note: (near initialization for ‘entries’)
prog.c:11:6: warning: initialization of ‘matchentry *’ {aka ‘struct <anonymous> *’} from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
11 | {"/sys/devices/virtual/dmi/id/sys_vendor", "AAEON"},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c:11:6: note: (near initialization for ‘entries’)
prog.c:11:48: warning: excess elements in scalar initializer
11 | {"/sys/devices/virtual/dmi/id/sys_vendor", "AAEON"},
| ^~~~~~~
prog.c:11:48: note: (near initialization for ‘entries’)
prog.c:12:5: warning: braces around scalar initializer
12 | {"/sys/devices/virtual/dmi/id/board_vendor", "AAEON"},
| ^
prog.c:12:5: note: (near initialization for ‘entries’)
prog.c:12:6: warning: initialization of ‘matchentry *’ {aka ‘struct <anonymous> *’} from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
12 | {"/sys/devices/virtual/dmi/id/board_vendor", "AAEON"},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c:12:6: note: (near initialization for ‘entries’)
prog.c:12:50: warning: excess elements in scalar initializer
12 | {"/sys/devices/virtual/dmi/id/board_vendor", "AAEON"},
| ^~~~~~~
prog.c:12:50: note: (near initialization for ‘entries’)
prog.c:12:5: warning: excess elements in scalar initializer
12 | {"/sys/devices/virtual/dmi/id/board_vendor", "AAEON"},
| ^
prog.c:12:5: note: (near initialization for ‘entries’)
prog.c:13:5: warning: braces around scalar initializer
13 | {"/sys/devices/virtual/dmi/id/chassis_vendor", "AAEON"},
| ^
prog.c:13:5: note: (near initialization for ‘entries’)
prog.c:13:6: warning: initialization of ‘matchentry *’ {aka ‘struct <anonymous> *’} from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
13 | {"/sys/devices/virtual/dmi/id/chassis_vendor", "AAEON"},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c:13:6: note: (near initialization for ‘entries’)
prog.c:13:52: warning: excess elements in scalar initializer
13 | {"/sys/devices/virtual/dmi/id/chassis_vendor", "AAEON"},
| ^~~~~~~
prog.c:13:52: note: (near initialization for ‘entries’)
prog.c:13:5: warning: excess elements in scalar initializer
13 | {"/sys/devices/virtual/dmi/id/chassis_vendor", "AAEON"},
| ^
prog.c:13:5: note: (near initialization for ‘entries’)
prog.c:14:5: warning: excess elements in scalar initializer
14 | NULL
| ^~~~
prog.c:14:5: note: (near initialization for ‘entries’)
prog.c:16:4: warning: excess elements in scalar initializer
16 | setaaeon
| ^~~~~~~~
prog.c:16:4: note: (near initialization for ‘entries’)
prog.c:18:3: warning: braces around scalar initializer
18 | {
| ^
prog.c:18:3: note: (near initialization for ‘entries’)
prog.c:19:4: warning: braces around scalar initializer
19 | {
| ^
prog.c:19:4: note: (near initialization for ‘entries’)
prog.c:20:5: warning: braces around scalar initializer
20 | {"/sys/devices/virtual/dmi/id/sys_vendor", "JLT_Mobile_Computers"},
| ^
prog.c:20:5: note: (near initialization for ‘entries’)
prog.c:20:6: warning: initialization of ‘matchentry *’ {aka ‘struct <anonymous> *’} from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
20 | {"/sys/devices/virtual/dmi/id/sys_vendor", "JLT_Mobile_Computers"},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c:20:6: note: (near initialization for ‘entries’)
prog.c:20:48: warning: excess elements in scalar initializer
20 | {"/sys/devices/virtual/dmi/id/sys_vendor", "JLT_Mobile_Computers"},
| ^~~~~~~~~~~~~~~~~~~~~~
prog.c:20:48: note: (near initialization for ‘entries’)
prog.c:21:5: warning: braces around scalar initializer
21 | {"/sys/devices/virtual/dmi/id/board_vendor", "AMI Corporation"},
| ^
prog.c:21:5: note: (near initialization for ‘entries’)
prog.c:21:6: warning: initialization of ‘matchentry *’ {aka ‘struct <anonymous> *’} from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
21 | {"/sys/devices/virtual/dmi/id/board_vendor", "AMI Corporation"},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c:21:6: note: (near initialization for ‘entries’)
prog.c:21:50: warning: excess elements in scalar initializer
21 | {"/sys/devices/virtual/dmi/id/board_vendor", "AMI Corporation"},
| ^~~~~~~~~~~~~~~~~
prog.c:21:50: note: (near initialization for ‘entries’)
prog.c:21:5: warning: excess elements in scalar initializer
21 | {"/sys/devices/virtual/dmi/id/board_vendor", "AMI Corporation"},
| ^
prog.c:21:5: note: (near initialization for ‘entries’)
prog.c:22:5: warning: braces around scalar initializer
22 | {"/sys/devices/virtual/dmi/id/chassis_vendor", "JLT_Mobile_Computers"},
| ^
prog.c:22:5: note: (near initialization for ‘entries’)
prog.c:22:6: warning: initialization of ‘matchentry *’ {aka ‘struct <anonymous> *’} from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
22 | {"/sys/devices/virtual/dmi/id/chassis_vendor", "JLT_Mobile_Computers"},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c:22:6: note: (near initialization for ‘entries’)
prog.c:22:52: warning: excess elements in scalar initializer
22 | {"/sys/devices/virtual/dmi/id/chassis_vendor", "JLT_Mobile_Computers"},
| ^~~~~~~~~~~~~~~~~~~~~~
prog.c:22:52: note: (near initialization for ‘entries’)
prog.c:22:5: warning: excess elements in scalar initializer
22 | {"/sys/devices/virtual/dmi/id/chassis_vendor", "JLT_Mobile_Computers"},
| ^
prog.c:22:5: note: (near initialization for ‘entries’)
prog.c:23:5: warning: excess elements in scalar initializer
23 | NULL
| ^~~~
prog.c:23:5: note: (near initialization for ‘entries’)
prog.c:25:4: warning: excess elements in scalar initializer
25 | setoriginal
| ^~~~~~~~~~~
prog.c:25:4: note: (near initialization for ‘entries’)
prog.c:18:3: warning: excess elements in scalar initializer
18 | {
| ^
prog.c:18:3: note: (near initialization for ‘entries’)
prog.c:28:18: warning: passing argument 1 of ‘matchcontroller’ from incompatible pointer type [-Wincompatible-pointer-types]
28 | matchcontroller(entries);
| ^~~~~~~
| |
| matchentry * {aka struct <anonymous> *}
In file included from prog.c:1:
matchcontroller.h:10:35: note: expected ‘matchentry **’ {aka ‘struct <anonymous> **’} but argument is of type ‘matchentry *’ {aka ‘struct <anonymous> *’}
10 | void matchcontroller(matchentry **entries);
| ~~~~~~~~~~~~~^~~~~~~
rm matchcontroller.o
It's probably not difficult, but I'm no longer seeing the wood for the trees..
Thanks for helping!