对long方法的连续调用会产生溢出

时间:2010-12-07 10:38:45

标签: c++ sequential method-call

嗨,标题说明了一切。我有一种方法可以读取一个文件,其中包含材料成分(如聚乙烯或铅的天然成分)的数据,这些材料中的每一种都保存在不同的物体中,每种物质都有不同的成分。 make方法被顺序调用,因为一旦构成物理系统的材料从另一个文件获得,这是自然的下一步。写入列表的是o / p到文件,然后列表中实际的操作是对该文件的结尾。我该如何避免溢出?

void material::make(char* filename)   
{           
    ifstream fin(filename) ;    
ofstream filenameOUT ;
string outfile = (string)filename + "OUT.txt" ;
filenameOUT.open(outfile.c_str()) ;
    string ZStr, propStr, isotope ;
    vector<float> component(2,0) ;

    getline(fin, propStr, '\n') ;   //store first entry in file as a str (prop is used to save mem allocation)
    lamda = atof(propStr.c_str()) ;   //then convert to float so calcs can be done
filenameOUT<<"lamda: "<<lamda<<endl;

    while(!fin.eof())
    {
        getline(fin, isotope, ' ') ;  //get the element name
        getline(fin, ZStr, '\t') ;   //get the Z's and abunancies from the file.
        getline(fin, propStr) ;
        component[0] = atof(ZStr.c_str()) ;
        component[1] = atof(propStr.c_str()) ;
filenameOUT<<"isotope: "<<isotope<<" isotope Z: "<<component[0]<<" proportional amount: "<<component[1]<<endl;
        composition.push_back(component) ;
        elements.push_back(isotope) ;
    }
filenameOUT<<filename<<" is loaded"<<endl;

    for(c=composition.begin();c!=composition.end();c++)
    {
filenameOUT<<(*c)[0]<<" : "<<(*c)[1]<<" is loaded"<<endl;
    }
}

例如,聚乙烯的输入文件:

.335657
carbon 12 .33333
hydrogen 1 .66667

产生它(含有铅,铜,硼,氢的同位素三次和碳一次):

lamda: 0.335657
isotope: carbon isotope Z: 12 proportional amount: 0.33333
isotope: hydrogen isotope Z: 1 proportional amount: 0.66667
poly.txt is loaded
11 : 0.04 is loaded
10 : 0.01 is loaded
12 : 0.31778 is loaded
1 : 0.63332 is loaded
1 : 0.63332 is loaded
204 : 0.014 is loaded
206 : 0.241 is loaded
207 : 0.221 is loaded
208 : 0.524 is loaded
208 : 0.524 is loaded
106 : 0.0125 is loaded
108 : 0.0089 is loaded
110 : 0.1249 is loaded
111 : 0.128 is loaded
112 : 0.2413 is loaded
113 : 0.1222 is loaded
114 : 0.2873 is loaded
116 : 0.0749 is loaded
12 : 0.33333 is loaded
1 : 0.66667 is loaded

任何建议非常感谢! (并且,是的,它表示'void'作为返回。我可以等待每个方法调用的返回,然后再运行下一个,但我不知道该怎么做。)

我可能还没有找到在TINTERWEBS上做这件事的方法,因为我真的不知道术语是什么,如果这是固定问题的案例链接是伟大的!

1 个答案:

答案 0 :(得分:0)

我的问题以何种方式难以理解? (说真的,除了我对技术编程术语缺乏了解之外,我编写了代码以便可以理解。问题缺乏什么?)

上述方法从main方法调用六次。

每次调用它都需要从文件中输入(例如最短的文件,我已经包含这些文件来演示代码应该如何运行,其他文件更长)。

在代码通过之后,您应该注意到输入文件的第一行保存在一个名为lamda的变量中,除了输出到outpuf文件之外,该变量不会再次使用。

然后读取inout文件的连续行并将其放入两个条目的向量中,对应于同位素的'Z'和该特定'Z'的相对丰度。然后将该向量放入列表中。矢量中保存的值显然应该是写入输出文件的值。

如您所见,列表中的条目多于输入文件中的行。

这些无关的行来自于在不同的对象中运行的相同方法。

我所指的“溢出”是列表中的项目溢出,它是单独的对象,是另一个。由于运行方法的数量,有很多“溢出”。

由于c中的事物所共享的记忆地址的相似性,我称它为同样的东西,就像我认为的那样,本质上。

我需要的是关于如何避免这种情况发生的建议,必须有许多程序打开相同类型的对象并并行运行它们的方法(在本例中似乎)。我无法清除内存中的列表,因为每个列表都是必需的,因此它们描述的材料在物理上应该表现得很好。