Проблемы с вводом / выводом при многоязычной компиляции - PullRequest
0 голосов
/ 20 марта 2009

Приветствую всех

Я пытаюсь скомпилировать и запустить многоязычный код на C, C ++ и fortran, используя gcc, g ++ и f77 соответственно в UNIX. Моя программа состоит из двух частей, одна на C, другая на C ++. Они взаимодействуют через main (), написанный на C +, в то время как код fortran для этого случая можно игнорировать.

У меня были многочисленные проблемы с этим, наиболее заметно ошибка сегментации, которая возникала, когда я запускал исполняемый файл. Мои предыдущие две темы опровергли это, к сожалению, кажется, что ничто не решает проблему напрямую, кроме полного удаления любых процессов ввода / вывода в любой половине моей программы, что просто невозможно.

Доступ к публичной памяти классов из C ++ с использованием C Выходные конфликты между C и C ++

Мне нужно найти причину, по которой я получаю ошибки сегментации, когда использую ввод / вывод в обеих частях моей программы. Все источники компилируются, все ссылки успешно, и я знаю, что каждая часть (C & C ++) работает, когда связана одна, без таких ошибок сегментации (с изменениями, чтобы они работали отдельно) Я включил весь код, который взаимодействует между двумя частями и выполняет функции ввода / вывода.

Любая помощь будет очень ценной.

Makefile

products: SlowDynamic.exe

SlowDynamic.exe: main.o SA.o mersenne.o CFE.o BCs.o EMatrix.o Numbering.o KMatrix.o Solve.o MA_57.o blas.o MA_57_Depend.o Metis.o
    f77 -L/usr/sfw/lib -R/usr/sfw/lib -lgcc_s -lstdc++ -o SlowDynamic.exe main.o \
        SA.o mersenne.o CFE.o MA_57.o blas.o MA_57_Depend.o Metis.o\
        BCs.o EMatrix.o Numbering.o KMatrix.o Solve.o

main.o: main.cpp
    g++ -c -o main.o main.cpp

SA.o: SA.cpp
    g++ -c -o SA.o SA.cpp

mersenne.o: mersenne.cpp
    g++ -c -o mersenne.o mersenne.cpp

CFE.o: CFE.c
    gcc -c -o CFE.o CFE.c

MA_57.o: MA_57.f
    f77 -c -o MA_57.o MA_57.f

blas.o: blas.f
    f77 -c -o blas.o blas.f

MA_57_Depend.o: MA_57_Depend.f
    f77 -c -o MA_57_Depend.o MA_57_Depend.f

Metis.o: Metis.f
    f77 -c -o Metis.o Metis.f

BCs.o: BCs.c
    gcc -c -o BCs.o BCs.c

EMatrix.o: EMatrix.c
    gcc -c -o EMatrix.o EMatrix.c

Numbering.o: Numbering.c
    gcc -c -o Numbering.o Numbering.c

KMatrix.o: KMatrix.c
    gcc -c -o KMatrix.o KMatrix.c

Solve.o : Solve.c
    gcc -c -o Solve.o Solve.c

clean: 
    rm *.o Main.exe *.gpi

main.ccp

#include <iostream>
#include "SA.h" 

using namespace std;


int main() 
{   

    Initial.Initialize();

    Parent.SA(Initial.Write);

    system ("PAUSE");

    return 0;
}

SA.h

#ifndef SA_H
#define SA_H

#include <vector>

class SimAnneal {

    std::vector< std::vector<float> > DensityDomain;

    float Solid_Ele_Num, Void_Ele_Num;
    float Solid, Void;

    double Energy;
    double Time;

    void Metropolis (double, int, int);
    void Next_State (double, int);
    double Schedule (double, int);
    double ObjFunction ();
    void Distribute ();
    void Mutate ();
    void Convert ();
    void PrintDomain ();
    void WriteResults (double, double, double, double, double);

  public:
    int x_max, y_max;
    ...
    std::vector<float> DensityArray; 
    std::vector<float> EnergyArray;
    ...
    void SA (int);
    void Initialize ();
};

extern SimAnneal Initial, Parent, Child, Mutation, Best;

#endif  

SA.cpp

include <math.h>
#include <iostream>
#include <fstream>          
#include <time.h>           
#include <vector>

#include "SA.h"
#include "CFE.h"
#include "randomc.h"

using namespace std;

SimAnneal Initial, Parent, Child, Mutation, Best;

...

void SimAnneal::Initialize () 
{
    x_max = ReturnX();
    y_max = ReturnY();

    EnergyArray.resize(x_max*y_max);
    DensityArray.resize(x_max*y_max);

    ...

    Energy = ObjFunction();
}

...

void SimAnneal::PrintDomain () 
{
    static ofstream OutputFile;

    if (!OutputFile.is_open())
    {
        char FileName [] = "DensityDomain.txt";

        OutputFile.open(FileName);

        if (!OutputFile)
        {
            cerr << "Failed to open " << FileName << endl;
            exit(EXIT_FAILURE);  
        }

        //cout << "\nGenerating 'DensityDomain.txt'... \n" << endl;
    }

    for (int y = 0; y < y_max; y++) 
    {    
        for (int x = 0; x < x_max; x++) 
        {      
            OutputFile << DensityDomain[y][x] << " "; 
        }  

        OutputFile << endl;
    }  

    OutputFile.close();
}

void SimAnneal::WriteResults (double i, double T, double x, double y, double z) 
{
    static ofstream OutputFile;

    if (!OutputFile.is_open()) //check is file has been opened
    {
        char FileName [] = "Results.txt";

        OutputFile.open(FileName);

        if (!OutputFile)
        {
            cerr << "Failed to open " << FileName << endl;
            exit(EXIT_FAILURE);  //abort program
        }

        //cout << "\nWriting to file in progress... \n" << endl;

        OutputFile << "Iterations" << '\t' << "Temperatures" << '\t' << "Sum Strain Energy" << endl;  //<< "SwapNum1" << '\t' << "SwapNum2" << '\t' << "Distance" << endl; 
        OutputFile << endl;

        Initial.Time = (int)time(0);
    }

    OutputFile << i << '\t' << T << '\t' << z << endl;  //'\t' << y << '\t' << z << endl; 

    if (i == N_max || T <= T_abs) 
    {   
        Parent.Time = (int)time(0);

        OutputFile << endl
               << "Settings: " << endl
               << "Initial Temperature: " << Initial.Temp << endl
               << "Temperature Iterations: " << i << endl
               << "Step Iterations: " << N_step << endl
               << endl
               << "Results: " << endl
               << "Final Temperature: " << Temp << endl 
               << "Minimum: " << Energy << endl
               << "Computational Time (s): " << (Parent.Time-Initial.Time) << endl;

        OutputFile.close();
    }
}

CFE.h

#ifdef __cplusplus
extern "C" {
#endif 

int ReturnX ();
int ReturnY ();
void CFE(float density[], float energy[], int Length);

#ifdef __cplusplus
 }
#endif 

CFE.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "BCs.h"
#include "EMatrix.h"
#include "Numbering.h"
#include "KMatrix.h"
#include "fg_types.h"
#include "Solve.h"

int ReturnX ()
{
    FILE *infile;
    infile = fopen("test05", "r");

    int elemX,elemY;
    fscanf(infile, "%i %i", &elemX, &elemY);

    fclose(infile);

    return elemX;
}

int ReturnY () { Same but returns elemY }

void CFE(float density[], float energy[])
{
    // Extensive use of fscanf(), printf() & fprintf()
    // and the following:

FILE *outfile;

outfile = fopen("File.txt", "w");
if(outfile == NULL){

    }
else{
    for(n=0;n<8;n++)
    {
        for(m=0;m<8;m++)
        {
            fprintf(outfile,"%f",KE[n][m]);
            fprintf(outfile,"\t");
        }
        fprintf(outfile,"\n");
    }
}

fclose(outfile);


}

1 Ответ

0 голосов
/ 20 марта 2009

Я бы посоветовал внимательно изучить ваш код и проверить все, что выглядит даже странно.

Я бы сделал это для вас, но C ++ в данный момент не работает, и я использую ложные срабатывания. Например, это привлекло мое внимание:

if (!OutputFile.is_open())
{
    char FileName [] = "DensityDomain.txt";

    OutputFile.open(FileName);

    if (!OutputFile)
    {
        cerr << "Failed to open " << FileName << endl;
        exit(EXIT_FAILURE);  
    }

    //cout << "\nGenerating 'DensityDomain.txt'... \n" << endl;
}

На полпути вы тестируете, если OutputFile равно нулю, после того, как вы уже вызвали is_open() и open(). Мне показалось, что 1) OutputFile не будет нулевым или 2) вы не должны вызывать методы для него до того, как вы его протестируете. Но я был неправ.

Видишь, что я имею в виду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...