BCB 宣告 struct 位置的問題 |
|
lalokalaloka
一般會員 發表:9 回覆:4 積分:2 註冊:2004-07-03 發送簡訊給我 |
//開任意黨計算各個 ASCII碼出現幾次
#pragma hdrstop
#include "Unit1.h"
#include
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
lalokalaloka 您好: 您的問題出在,C++裡不可以給結構設定初值。
struct data { int ch; //把ASCII 碼用 十進位表示 int count; //出現了幾次 };還有以目前您的需求其實只要設一個陣列即可解決: int ascii[256]={0}; // 宣告一個陣列並出始化為零,索引表示ASCII的值,ascii[k]則記錄ASCII是k的個數。 ..... while(fs->Read(&AByte, 1)) { k=AByte; ascii[k] ; //array[k].count ; }RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
lalokalaloka
一般會員 發表:9 回覆:4 積分:2 註冊:2004-07-03 發送簡訊給我 |
我又增加了ㄧ段程式碼來把之前的 次數做排序
可是跑道head->count=ascii[0].count; 就會出錯
可以請大大幫忙解答嗎 下面是程式的連結
http://140.117.189.47/hw7.rar
#include
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
void __fastcall TForm1::N2Click(TObject *Sender) { struct sorting_list { int count; AnsiString st; struct sorting_list *before,*after; }; struct sorting_list *head,*rear,*find; struct node { AnsiString string; struct node *father,*leftson,*rightson; }; AnsiString filename,st; FILE *p; int i,j,k; struct Ascii { int count; AnsiString st; }; struct Ascii ascii[255]; if(OpenDialog1->Execute()) { filename=OpenDialog1->FileName; } else return; //**********計算每一個字元有多少個 TFileStream* fs = new TFileStream(filename, fmOpenRead); BYTE AByte; __try { while(fs->Read(&AByte, 1)) { k=AByte; ascii[k].count ; ascii[k].st=AByte; } } __finally { delete fs; } //----------------------------建 link list head->count=ascii[0].count; // <<<<<<<<<<<<<<<< 指向這ㄧ行說無法開啟檔案 因為head是指標,但是您又沒有指向某一變數,或是動態配置記憶體,所以當您試圖去存取結構成員的話,自然會發生錯誤。 還有您對list的操作,也發生相同的錯誤。 head->st=ascii[0].st; rear=head; head->before=head->after=NULL; 不知道您是否非要使用List排序不可,如果不是的話,底下程式碼可供參考。 另外建議不要將相關的結構定義放在函式中,這樣會讓程式不易觀察與修改。 for (int k=0; k<256; k ) ascii[k].count = 0; //**********計算每一個字元有多少個 TFileStream* fs = new TFileStream(filename, fmOpenRead); BYTE AByte; __try { while(fs->Read(&AByte, 1)) { k=AByte; ascii[k].count ; ascii[k].st=AByte; } } __finally { delete fs; } int order[256]; for (int k=0; k<256; k ) order[k] = k; // ===== sorting for (int k=0; k<256-1; k ) { for (int p=k 1; p<256; p ) { if ( ascii[ order[k] ].count < ascii[ order[p] ].count ) { int temp = order[k]; order[k] = order[p]; order[p] = temp; } } } AnsiString msg; for (int k=0; k<256; k ) { msg.cat_printf("ascii[=]=%c =>%d ", order[k], order[k], ascii[order[k]].count); if ( k>0 && k%5==0 ) msg.cat_printf("\n"); } ShowMessage(msg);RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
lalokalaloka
一般會員 發表:9 回覆:4 積分:2 註冊:2004-07-03 發送簡訊給我 |
因為head是指標,但是您又沒有指向某一變數,或是動態配置記憶體,所以當您試圖去存取結構成員的話,自然會發生錯誤。
還有您對list的操作,也發生相同的錯誤。
head->st=ascii[0].st;
rear=head;
head->before=head->after=NULL; 不知道您是否非要使用List排序不可,如果不是的話,底下程式碼可供參考。
另外建議不要將相關的結構定義放在函式中,這樣會讓程式不易觀察與修改。
應未我之後還要進行加入還有刪除的動作 所以想說要用list比較好
那有辦法使用 list 嗎
還有發現一個很大的問題 for (int k=0; k<256; k ) ascii[k].count = 0;
//**********計算每一個字元有多少個
TFileStream* fs = new TFileStream(filename, fmOpenRead);
BYTE AByte;
__try
{
while(fs->Read(&AByte, 1))
{
k=AByte;
ascii[k].count ;
ascii[k].st=AByte;
}
}
__finally
{
delete fs;
}
這裡應該是要計算每一個ASCII碼出現幾次 可是最多只能讀到編號127以下的碼 另外編號 255會讀到非常多次 其他的真的不見了嗎
int order[256];
for (int k=0; k<256; k ) order[k] = k;
// ===== sorting
for (int k=0; k<256-1; k )
{ for (int p=k 1; p<256; p )
{ if ( ascii[ order[k] ].count < ascii[ order[p] ].count )
{ int temp = order[k];
order[k] = order[p];
order[p] = temp;
}
}
}
AnsiString msg;
for (int k=0; k<256; k )
{ msg.cat_printf("ascii[=]=%c =>%d ", order[k], order[k], ascii[order[k]].count);
if ( k>0 && k%5==0 )
msg.cat_printf("\n");
}
ShowMessage(msg);[/blue]
[/code] RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
[/quote] 發表人 - lalokalaloka 於 2004/12/13 23:39:13
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |