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

strtok的source字串被更改掉

答題得分者是:jow
kobebryant81
一般會員


發表:15
回覆:15
積分:6
註冊:2007-05-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-01 14:33:26 IP:140.135.xxx.xxx 訂閱
今天我有一些訊號資料存在筆記本裡,一共有兩行,第一行存訊號1,接著一個tab,再存訊號二,如下
1.456 2.5555
1.111 2.5444
1.222 2.3333
1.333 2.7777
........
我先用TStringList把資料都讀到SLTmp變數裡
那我用了strtok去分割字串,因為要做濾波,是一個大小為13的平均濾波器,因為我是取第6點的資料,所以前6,後6加第六點一共13點資料做平均
所以我做了第一點的濾波時(i=6)temp_str 裡很正確的都存了1.456 \t2.5555,當第二點做平均時(i=7)時,等於說剛剛已經擷取過的字串都會再重新分割一次
但temp_str 裡對於剛剛已經分割過的字串都變成只存1.456,而不再是1.456 \t2.5555,所以會導致我的s2變成NULL,但對於新分割的字串,temp_str 就會存上1.333\t2.7777,
之前有前輩說過strtok會更改掉source的內容,但我已經將變數清空了阿,甚至每次都在宣告一個 temp_str 還是不行,不知道我這樣描述大家懂我的問題嗎?
謝謝指教!!
[code cpp]
String s1= NULL, s2 = NULL ,divide = "\t" ,temp_str ; //s1:signal1、s2:signal2、 divide:分隔點"\t"
for(int i=13/2;i{
for(int j=-13/2;j<13/2 1;j ) //大小13的濾波器
{
temp_str = NULL;
String temp_str = SLTmp->Strings[j i];
s1 = strtok(temp_str.c_str(),divide.c_str());
s2 = strtok(NULL,divide.c_str());
filter_sig1 =filter_sig1 StrToFloat(s1) //13個值累加
filter_sig2 = filter_sig2 StrToFloat(s2);//13個值累加

}
//後續訊號處理
}
[/code]
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-01 16:58:23 IP:210.66.xxx.xxx 訂閱
依資料產生時點i, 
當 i<13, 平均值 = sum / 實際加總筆數
當 i>=13, 平均值 = sum / 13.

[code cpp]
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int MAC = 13;
char *p[2];
float sum[2];
float *u[2];
float *v[2];
TStringList* L = new TStringList();
try{
if(FileExists("D:\\FloatData.txt"))
L->LoadFromFile("D:\\FloatData.txt");
int count = L->Count;
if(count>0){

for(int i=0; i<2; i ) sum[i] = 0;
for(int i=0; i<2; i ) u[i] = new float[count];
for(int i=0; i<2; i ) v[i] = new float[count];

for(int i=0; i
p[0] = strtok(L->Strings[i].c_str(), "\t");
p[1] = strtok(NULL, "\t");

if(p[0]&&p[1]){
for(int j=0; j<2; j ){
u[j][i] = StrToFloat(AnsiString(p[j]));
sum[j] = u[j][i];
if(i>=MAC)sum[j] -= u[j][i-MAC];
if(i else v[j][i] = sum[j] / MAC;
}
}
}
//Test: Show Result
L->Clear();
for(int i=0; i ListBox1->Items->Add(v[0][i]);
}

delete [] (float*)u;
delete [] (float*)v;

}
}
__finally{
delete L;
}
}
//---------------------------------------------------------------------------
[/code]
編輯記錄
jow 重新編輯於 2007-10-01 16:59:15, 註解 無‧
kobebryant81
一般會員


發表:15
回覆:15
積分:6
註冊:2007-05-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-02 09:50:34 IP:140.135.xxx.xxx 訂閱
感謝jow的回復,提供了另一種解決我問題的作法,但我還是有點困惑,同一個值如(1.666\t0.8999)存到變數A做分割後

如果我在用另一個變數B存同樣一個值(1.666\t0.8999)再做一次分割,變數B裡頭的值就只會存成1.660而不是(1.666\t0.8999)

@@會有這種奇怪現象嗎?還是說是我自己BCB的問題?很囉唆,希望BCB前輩們幫我解答一下,謝謝
kobebryant81
一般會員


發表:15
回覆:15
積分:6
註冊:2007-05-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-04 11:19:15 IP:140.135.xxx.xxx 訂閱
最後還是無法解決,試好久,還是感謝jow大大的幫忙,感謝^^
系統時間:2024-05-02 9:36:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!