I define a struct array called 'l' in above the main file. Then I passed 'l' to
load_data(struct line l[]) which is defined in another file called load.c. I
declare load_data(struct line l[]) in load.h.

 Then when load_data() want to initialize the l array, a segmentation is
generated.(I have checked that the array is large enough, and I initialized
some elements in l, and printf them out, the value is what I did. But
segmentation error came up as long as I modify the array l).

 Then if I renamed l as ll in main file above. Everything worked well then. Or
if I use externs, every thing worked well as well.

main.c

#include<stdio.h>
#include<linux/compiler.h>
#include"./type.h"
#include"./load.h"
struct line ll[LMAX];
struct machine m[MMAX];
int
main()
{
        //int i;
        printf("Loading data ...");
        fflush(stdout);
        ll[0].co[0]=54321;
        if(-1==load_data(ll))
        {
                printf("Missing data. Exiting program.\n");
                return 0;
        }
        printf(" [OK] \n");

        return 0;
}


load_data.c
#include"./type.h"
#include<stdio.h>
#include<linux/compiler.h>

extern struct machine m[MMAX];
//extern struct line    l[LMAX];
struct line *l;

FILE *
file_open(const char name[])
{
        FILE *f=fopen(name,"r");
        if(unlikely(NULL==f))
        {
                f=fopen(name,"a+");
                fclose(f);
                return NULL;
        }
        return f;
}
int
load_equation()
{       
        int i,j;
        FILE *f=file_open("equation");
        printf("before critical ");
        printf("before critical %lf\n",l[0].co[0]);
        l[0].co[0]=4444;
        printf("critical\n");
        if(NULL==f)
                return -1;
//      printf("before loop\n");
        for(j=0;j<LMAX;j++)
                for(i=0;i<MMAX;i++)
                {
                        printf("before in\n");
                        l[j].co[i]=1;
                        printf("after in\n");
                }
        fclose(f);
        return 0;
}
int 
load_line_limit()
{
        FILE *f=file_open("line_limit");
        int i;
        if(NULL==f)
                return -1;
        for(i=0;i<LMAX;i++)
                fscanf(f,"%lf",&l[i].normal);
        for(i=0;i<LMAX;i++)
        {
                fscanf(f,"%lf%%",&l[i].high);
                l[i].high=(l[i].high/100+1)*l[i].normal;
        }
        fclose(f);
        return 0;
}
int 
load_seg_prise()
{
        FILE *f=file_open("seg_prise");
        int i,j;
        if(NULL==f)
                return -1;
        for(j=0;j<MMAX;j++)
                for(i=0;i<SEGMAX;i++)   
                        fscanf(f,"%lf",&m[j].seg_prise[i]);
        fclose(f);
        return 0;
}
int 
load_seg_len()
{
        FILE *f=file_open("seg_len");
        int i,j;
        if(NULL==f)
                return -1;
        for(j=0;j<MMAX;j++)
                for(i=0;i<SEGMAX;i++)
                {
                        fscanf(f,"%lf",&m[j].seg[i]);
                        if(i)
                                m[j].seg[i]+=m[j].seg[i-1];
                }

        fclose(f);
        return 0;
}
int
load_speed()
{
        FILE *f=file_open("speed");
        if(!f)
                return -1;
        int i;
        for(i=0;i<MMAX;i++)
                fscanf(f,"%lf",&m[i].speed);
        return 0;
}
int
load_data(struct line *_l)
{
        int re=0;       
        l=_l;
        printf("\n>>>0 %p %p %lf\n",l,m,l[0].co[0]);
        l[0].co[0]=12345;
        printf("after\n");
        if(load_equation())
                re=-1;
        if(load_line_limit())
                re=-1;
        if(load_seg_prise())
                re=-1;
        if(load_seg_len())
                re=-1;
        if(load_speed())
                re=-1;
        return re;
}


type.h
#ifndef TYPE
#define MMAX 8
#define LMAX 6
#define SEGMAX 10
struct line{
        double co[MMAX];
        double normal;
        double high;
};
struct machine{
        double seg_prise[SEGMAX];
        double seg[SEGMAX];
        double speed;//climb speed, mw per minute
};
struct solution{
        double m_power[MMAX];   
};
#endif


-- 
           Summary: Get unexpected segment error
           Product: gcc
           Version: 3.4.6
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: lionghostshop at yahoo dot com dot cn


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28954

Reply via email to