2010-12-07 2 views
0

Привет, в названии написано все действительно. У меня есть метод, который читается в файле, хранящем данные о составе материалов (например, в виде полиэтилена или природного состава свинца), каждый из этих материалов содержится в различных объектах и каждый из них имеет различную композицию. Метод make называется последовательно, так как когда-то материалы, составляющие физическую систему, получаются из другого файла, это естественный следующий шаг. То, что записано в списке, это o/p для файла, то что такое на самом деле в списке op до конца этого файла. Как избежать утечки?Последовательные вызовы длинному методу производят разлив

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» в качестве возврата. Я мог дождаться возврата от каждого вызова метода до того, как я запустил следующий, но я не знаю, как это сделать.)

У меня НЕ МОЖЕТ БЫТЬ НАЙДЕН ПУТЬ, ЧТОБЫ ДЕЛАТЬ ЭТО НА ДВОРЕЦЫ, ПОТОМУ ЧТО Я ДЕЙСТВИТЕЛЬНО НЕ ЗНАЮ, ЧТО ТЕРМИНОЛОГИЯ, ЕСЛИ ЭТО СЛУЧАЙНЫЕ ССЫЛКИ К ФИКСИРОВАННЫМ ПРОБЛЕМАМ ВЕЛИКИЙ!

+2

Извините, ваш вопрос непонятен. Что вы подразумеваете под «пролитием»? Может быть, вы можете показать, какой результат ожидался? – atzz 2010-12-07 12:20:50

+0

короче, о/р должен выглядеть следующим образом: лямд: 0,335657 изотопов: изотоп углерод Z: 12 пропорциональное количество: 0,33333 изотопов: изотоп водород Z: 1 пропорциональное количество: 0,66667 poly.txt загружается 12 : Загружается 0.31778 Загружается 1: 0.63332 – morb 2010-12-07 15:22:52

ответ

0

В чем мой непонятный вопрос? (Серьезно, кроме моего незнания технических терминов программирования, я написал код, чтобы его можно было понять. В чем проблема?)

Вышеуказанный метод называется шестикратным из основного метода.

Каждый раз, когда он называется, он принимает входные данные из файла (например, самый короткий, который я включил для демонстрации того, как должен себя вести код, а другие - дольше).

Следуя приведенному ниже коду, вы должны заметить, что первая строка входного файла хранится в переменной lamda, которая не используется снова, кроме вывода в файл outpuf.

Последовательные строки inout-файла затем считываются и помещаются в вектор из двух записей, соответствующих «Z» изотопа и относительной численности этого конкретного «Z». Затем этот вектор помещается в список. Значения, которые хранятся в векторе, очевидно, должны быть теми, которые записаны в выходной файл.

Как вы можете видеть, в списке больше записей, чем во входном файле.

Эти посторонние линии возникают из одного и того же метода, выполняемого в другом объекте.

«Проливание», на которое я ссылаюсь, - это пролитие предметов в списке, который находится в отдельном объекте, в другой. Из-за количества запущенных методов существует много «разливов».

Из-за сходства адресов памяти, разделяемых вещами в c, я назвал это одним и тем же, как я думал, это было.

Что мне нужно - это советы о том, как избежать этого, должно быть много программ, которые открывают один и тот же тип объекта и запускают их методы (как это кажется в этом случае) параллельно.Я не могу очистить списки из памяти, поскольку каждый из них требуется, чтобы материал, который они описывают, вел себя так, как это физически.

 Смежные вопросы

  • Нет связанных вопросов^_^