2014-05-07 59 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