Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Passing an array of struct to function

Reply
Thread Tools

Passing an array of struct to function

 
 
arnuld
Guest
Posts: n/a
 
      11-18-2008
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]$



--
www.lispmachine.wordpress.com
my email is @ the above blog.


 
Reply With Quote
 
 
 
 
Nate Eldredge
Guest
Posts: n/a
 
      11-18-2008
arnuld <(E-Mail Removed)> writes:

> 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]$

 
Reply With Quote
 
 
 
 
Nick Keighley
Guest
Posts: n/a
 
      11-18-2008
On 18 Nov, 08:06, arnuld <(E-Mail Removed)> wrote:

> 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!"
 
Reply With Quote
 
Nick Keighley
Guest
Posts: n/a
 
      11-18-2008
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;
}

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Can *common* struct-members of 2 different struct-types, that are thesame for the first common members, be accessed via pointer cast to either struct-type? John Reye C Programming 28 05-08-2012 12:24 AM
length of an array in a struct in an array of structs in a struct in an array of structs Tuan Bui Perl Misc 14 07-29-2005 02:39 PM
passing pointer->struct->pointer->struct to function. .. ?? beetle C Programming 2 01-25-2005 06:08 PM
Access from function in struct (pointer to function) to other items in the struct (advanced) Ole C Programming 4 10-26-2004 09:43 PM
struct my_struct *p = (struct my_struct *)malloc(sizeof(struct my_struct)); Chris Fogelklou C Programming 36 04-20-2004 08:27 AM



Advertisments