[問題]compile過了但執行一半時出現error(附程式)

看板C_and_CPP作者 (小涼)時間14年前 (2009/09/27 09:52), 編輯推噓4(4015)
留言19則, 4人參與, 最新討論串1/1
我的 一個作業 要找出eq的根 固定一個x 將根(y)帶入 判斷y是否為解 compile 時沒問題 但在run 時 跑到一半時(還不到設到的x) 它在出現"error 請按任意鍵" 我有對過 前面跑出來的答案是對的 但它無法跑到我要的X 但直接算那個最後停住的X 可以出現解(y)且是正確的 我想不知道是不是跟電腦有關西嗎? 我的筆電有五年的歷史了>< #include <stdio.h> #include <stdlib.h> #include <math.h> double test(void); double fun(double,float); void loop(float,double,double,double,double); double max(double,double); double dee(double,float); double dii(double,float); int main() { int i; float x; double y[100000],eq2,eq1; //------------------ FILE *fptr; //開啟檔案 if((fptr=fopen("root.txt","w"))==NULL) { printf("error"); system("pause"); } //----------------------- // y的初始直 並設定要帶入的y值 範圍0.001~100 固定一個x 將y值帶入 判斷y是否為 eq=0的解 y[0]=0.001; for(i=0;i<100000;i++) {y[i+1]=y[i]+0.001;} x=0.01; //x的初始值 while(x<10.0)//x的終點 { printf("x=%f\t",x); fprintf(fptr,"%f\t",x); for(i=0;i<100000;i++)//一一將y值帶入 { eq1=fun(y[i],x); eq2=fun(y[i+1],x); if((eq1*eq2)<=0.0)//兩相鄰的y值 使eq位在一正一負 則可找出解 { if(fabs(eq1)<=pow(10.0,-10)) { fprintf(fptr,"a=%e\t",y[i]);} else {loop(x,y[i],y[i+1],eq1,eq2);}//找出較精準的y值 } } printf("\n"); fprintf(fptr,"\n"); x=x+0.01; } system("pause"); return 0; } double fun(double y,float x) { float pi,angle,a,b,wpi,wpe,we,wi,ck,ik,ek; double de,di,d1,d2,d3,d4,d5,d6,eq; pi=4*atan(1); angle=pi/4; a=cos(angle); b=sin(angle); wpi=1000.0; wpe=42850; we=1836; wi=1.0; ck=10000.0*x; ik=0.2*x; ek=42.0*x; de=y*y*(y*y-we*we)-ek*ek*(y*y-we*we*a*a); di=y*y*(y*y-wi*wi)-ik*ik*(y*y-wi*wi*a*a); d1=1.0-wpe*wpe*(y*y-we*we*a*a)/de-wpi*wpi*(y*y-wi*wi*a*a)/di; d2=1.0-(ck*ck)/(y*y)-wpe*wpe*(y*y-ek*ek-we*we*b*b)/de-wpi*wpi*(y*y-ik*ik-wi*wi*b*b)/di; d3=1.0-(ck*ck)/(y*y)-wpe*wpe*(y*y-ek*ek)/de-wpi*wpi*(y*y-ik*ik)/di; d4=wpe*wpe*we*we*a*b/de+wpi*wpi*wi*wi*a*b/di; d5=wpe*wpe*y*we*b/de-wpi*wpi*y*wi*b/di; d6=wpe*wpe*we*a*(y*y-ek*ek)/(y*de)-wpi*wpi*wi*a*(y*y-ik*ik)/(di*y); eq=d1*d2*d3-2.0*d4*d5*d6-d3*d4*d4-d2*d5*d5-d1*d6*d6; return eq; } void loop(float x,double y1,double y2,double eq1,double eq2) { int i; double y3,eq3,c,di,cc,de; //------------------ FILE *fptr; //開啟檔案 if((fptr=fopen("root.txt","w"))==NULL) { printf("error"); system("pause"); } //----------------------- // 因為分母也有y值 找出y使分母=0 (他會使eq趨向無限大)這是不要解 所以y1右邊的點 涮出的eq的絕對值會大於y1 c=fabs(fun(y1+0.000001,x)); cc=fabs(fun(y1,x)); de=(dee(y1,x));/ di=(dii(y1,x)); if(di>=0.00001 && de>=0.00001 && c-cc<0.0) / { y3=y1+0.01*fabs(eq1)/(fabs(eq1)+fabs(eq2)); fprintf(fptr,"b=%f\t",y3); printf("b=%f\t",y3); } } double dee(double y,float x) { float we,ek,a; double de; we=1836.0; ek=42.0*x; a=cos(atan(1)); //pi/4 de=y*y*(y*y-we*we)-ek*ek*(y*y-we*we*a*a); return fabs(de); } double dii(double y,float x) { float wi,ik,a; double di; wi=1.0; ik=0.2*x; a=cos(atan(1)); //pi/4 di=y*y*(y*y-wi*wi)-ik*ik*(y*y-wi*wi*a*a); return fabs(di); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.138.128.123

09/27 10:15, , 1F
這不看code有人猜得出來問題嗎@@?
09/27 10:15, 1F

09/27 10:31, , 2F
我猜是違規存取記憶體
09/27 10:31, 2F

09/27 10:32, , 3F
看看是不是十誡第二條
09/27 10:32, 3F
※ 編輯: scws 來自: 140.114.229.88 (09/27 15:18) ※ 編輯: scws 來自: 140.114.229.88 (09/27 15:48)

09/27 18:06, , 4F
"error"明明就是程式裡自己印的, "請按任意鍵...."明明
09/27 18:06, 4F

09/27 18:07, , 5F
就是system("pause")產生的; 這個程式明明就照著程式的
09/27 18:07, 5F

09/27 18:08, , 6F
邏輯走, step by step跟一下就知道是開檔開失敗了, 怎麼
09/27 18:08, 6F

09/27 18:08, , 7F
會猜跟電腦舊不舊有關....Orz
09/27 18:08, 7F

09/27 18:12, , 8F
至於為什麼會開檔失敗??八成跟程式習慣不好有關; 寫程式
09/27 18:12, 8F

09/27 18:12, , 9F
請養成成對coding的好習慣, 你的程式裡有N個地方在開檔
09/27 18:12, 9F

09/27 18:13, , 10F
(fopen)可是卻沒有一個關檔(fclose)存在....Orz
09/27 18:13, 10F

09/27 19:28, , 11F
謝謝V大 但我可以再請問你 我的flose要放那里? 它在跑迴圈時
09/27 19:28, 11F

09/27 19:31, , 12F
不是還要再開檔案 還是把fclosez放在最後就行了 謝謝
09/27 19:31, 12F

09/27 19:40, , 13F
老實說我覺得你應該自己去研究開關檔的時機, 因為程式是
09/27 19:40, 13F

09/27 19:41, , 14F
你寫的, 由你來決定何時需要開關檔才對. 理論上, 當我需
09/27 19:41, 14F

09/27 19:41, , 15F
要存取檔案時我需要開檔, 當存取檔案結束時就應該關檔;
09/27 19:41, 15F

09/27 19:42, , 16F
另外, 我還沒存取完, 但我知道會有其他程序要存取同樣的
09/27 19:42, 16F

09/27 19:42, , 17F
檔案時我也應該先關檔, 等我下次要用的時候再重新開檔.
09/27 19:42, 17F

09/27 19:43, , 18F
有多個程式同時存取一個檔案時這是另外一個課題, 估計你
09/27 19:43, 18F

09/27 19:44, , 19F
的case不用考慮; 輪流存取時考慮好上面推的應該就夠了.
09/27 19:44, 19F
文章代碼(AID): #1AliLP7z (C_and_CPP)