C&C ++之间的输出冲突
问候每个人
我目前正在尝试编写一个多语言程序(C,C ++和fortran),但我正在实现分段错误。 我已经排除了以下内容中的向量等: 使用C从C ++访问公共类内存
我现在缩小了在C ++段中使用’cout’表达的原因以及在C段中使用printf(…)的原因。 根据我运行这些顺序的顺序,在使用第二种类型时总是会出现分段错误,如下所示:
- cout首先,然后printf(…)将在第一个C输出函数崩溃
- 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%不应该因为你混合printf和cout而崩溃。 混合两者的唯一困难是默认情况下不会同步相应的输出缓冲区,因此输出的顺序可能有点混淆。 但绝对不应该崩溃。
快速猜测一下,也许你有一个printf的格式化问题 – 当你期望一个短的int或类似的东西时你传递一个double。 这将导致不可预测的问题,这可能会根据代码中函数调用的顺序而发生变化。
ReturnY()返回X而不是Y.
(ps。关闭你的文件)
我没有看到printf(),所以我无法评论它。 您应该显示您正在使用的printf()s,提供一个完整的示例程序,如您所描述的那样失败。
至于关于fscanf()崩溃的评论,正如Neil Butterworth所说,你需要检查fopen()的返回值。 如果由于某种原因,fopen()失败(它看起来不应该如此),fscanf()可能会崩溃。 (如果它不能读取整数,它应该处理它。)你没有检查I / O中的任何东西。 (或者,I / O系统可能会从之前的某些东西中搞砸了。)
我怀疑I / O内存中的某处存在腐败,但我认为没有足够的结论。