Выходные конфликты между C и C ++ - PullRequest
0 голосов
/ 20 марта 2009

Привет всем

В настоящее время я пытаюсь написать многоязычную программу (C, C ++ и fortran), хотя достигаю ошибок сегментации. Я исключил векторы и тому подобное в: Доступ к публичной памяти классов из C ++ с использованием C

Теперь я сузил причину использования экспериментов 'cout' в моих сегментах C ++ и printf (...) в сегментах C. В зависимости от того, в каком порядке я их выполняю, при использовании 2-го типа всегда возникает ошибка сегментации, например:

  1. сначала cout, затем printf (...) завершится с ошибкой при первой функции вывода C
  2. printf (...), затем cout завершится сбоем при первой выходной функции C ++

Я #include <iostream> в моих источниках C ++ и #include <stdio.h> & #include <stdlib.h> в моих источниках C.

Есть ли конфликт библиотеки, о котором я не знаю?

запрашиваемый код:

main.cpp

#include <iostream>
#include <vector>
#include "CFE.h"    

ios::sync_with_stdio(true);

using namespace std; 

    vector<float> DensityArray;
    vector<float> EnergyArray;

int main() 
{   
    int X = ReturnX ();
    int Y = ReturnY ();

    cout << "X " << X << endl;               
    cout << "Y " << Y << endl;               

    EnergyArray.resize(Y*X);
    DensityArray.resize(Y*X);

    CFE(&DensityArray[0], &EnergyArray[0]);

    cout << "X " << X << endl;               //causes Segmentation break
    cout << "Y " << Y << endl;               //causes Segmentation break

    system ("PAUSE");

    return 0;
}

CFE.h

#ifdef __cplusplus
extern "C" {
#endif 

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

#ifdef __cplusplus
 }
#endif

CFE.cpp

#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 ()
{
    FILE *infile;
    infile = fopen("test05", "r");

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

fclose(infile);

    return elemY;
}
void CFE(float density[], float energy[])
{

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

    int elemY, elemX;
    fscanf(infile, "%i %i", &elemX, &elemY);  //Will cause Segmentation break

    int n;

    float * dens;
    dens = density;

    float * engy;
    engy = energy;

        int Length = 10;

    for ( n = 0; n < Length; n++)
    {
        engy[n] = n;
    }
}

Ответы [ 7 ]

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

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

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

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

Я так понимаю вернуть elemx должно быть вернуть elemy ?

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

Есть какая-то конкретная причина, почему вы не просто используете printf в своем коде C ++? Конечно, это не то, что делают все классные ребята, но все равно должно работать.

1 голос
/ 20 марта 2009

Когда я смешиваю cout и printf в приложении, я считаю полезным, чтобы весь мой код C ++ выполнял эквивалент:

fflush(stdout);
cout << ...whatever... << flush;

Таким образом, stdout и cout никогда не имеют очищенных буферов в любой момент времени.

Особое внимание следует уделить приложениям, в которых несколько потоков обращаются к stdout и / или cout.

1 голос
/ 20 марта 2009

На какой это платформе? Если у вас есть ios :: sync_with_stdio (bool), доступный на вашей платформе, вызовите его с

ios::sync_with_stdio(true)

в начале вашей программы (вызывайте ее из C ++). Это помогает?

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

Я не вижу printf (), поэтому я не могу комментировать его. Вы должны показать, какие функции printf () вы используете, предоставив полный пример программы, которая не работает, как вы описали.

Что касается комментария о сбое в fscanf (), как говорит Нил Баттерворт, вам нужно проверить возвращаемое значение fopen (). Если по какой-то причине fopen () завершается с ошибкой (что не выглядит так, как должно), fscanf () может произойти сбой. (Если он не может читать целые числа, он должен с этим справиться.) Вы ничего не проверяете в I / O. (В качестве альтернативы система ввода-вывода может быть испорчена чем-то предыдущим.)

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

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

ReturnY () возвращает X вместо Y

(ps. Закройте ваши файлы)

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

Быстрый ответ здесь - нет, он абсолютно на 100% не должен падать только потому, что вы смешиваете printf и cout. Единственная сложность в смешивании этих двух типов заключается в том, что соответствующие выходные буферы не будут синхронизироваться по умолчанию, поэтому порядок вывода может быть немного перепутан. Но это точно не должно привести к сбою.

По быстрому предположению, возможно, у вас есть проблема с форматированием в printf - вы передаете двойное число, когда оно ожидает короткое int или что-то подобное Это приведет к непредсказуемым проблемам, которые могут сместиться в зависимости от порядка вызовов функций в вашем коде.

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