Thread: Initializing complex data structures

  1. #1
    Registered User
    Join Date
    Jul 2021
    Posts
    3

    Initializing complex data structures

    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!

  2. #2
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,661
    You need to declare some variables, you can't just point at anonymous initialised memory (except for strings).

    Something like this perhaps.
    Code:
      matcher m1[] = {
            {"/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
      };
      matcher m2[] = {
            {"/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
      };
      matchentry entries[] = {
        {
          &m1,  // your double ** seems awkward now.
          setaaeon
        },
        {
          &m2,
          setoriginal
        },
      };
      matchcontroller(entries);
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Initializing an array of static structures
    By rakeshkool27 in forum C Programming
    Replies: 4
    Last Post: 11-19-2012, 09:16 AM
  2. Help needed with complex array of pointer to structures
    By zahid990170 in forum C Programming
    Replies: 3
    Last Post: 06-14-2011, 01:46 PM
  3. Complex Structures
    By JJ007 in forum C Programming
    Replies: 3
    Last Post: 10-27-2009, 09:47 AM
  4. Complex numbers and C structures
    By overlord21 in forum C Programming
    Replies: 20
    Last Post: 09-20-2008, 09:25 AM
  5. Complex numbers and C structures help
    By overlord21 in forum C Programming
    Replies: 1
    Last Post: 09-10-2008, 08:24 AM

Tags for this Thread