Passing an array of struct to function

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • arnuld

    Passing an array of struct to function

    I am passing an array of struct to a function to print its value. First
    I am getting Segfaults and weired values. 2nd, is there any elegant way to
    do this ?



    /* Learning how to use an array of struct */


    #include <stdio.h>
    #include <stdlib.h>

    enum { ARR_SIZE = 1 };

    struct two_elem { char ch; char* word; };


    void print_twoelem( struct two_elem*);


    int main(void)
    {

    struct two_elem arr[ARR_SIZE];

    char arr1[] = "ARNULD";
    char arr2[] = "UTTRE";

    struct two_elem s1;
    struct two_elem s2;

    s1.ch = 'a';
    s1.word = arr1;
    s2.ch = 'b';
    s2.word = arr2;

    arr[1] = s1;
    arr[2] = s2;

    /* this is fine as we are passing a point to the first element which is struct
    two_ele and this is what exactly rquired by the function
    */
    print_twoelem( arr );


    return 0;
    }



    void print_twoelem( struct two_elem* p )
    {
    printf("first element = %c, || %s\n", p->ch, p->word);
    ++p;
    printf("second element = %c, || %s\n", p->ch, p->word);
    }

    =============== ====== OUTPUT =============== ===============
    [arnuld@dune C]$ gcc4 -ansi -pedantic -Wall -Wextra array-of-struct.c
    [arnuld@dune C]$ ./a.out
    first element = n, || <-
    second element = a, || ARNULD
    Segmentation fault
    [arnuld@dune C]$



    --

    my email is @ the above blog.


  • Richard Heathfield

    #2
    Re: Passing an array of struct to function

    arnuld said:
    I am passing an array of struct to a function to print its value. First
    I am getting Segfaults and weired values. 2nd, is there any elegant way
    to do this ?
    >
    /* Learning how to use an array of struct */
    >
    >
    #include <stdio.h>
    #include <stdlib.h>
    >
    enum { ARR_SIZE = 1 };
    >
    struct two_elem { char ch; char* word; };
    >
    >
    void print_twoelem( struct two_elem*);
    >
    >
    int main(void)
    {
    >
    struct two_elem arr[ARR_SIZE];
    If you're going to put two elements into this array, why do you define it
    to have room for only one element?

    The answer to your second question is "yes".

    --
    Richard Heathfield <http://www.cpax.org.uk >
    Email: -http://www. +rjh@
    Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
    "Usenet is a strange place" - dmr 29 July 1999

    Comment

    • Nate Eldredge

      #3
      Re: Passing an array of struct to function

      arnuld <sunrise@invali d.addresswrites :
      I am passing an array of struct to a function to print its value. First
      I am getting Segfaults and weired values. 2nd, is there any elegant way to
      do this ?
      >
      >
      >
      /* Learning how to use an array of struct */
      >
      >
      #include <stdio.h>
      #include <stdlib.h>
      >
      enum { ARR_SIZE = 1 };
      >
      struct two_elem { char ch; char* word; };
      >
      >
      void print_twoelem( struct two_elem*);
      >
      >
      int main(void)
      {
      >
      struct two_elem arr[ARR_SIZE];
      ARR_SIZE is 1. I think you want it to be 2.
      >
      char arr1[] = "ARNULD";
      char arr2[] = "UTTRE";
      >
      struct two_elem s1;
      struct two_elem s2;
      >
      s1.ch = 'a';
      s1.word = arr1;
      s2.ch = 'b';
      s2.word = arr2;
      >
      arr[1] = s1;
      arr[2] = s2;
      Remember C arrays are indexed from zero. So you want to assign to
      arr[0] and arr[1].

      You could also do this more concisely with something like

      struct two_elem arr[2] = { { 'a', "ARNULD" }, { 'b', "UTTRE" } };

      The only difference being that in my version you cannot overwrite the
      strings "ARNULD" and "UTTRE" (though you could set the pointers
      arr[0].word and arr[1].word to point to some different strings). But
      your program doesn't do that anyway.
      /* this is fine as we are passing a point to the first element which is struct
      two_ele and this is what exactly rquired by the function
      */
      You might find it more helpful to think that the array decays to a
      pointer to its *zeroth* element. I.e. passing `arr' to the function is
      the same as passing `&(arr[0])'.
      print_twoelem( arr );
      >
      >
      return 0;
      }
      >
      >
      >
      void print_twoelem( struct two_elem* p )
      {
      printf("first element = %c, || %s\n", p->ch, p->word);
      ++p;
      printf("second element = %c, || %s\n", p->ch, p->word);
      }
      >
      =============== ====== OUTPUT =============== ===============
      [arnuld@dune C]$ gcc4 -ansi -pedantic -Wall -Wextra array-of-struct.c
      [arnuld@dune C]$ ./a.out
      first element = n, || <-
      second element = a, || ARNULD
      Segmentation fault
      [arnuld@dune C]$

      Comment

      • Nick Keighley

        #4
        Re: Passing an array of struct to function

        On 18 Nov, 08:06, arnuld <sunr...@invali d.addresswrote:
        I am passing an array of struct to a function to print its value. First
        I am getting Segfaults and weired values. 2nd, is there any elegant way to
        do this ?
        >
        /* Learning how to use an array of struct */
        >
        #include <stdio.h>
        #include <stdlib.h>
        >
        enum { ARR_SIZE = 1 };
        that's an unusual size for an array


        struct two_elem { char ch; char* word; };
        >
        void print_twoelem( struct two_elem*);
        >
        int main(void)
        {
        >
          struct two_elem arr[ARR_SIZE];
        >
          char arr1[] = "ARNULD";
          char arr2[] = "UTTRE";
        >
          struct two_elem s1;
          struct two_elem s2;
        >
          s1.ch = 'a';
          s1.word = arr1;
          s2.ch = 'b';
          s2.word = arr2;
        >
          arr[1] = s1;
        oops. You accessed the second element of a single element array.
          arr[2] = s2;
        oops. You accessed the third element of a single element array.
        C arrays start from zero
          /* this is fine as we are passing a point to the first element which is struct
             two_ele and this is what exactly rquired by the function
          */
        yes
          print_twoelem( arr );
        >
          return 0;
        >
        }
        >
        void print_twoelem( struct two_elem* p )
        {
          printf("first element  = %c, || %s\n", p->ch, p->word);
        you access the uninitialised 1st element
          ++p;
          printf("second element = %c, || %s\n", p->ch, p->word);
        you access the non-existent 2nd element

        >
        }
        >
        =============== ====== OUTPUT =============== ===============
        [arnuld@dune C]$ gcc4 -ansi -pedantic -Wall -Wextra array-of-struct.c
        [arnuld@dune C]$ ./a.out
        first element  = n, || <-
        second element = a, || ARNULD
        Segmentation fault
        quite

        this is how I'd write it (some things are just different personnel
        style)

        *************** *************** *************** *************** ***

        #include <stdio.h>
        #include <stdlib.h>

        #define ARR_SIZE 2

        #define ARRAY_SIZE(A) sizeof(A)/sizeof(*A)

        typedef struct
        {
        char ch;
        char* word;
        } Two_elem;

        void print_twoelem (const Two_elem p[], int n)
        {
        int i;

        for (i = 0; i < n; i++)
        printf ("first element = %c, || %s\n", p[i].ch, p[i].word);
        }

        int main (void)
        {
        Two_elem arr [ARR_SIZE];
        char arr1[] = "ARNULD";
        char arr2[] = "UTTRE";
        Two_elem s1;
        Two_elem s2;

        s1.ch = 'a';
        s1.word = arr1;
        s2.ch = 'b';
        s2.word = arr2;

        arr [0] = s1;
        arr [1] = s2;

        print_twoelem (arr, ARRAY_SIZE (arr));

        return 0;
        }

        --
        Nick Keighley

        "That's right!" shouted Vroomfondel "we demand rigidly defined
        areas of doubt and uncertainty!"

        Comment

        • Nick Keighley

          #5
          Re: Passing an array of struct to function

          or

          #include <stdio.h>
          #include <stdlib.h>

          #define ARRAY_SIZE(A) sizeof(A)/sizeof(*A)

          typedef struct
          {
          char ch;
          char* word;
          } Two_elem;

          void print_twoelem (const Two_elem p[], int n)
          {
          int i;

          for (i = 0; i < n; i++)
          printf ("first element = %c, || %s\n", p[i].ch, p[i].word);
          }

          int main (void)
          {
          Two_elem arr [] = {{'a', "ARNULD"}, {'b', "UTTRE"}};

          print_twoelem (arr, ARRAY_SIZE (arr));

          return 0;
          }

          Comment

          Working...