全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2136
推到 Plurk!
推到 Facebook!

記憶體錯誤

答題得分者是:aftcast
b09101015
一般會員


發表:4
回覆:11
積分:3
註冊:2011-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-26 18:15:33 IP:114.33.xxx.xxx 訂閱
以下為我的程式
我現在是利用SPcomm接收RS232資料
然後做一些數據的處理
以下是我將資料放置MEMO內當達一定的數目
就會把最舊的刪掉
補上新的並存入檔案中
可是 當我接受了二三十次後
就會停在下面這行

fprintf( output, "%s\n",Memo1->Lines->Strings[0].c_str());

並顯示如圖中的訊息

請問有沒有人可以幫忙一下 謝謝

[code cpp]
if(LineOver)
{
sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text);
output=fopen(filename,"wt "); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text
fprintf( output, "%s\n",Memo1->Lines->Strings[0].c_str());
while(0 == fclose(output));
output=fopen(filename,"at "); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text
for(i=1;iLines->Count;i )
{
char *tt = Memo1->Lines->Strings[i].c_str();
fprintf( output, "%s\n",tt);
}
while(0 == fclose(output));
Memo1->Lines->LoadFromFile(filename);
LineOver = 0;
}
[/code]
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-26 18:56:11 IP:210.64.xxx.xxx 訂閱

[code cpp]
sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text.c_str());
//output=fopen(filename,"wt "); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text
//fprintf( output, "%s\n",Memo1->Lines->Strings[0].c_str());
//while(0 != fclose(output));
output=fopen(filename,"at "); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text
for(i=0;iLines->Count;i )
{
fprintf( output, "%s\n",Memo1->Lines->Strings[i].c_str());
}
while(0 != fclose(output));
Memo1->Lines->LoadFromFile(AnsiString(filename));
LineOver = 0;

[/code]

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
b09101015
一般會員


發表:4
回覆:11
積分:3
註冊:2011-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-01-26 20:28:41 IP:61.64.xxx.xxx 訂閱
謝謝蕭沖大

我會把那兩個分開存放是因為
我要先把之前的資料消除
然後才開始放心的資料
因為已經超過上限筆數了
所以才會這樣寫,因為如果用"a"屬性存檔的話
會把新資料加在最後面
所以想請問 有沒有比較好的方法
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-01-26 21:02:14 IP:220.135.xxx.xxx 訂閱

[code cpp]
sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text.c_str()); //要加 c_str
DeleteFile(ExtractFileDir(Application->ExeName) AnsiString("\\") AnsiString(filename)); // 刪除檔案
output=fopen(filename,"wt"); //開檔準備寫
for(i=0;iLines->Count;i ) // 從0開始寫
{
fprintf( output, "%s\n",Memo1->Lines->Strings[i].c_str());
}
while(0 != fclose(output)); // 這是是不等於,你原來的寫法是錯的
Memo1->Lines->LoadFromFile(AnsiString(filename)); // 要自己轉型別才最穩最安全
LineOver = 0;

[/code]

一案歸一案,之前po的問題,請適當的結案。我已沒分數的考量(五星了),只是一種原則。

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
b09101015
一般會員


發表:4
回覆:11
積分:3
註冊:2011-01-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-01-27 01:47:41 IP:61.64.xxx.xxx 訂閱
蕭沖大哥不好意思 我不是不願意結案....
只是我現在沒辦法進去我所提的那個畫面
進去後都會變成無法顯示網頁
請問我該向誰反映
不好意思讓你以為我沒有意願結案....

請問一下 那我下面這樣寫有錯嗎?
也是停在fprintf那邊

AnsiString temp;
//sprintf(dd, "%s.txt", Edit_ID->Text.c_str());
temp = AnsiString(Label_date->Caption.c_str());
temp = "_";
temp = AnsiString(buf);
char *tt = temp.c_str();
FILE *output;
sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text.c_str());
output=fopen(filename,"ab"); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text
//fprintf( output, "%s_%s\n",Label_date->Caption.c_str(),buf);
fprintf( output, "%s\n",tt);
while(0 != fclose(output));

編輯記錄
b09101015 重新編輯於 2011-01-26 19:04:37, 註解 無‧
b09101015 重新編輯於 2011-01-26 19:05:20, 註解 無‧
b09101015 重新編輯於 2011-01-26 19:05:44, 註解 無‧
b09101015 重新編輯於 2011-01-26 19:07:41, 註解 無‧
b09101015 重新編輯於 2011-01-26 19:42:56, 註解 無‧
b09101015 重新編輯於 2011-01-26 19:48:18, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-01-27 16:54:57 IP:210.64.xxx.xxx 訂閱

[code cpp]
AnsiString temp;
//sprintf(dd, "%s.txt", Edit_ID->Text.c_str());
temp = Label_date->Caption AnsiString("_") AnsiString(buf); // Label_date->Caption 本身就是ansistring,不要再轉
//char *tt = temp.c_str(); 最好不要這樣的寫法,到需要用的時候在 c_str()
FILE *output;
sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text.c_str());
output=fopen(filename,"ab"); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text
//fprintf( output, "%s_%s\n",Label_date->Caption.c_str(),buf);
fprintf( output, "%s\n",temp.c_str());
while(0 != fclose(output));

[/code]

你的問題常常是 char * 的型別與 AnsiString的型別沒搞清楚… 還有,如果還有問題的話…
1/ 把完整一點的程式碼貼出來 (因為每次貼的都不一樣,也不知是否有解決上一次的)
2/ 自己要再多修練內力,把c / c 的書拿來看一下。
3/ 學會下中斷點,然後觀察中斷時的許多變數的情形(把游標移到變數一停一下就會看到),這樣只己比較會知道錯在哪

我了解你可能很認真,但這樣下去就不知道要怎一直的幫你下去,我只能幫你片斷的。你還是要多靠自己的力量,尤其是去理解我所改的地方,為何而改,並記下來。這樣才不會一直又反複的錯同樣的東西。

祝你好運了!
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
b09101015
一般會員


發表:4
回覆:11
積分:3
註冊:2011-01-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-01-27 17:27:35 IP:114.33.xxx.xxx 訂閱
謝謝蕭大

這次依舊停在
fprintf( output, "%s\n",temp.c_str());

我有用你去看一下
結果發現output是等於NULL......
請問有可能是什麼問題
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-01-27 18:19:00 IP:210.64.xxx.xxx 訂閱
我決定幫你改一下你的原來的寫法,不再照你的寫法…建議請依我的寫法來試。

盡量不要用相對路徑來處理檔案,尤其是在debug時。


[code cpp]
AnsiString asFileName =
ExtractFileDir(Application->ExeName) AnsiString("\\measure_data\\")
Edit_ID->Text AnsiString("_measure.txt");
ShowMessage(asFileName);

output=fopen(asFileName.c_str(),"ab");
[/code]

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
b09101015
一般會員


發表:4
回覆:11
積分:3
註冊:2011-01-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-01-28 09:45:45 IP:114.33.xxx.xxx 訂閱
蕭大
我已經照你的方法使用 還是會停在那邊
而且接收二三十次後output 依舊等於NULL
我也有使用wile迴圈 去一直開啟 但永遠打不開 會死在回圈內

AnsiString temp;
//sprintf(dd, "%s.txt", Edit_ID->Text.c_str());
temp = Label_date->Caption AnsiString("_") AnsiString(buf); // Label_date->Caption 本身就是ansistring,不要再轉
//char *tt = temp.c_str(); 最好不要這樣的寫法,到需要用的時候在 c_str()
FILE *output;
AnsiString asFileName =
ExtractFileDir(Application->ExeName) AnsiString("\\measure_data\\")
Edit_ID->Text AnsiString("_measure.txt");
ShowMessage(asFileName);
output=fopen(asFileName.c_str(),"at");
//fprintf( output, "%s_%s\n",Label_date->Caption.c_str(),buf);
fprintf( output, "%s\n",temp.c_str());
while(0 != fclose(output));

//Memo1->Lines->Add(Label_date->Caption);
//Memo1->Lines->Add(" ");
//Memo1->Lines->Text = buf;
Memo1->Lines->Add(temp);
while(Memo1->Lines->Count >= StrToInt(Edit4->Text) 1)
{
//Edit_age->Text = "123";
Memo1->Lines->Delete(0);
LineOver = 1;
//Memo1->Lines->LoadFromFile(filename);
}
//FILE *output; // 用來指向一個輸出的位置
if(ID_change || Start)
{
Start = 0;
ID_change = 0;
AnsiString asFileName =
ExtractFileDir(Application->ExeName) AnsiString("\\patient_data\\")
Edit_ID->Text AnsiString("_patient.txt");
//ShowMessage(asFileName);
output=fopen(asFileName.c_str(),"wt");
fprintf( output, "%s,%s\n",Edit_name->Text.c_str(),Edit_patient->Text.c_str() );
while(0 != fclose(output));
}

if(LineOver)
{
AnsiString asFileName =
ExtractFileDir(Application->ExeName) AnsiString("\\measure_data\\")
Edit_ID->Text AnsiString("_measure.txt");
//ShowMessage(asFileName);
DeleteFile(ExtractFileDir(Application->ExeName) AnsiString(asFileName)); // 刪除檔案
output=fopen(asFileName.c_str(),"wt");
for(i=0;iLines->Count;i ) // 從0開始寫
{
fprintf( output, "%s\n",Memo1->Lines->Strings[i].c_str());
}
while(0 != fclose(output)); // 這是是不等於,你原來的寫法是錯的
Memo1->Lines->LoadFromFile(AnsiString(asFileName)); // 要自己轉型別才最穩最安全
LineOver = 0;
}
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-01-28 13:17:13 IP:210.64.xxx.xxx 訂閱
1/ 除非該檔案被開後,忘了close。
2/ 你根沒有存在對應的目錄夾名。

ExtractFileDir(Application->ExeName) AnsiString("\\measure_data\\")
Edit_ID->Text AnsiString("_measure.txt");
ShowMessage(asFileName);

請從showmessage的結果看清楚,你真的有那整串的路徑嗎?
比如說:
C:\abc\efg\measure_data\xx_measure.txt
你就要確定,你c下真的有 abc的目錄,而abc裡有efg的目錄,而efg下又有measure_data的目錄。 用眼力仔細的看每個字,一個字錯拼錯就open不會成功!
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
b09101015
一般會員


發表:4
回覆:11
積分:3
註冊:2011-01-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-01-28 14:01:13 IP:114.33.xxx.xxx 訂閱
謝謝蕭大
我終於找到問題了.............
是我有幾個地方 沒有fclose.........
不過蕭大有給我很多觀念 謝謝
系統時間:2017-10-23 17:55:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!