2014-05-07 37 views
-2

所以我试图解决这个问题,但似乎没有任何工作。我是一名参加C++课程的学生,请原谅我的无知。在C++中顽固的“调试断言失败”错误

正如标题所说我不断收到一个错误框,是这样的

“调试断言失败 计划:I:(文件路径)

文件:F:(文件路径)
行: 52

表达:(!流= NULL)”

我认为这是与指针,但我不知道...... 我的朋友都使用这个确切的代码,所以我开始认为上帝恨我

很抱歉,如果我在我的问题没有做错任何事

这里是我的代码

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define NROW 7 
#define NCOL 8 
#define FILEIN "input_practice.txt" 
#define FILEOUT "output_practice.txt" 

void GJ(double A[NROW][NCOL]); 
void pivot(double A[NROW][NCOL], int j); 
void norm (double A[NROW][NCOL], int j); 
void diag (double A[NROW][NCOL], int j); 
void swap(double *x, double *y); 
void main() 
{ 
//define variables 
double A[NROW][NCOL]; 
int i, j; 
FILE *filein_ptr; 
FILE *fileout_ptr; 

//open files 
filein_ptr=fopen(FILEIN,"r"); 
fileout_ptr=fopen(FILEOUT,"w"); 

//get input from file 
for (j=0; j<NROW; j++) 
{ 
    for (i=0; i<NCOL; i++) 
    { 
    fscanf(filein_ptr,"%lf",&A[j][i]); 
    } 
} 
//Run Gauss-Jordan 
GJ(A); 

//output 
fprintf(fileout_ptr,"Solution Matrix:\n"); 
for (j=0; j<NROW; j++) 
{ 
    for (i=0; i<NCOL; i++) 
    { 
     fprintf(fileout_ptr,"%lf",A[i][j]); 
     fprintf(fileout_ptr," "); 
    } 
fprintf(fileout_ptr,"\n"); 
} 

//close files 
fclose(filein_ptr); 
fclose(fileout_ptr); 
} 



void GJ(double A[NROW][NCOL]) 
{ //Run it 
int j; 
for (j=0;j<NROW;j++) 
{ 
    pivot(A,j); 
    norm(A,j); 
    diag(A,j); 
} 
} 
void pivot(double A[NROW][NCOL], int j) 
{ 
int maxrow=j,i; 
//find max values 
for (i=j; i < NROW ; i++) 
{ 
    if (fabs(A[i][j]) > fabs(A[maxrow][j])) 
    { maxrow=i; 
    } 
} 
if (maxrow != 0) 
{ 
    for (i=j; i < NCOL; i++) 
    { 
     swap(&A[j][i],&A[maxrow][i]); 
    } 
} 
} 


void norm (double A[NROW][NCOL], int j) 
{ 
//temp 
double temp=A[j][j]; 
int i; 
//Normalize 
for(i=j; i < NCOL ; i++) 
{ A[j][i] = (A[j][i]/temp); 
} 
} 

void diag (double A[NROW][NCOL], int j) 
{ 
//define 
double temp; 
int i,k; 
//Diagonalize 
for(i = 0; i < NROW; i++) 
{ 
    if(i != j) 
    { 
     temp = A[i][j]; 
     for(k=j; k < NCOL; k++) 
     { 
      A[i][k]= A[i][k] - (temp * A[j][k]); 
     } 
    } 
} 
} 
void swap(double *x, double *y) 
{ 
//Swap 
double z; 
    z=*x; 
    *x=*y; 
    *y=z; 
} 
+2

这是很多的代码。你可以把它分解成一个最小的例子吗? – user3553031

+0

'fprintf(fileout_ptr,“%lf”,A [i] [j]);'是'fprintf(fileout_ptr,“%lf”,A [j] [i]);'in main? –

+0

好,所以我认为你是对的,我改变了我的代码,现在我没有得到调试断言的事情了......但现在我得到这个错误信息:“1> LINK:致命错误LNK1168:无法打开我:\ ME400 \ C++ \ Practice1 \ Debug \ Practice1.exe编写“我不知道这是什么意思:( – user3610591

回答

3

该代码不是唯一的断言代码,只需因为它没有任何断言。

您可能需要查看实际文件中的第52行,从中断言并进行调查。

基础上(由你大概修改来保护文件名)断言输出:

"Debug assertion Failed! Program: I:(filepath) 

File: f:(filepath) 
line: 52 

Expression: (stream != NULL)" 

你就可以追查问题。可能是因为您未能打开流,可能是因为该文件不存在您所期望的位置,而且您也没有检查错误。甚至可能是因为缓冲区溢出问题而覆盖了流变量。

在我看来,最有可能的情况是,因为你的代码是从该文件是一个不同的目录中运行该文件没有打开正常。你应该真的检查fopen()的返回值来解决这个问题。

+0

错误;断言可能是在库代码中,为此他甚至可能没有源代码,该文件不是“引发”断言的,调用者引发了断言。模块与断言只是捍卫接口合同 – Kaz

+1

@Kaz,在我的回答中没有什么“错误”,我表示文件显示不是一个失败的,这并不意味着它不是**根**问题的原因,只是它不是一个主张。如果是图书馆断言,最后一段将介绍最有可能出现的情况。 – paxdiablo

+0

你错了;显示的代码实际上是失败的。将空指针传递给标准库函数(如fprintf)是失败的:它违反了合同。任何后续的崩溃都不是该功能的错误。它不会造成任何事情。 – Kaz

1

你的程序忽略从fopen功能,如果它不能打开一个文件,它会返回一个空指针处理可能的,并且很可能错误。

如果input_practice.txt不存在,会发生什么,或者不读给你(无权限)?如果您没有权限覆盖或创建output_practice.txt,该怎么办?

该中止发生在必须抵御传递一个空指针一些库函数。

传递空指针一定的标准C库函数是未定义行为,所以允许他们大声诊断的情况。

+1

我想通了,并得到它运行,感谢您的帮助!你说得对,我的文件不存在..有错误的名字 – user3610591

+0

@ user3610591通常最好是编写额外的代码来检测这些情况,即使在这样的小程序中。 – Kaz

+0

@ user3610591嗯,我很高兴我的回答对某些内容有所帮助。我希望这里的共同努力能够解决您的问题。有时候你的错误是文件名最小的事情,而不是代码中的大错误。 –

0

我不知道如何具体解决您的代码,但我可以尝试,并给你一个更好的主意,你的错误说什么。

一个断言是一个测试,看看条件是否非常像一个if()语句尝试,而不是执行一段代码时,如果在条件为假时会抛出异常。

所以代码assert(true==false)会抛出异常,因为true!=false。因此assert(stream != NULL)将是你在代码中失败的测试。

对我来说,这个错误意味着你正试图打开某种类型的流(从你的代码文件流的外观),但它没有正确打开,然后你试图使用一个流不开放做某事。

我很抱歉,我无法给你一行代码,你的代码被破坏,但我希望我的答案可以帮助甚至一点点。

祝你好运

+0

虽然这没有帮助我的问题,我学到了一点。谢谢! – user3610591