Register to reply

Segmentation fault (core dumped) C error for structures

by Fb.Researcher
Tags: segmentation fault, structure
Share this thread:
Fb.Researcher
#1
Dec26-12, 12:37 AM
P: 7
I have written a C program that produce a structure, give it's elements their initial values and change these values when neccessary.I can compile my program but when I try to run it,error:"segmentation fault(core dumped)" appears.I commented different parts of my program and I underentood the problem is related to my structur.The code is:

#define PN 5000 //number of players I chose
#define RN 10 //number of array's rows
#define N number of array's columns 
enum logical {W,R};

main()
{
   int j=0,i=0,logic=R,r[100000]={0};
   struct plrrecord
   {
   int n;//identity number of the player
   short int lfstat;//life status: dead or alive
   short int ch[RN][N];
   };

   struct plrrecord plr[PN];


    while(   i<PN  ) 
   {
       r[i]=(int)(drand48() * 10000);
       for( j=0 ; j<i ; j++)		 
       {    if( r[j]==r[i] )logic=W;}  
       if( logic==R )
       {
            cplr[r[i]].n=r[i];
            i++;
       }
       else { logic = R; }
   }
   for(i=0;i<PN;i++)
        printf("%i\t",cplr[i].n);/****/
return 0;
}
In my program there are many players,I give to 5000 of them a number netween 0 to 10000
which should not be repeated.I check if their number is repeated in a "while-loop".The "logic" varible helps me here.If it's value is "R" then the number is not repeated.If it's vlue is "w" then I should chose another number.The array "r" saves the random numbers chsen before.
Now I think the error is related to the line with printf,I put a /****/ in that line,because when I comment this line thre is no error anymore.
What do you thik yhe problem is?
How do you think we can solve this problem?
Phys.Org News Partner Science news on Phys.org
Sapphire talk enlivens guesswork over iPhone 6
Geneticists offer clues to better rice, tomato crops
UConn makes 3-D copies of antique instrument parts
Borek
#2
Dec26-12, 03:04 AM
Admin
Borek's Avatar
P: 23,369
Plenty of problems, I doubt what you posted compiles.

Why do you use drand48() instead of a simple rand()? What is the maximum possible value of (int)(drand48()*10000)?
chiro
#3
Dec26-12, 03:54 AM
P: 4,572
100% agree with Borek: there are just way too many problems with that code snippet.

NemoReally
#4
Dec26-12, 09:28 AM
P: 194
Segmentation fault (core dumped) C error for structures

I've forgotten more than I ever knew about C, but I do note that you define the player variable as 'plr' but then assign values to 'cplr'. Is that the kind of thing that might lead to pointers gleefully messing with memory?
Fb.Researcher
#5
Dec30-12, 01:22 AM
P: 7
The problem with calling plr instead of cplr was not serous,it happend when I was omitting extra rows of my program to make it simpler( I did it so that parts that are not related to the problem do not botter us)
The code is:
#include <stdio.h>
#include <stdlib.h>

#define PN 10 //number of players I chose
#define RN 10 //number of array's rows
#define N 2 //number of array's columns 
enum logical {W,R};

main()
{printf("Hi");
   int j=0,i=0,logic=R,r[100000]={0};
   struct plrrecord
   {
   int n;//identity number of the player
   short int lfstat;//life status: dead or alive
   short int ch[RN][N];
   };

   printf("environmental sourc:");
   struct plrrecord cplr[PN];


    while(   i<10  ) 
   {
       r[i]=(int)(drand48() * 10000);
       for( j=0 ; j<i ; j++)		 
       {    if( r[j]==r[i] )logic=W;}  
       if( logic==R )
       {
            cplr[i].n=r[i];
            i++;
       }
       else { logic = R; }
   }printf("%i\t",i);
   for(i=0;i<PN;i++)
        printf("%i\n",cplr[i].n);
return (0);
}
Now this works.When the program chose a player, the number of that player is kept in r[].At first it was :
cplr[r[i]].n=r[i]
I do not know why chnging it this way solved the problem because the length of the array,I mean r[],is 100000 which is more than the number of players.You see for chosing a player a number between 0 and 10000 is chosen. by saying cplr[r[i]].n==r[i] I change an element of array which is between 0 and 10000,And drand48() chose a random number between 0 and 1.Using drand48() instead of rand() is just one way of chosing a random varible.It may not be the easiest way, but it works.
Borek
#6
Dec30-12, 05:53 AM
Admin
Borek's Avatar
P: 23,369
What is the number of the last element in table[10000]? What is the maximum value of (int)(drand48() * 10000)?
Fb.Researcher
#7
Dec31-12, 06:26 AM
P: 7
Before changing the first program,a numer like r1 between 0 and 10000-1 was saved in the 9999th element of array so the array was chosen in a way so that always the program have an empty element for it.
dran48() gives a random number beween 0 and 1(not including 1 or a number in scale [0 1) ) so drand48()*10000 gives a random number between 0 and 10000 and (int)(drand48() * 10000 ) ranges from 0 to 9999 (including 9999 or an integer number in scale [0 9999])


Register to reply

Related Discussions
Segmentation fault 11... help? Engineering, Comp Sci, & Technology Homework 1
[Fortrran] Some help with a code error: Segmentation Fault Programming & Computer Science 4
Segmentation fault using C++ Programming & Computer Science 8
Segmentation Fault Programming & Computer Science 9
Segmentation Fault Computing & Technology 5