繁体   English   中英

结构处理和结构数组

[英]Struct handling and array of structs

我正在编写代码以存储文本文件中的数据。 代码可以编译,但似乎无法在ReadPanelBlock函数的for循环中运行。 它的结构为: CHBStructure包含CHBPanelsCHBOpenings包含CHBOpenings 这些功能的创建是为了从输入的文本文件中读取内容,我将其整理成数据块以便于阅读。

typedef struct _open
{
    int id;
    double length;
    double height;
    double origX;
    double origY;
    int frames;

    double thickness;
    double E;
    double v;
}CHBOpening;

typedef struct _panels
{
    int id;
    double length;
    double height;
    double origX;
    double origY;
    double origZ;
    double angle;
    int nOpenings;
    int nReinforcement;
    double *xReinf;
    double sx;
    double xReinf0;

    CHBUnit *chb;
    CHBOpening *openings[];
}CHBPanel;

typedef struct _chb
{
    int nStories;
    int nModes;
    int nIter;
    int nPanels;
    CHBPanel *panels[];
}CHBStructure;

int ReadPanelBlock (FILE *fp, CHBStructure *S)
{
    CHBOpening *openings = malloc(sizeof(CHBOpening));
    *S->panels = malloc(S->nPanels*sizeof(CHBPanel));
    for (i=0; i<S->nPanels; i++)
    {
        fscanf(fp,"%d",&S->panels[i]->id);
        fscanf(fp,"%lf",&S->panels[i]->length);
        fscanf(fp,"%lf",&S->panels[i]->height);
        fscanf(fp,"%lf",&S->panels[i]->angle);
        fscanf(fp,"%lf",&S->panels[i]->origX);
        fscanf(fp,"%lf",&S->panels[i]->origY);
        fscanf(fp,"%lf",&S->panels[i]->origZ);
        fscanf(fp,"%d",&S->panels[i]->nOpenings);
        if (S->panels[i]->nOpenings > 0)
        {
            for (j=0; j<S->panels[i]->nOpenings;j++)
            {
                openings = S->panels[i]->openings[j];
                fscanf(fp,"%d",&openings->id);
                fscanf(fp,"%lf",&openings->length);
                fscanf(fp,"%lf",&openings->height);
                fscanf(fp,"%lf",&openings->origX);
                fscanf(fp,"%lf",&openings->origY);
            }
        }
    }
    return 1;
}

编辑1:我尝试通过在每一行中打印文本来跟踪发生错误的位置,并且在ReadPanelBlock函数的第一个fscanf函数中它似乎崩溃了。

访问S->panels[i]->openings[j]UB ,因为您没有为该数组分配空间。

    if (S->panels[i].nOpenings > 0)
    {
         S->panels[i].openings = malloc(sizeof(CHBPanel)*S->panels[i].nOpenings);

         // inner for
    }

预先为openings指针分配空间:

CHBOpening *openings = malloc(sizeof(CHBOpening));

将导致内存泄漏,因为没有代码会释放内存,这是for带有代码的j内部地址将丢失该地址

openings = S->panels[i]->openings[j];

您可以避免使用指针来写

        for (j=0; j<S->panels[i].nOpenings;j++)
        {
            fscanf(fp,"%d",&S->panels[i].openings[j].id);
            fscanf(fp,"%lf",&S->panels[i].openings[j].length);
            fscanf(fp,"%lf",&S->panels[i].openings[j].height);
            fscanf(fp,"%lf",&S->panels[i].openings[j].origX);
            fscanf(fp,"%lf",&S->panels[i].openings[j].origY);
        }

在您的结构中CHBPanel *panels[]; CHBOpening *openings[]; 不得不:

CHBPanel *panels; 
CHBOpening *openings;

最后但并非最不重要的一点:您必须学习有关指针和->和的一些知识. 用法。

您的代码应类似于:

int ReadPanelBlock (FILE *fp, CHBStructure *S)
{
    int i,j;
    S->panels = malloc(S->nPanels*sizeof(CHBPanel));
    for (i=0; i< S->nPanels; i++)
    {
        fscanf(fp,"%d",&S->panels[i].id);
        fscanf(fp,"%lf",&S->panels[i].length);
        fscanf(fp,"%lf",&S->panels[i].height);
        fscanf(fp,"%lf",&S->panels[i].angle);
        fscanf(fp,"%lf",&S->panels[i].origX);
        fscanf(fp,"%lf",&S->panels[i].origY);
        fscanf(fp,"%lf",&S->panels[i].origZ);
        fscanf(fp,"%d",&S->panels[i].nOpenings);
        if (S->panels[i].nOpenings > 0)
        {
            S->panels[i].openings = malloc(sizeof(CHBOpening)*S->panels[i].nOpenings);

            for (j=0; j<S->panels[i].nOpenings;j++)
            {
                fscanf(fp,"%d",&S->panels[i].openings[j].id);
                fscanf(fp,"%lf",&S->panels[i].openings[j].length);
                fscanf(fp,"%lf",&S->panels[i].openings[j].height);
                fscanf(fp,"%lf",&S->panels[i].openings[j].origX);
                fscanf(fp,"%lf",&S->panels[i].openings[j].origY);
            }
        }
    }
    return 1;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM