C&C ++之间的输出冲突

问候每个人

我目前正在尝试编写一个多语言程序(C,C ++和fortran),但我正在实现分段错误。 我已经排除了以下内容中的向量等: 使用C从C ++访问公共类内存

我现在缩小了在C ++段中使用’cout’表达的原因以及在C段中使用printf(…)的原因。 根据我运行这些顺序的顺序,在使用第二种类型时总是会出现分段错误,如下所示:

  1. cout首先,然后printf(…)将在第一个C输出函数崩溃
  2. printf(…),然后cout将在第一个C ++输出函数崩溃

我在我的C ++源代码中是#include 在我的C源代码中是#include #include

是否存在我不知道的图书馆冲突?

请求的代码:

main.cpp中

 #include  #include  #include "CFE.h" ios::sync_with_stdio(true); using namespace std; vector DensityArray; vector 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  #include  #include  #include  #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; } } 

您需要检查文件是否正确打开 – 即fopen()返回的指针不是NULL。 也,

 int ReturnY () { FILE *infile; infile = fopen("test05", "r"); int elemX,elemY; fscanf(infile, "%i %i", &elemX, &elemY); return elemX; } 

我拿它返回elemx应该是返回elemy

你不只是在你的C ++代码中使用printf的任何特殊原因? 当然,它不像所有酷孩子那样,但它应该仍然有效。

这是什么平台? 如果您的平台上有ios :: sync_with_stdio(bool),请使用

 ios::sync_with_stdio(true) 

在程序的开头(从C ++调用它)。 这有帮助吗?

当我在一个应用程序中混合使用cout和printf时,我发现让所有的C ++代码完全等同于:

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

这样stdout和cout就不会在任何时间点都有未刷新的缓冲区。

对于multithreading访问stdout和/或cout的应用程序,应格外小心。

这里的快速答案是否定的,它绝对100%不应该因为你混合p​​rintf和cout而崩溃。 混合两者的唯一困难是默认情况下不会同步相应的输出缓冲区,因此输出的顺序可能有点混淆。 但绝对不应该崩溃。

快速猜测一下,也许你有一个printf的格式化问题 – 当你期望一个短的int或类似的东西时你传递一个double。 这将导致不可预测的问题,这可能会根据代码中函数调用的顺序而发生变化。

ReturnY()返回X而不是Y.

(ps。关闭你的文件)

我没有看到printf(),所以我无法评论它。 您应该显示您正在使用的printf()s,提供一个完整的示例程序,如您所描述的那样失败。

至于关于fscanf()崩溃的评论,正如Neil Butterworth所说,你需要检查fopen()的返回值。 如果由于某种原因,fopen()失败(它看起来不应该如此),fscanf()可能会崩溃。 (如果它不能读取整数,它应该处理它。)你没有检查I / O中的任何东西。 (或者,I / O系统可能会从之前的某些东西中搞砸了。)

我怀疑I / O内存中的某处存在腐败,但我认为没有足够的结论。