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

BCB 宣告 struct 位置的問題

 
lalokalaloka
一般會員


發表:9
回覆:4
積分:2
註冊:2004-07-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-11 22:45:31 IP:140.117.xxx.xxx 未訂閱
//開任意黨計算各個 ASCII碼出現幾次 #pragma hdrstop #include "Unit1.h" #include #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- TForm1 *Form1; void __fastcall TForm1::N2Click(TObject *Sender) { AnsiString filename; struct data { int ch=0; //把ASCII 碼用 十進位表示 int count=0; //出現了幾次 }; struct data array[255]; // int k; if(OpenDialog1->Execute()){ filename=OpenDialog1->FileName; }; TFileStream* fs = new TFileStream(filename, fmOpenRead); BYTE AByte; __try { while(fs->Read(&AByte, 1)) { k=AByte; array[k].count ; } } __finally { delete fs; } } ---------------------------- 編譯的結果 箭頭指向宣告 struct 的地方說Cannot initialized a class member here 那我該宣在哪邊呢
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-11 23:11:56 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-12 16:04:03 IP:140.117.xxx.xxx 未訂閱
我又增加了ㄧ段程式碼來把之前的 次數做排序 可是跑道head->count=ascii[0].count; 就會出錯 可以請大大幫忙解答嗎  下面是程式的連結 http://140.117.189.47/hw7.rar #include #pragma hdrstop #include "Unit1.h" #include #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- TForm1 *Form1; 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->st=ascii[0].st; rear=head; head->before=head->after=NULL; //----------------------------------- 排序 for(i=1;i<255;i ) { struct sorting_list *ps; ps=(sorting_list*)malloc(sizeof(sorting_list)); ps->count=ascii[i].count; ps->st=ascii[i].st; if(ps->count>=head->count) { ps->before=NULL; ps->after=head; head->before=ps; head=ps; } //if else if(ps->count<=rear->count) { ps->after=NULL; ps->before=rear; rear->after=ps; rear=ps; } //else if else { for(find=head;find->count>=ps->count&&find->after->countcount;find=find->after); find->after=ps; ps->before=find; ps->after=find->after; find->after->before=ps; } //else }//for //----------------------------------建立樹---------------------------- 發表人 - lalokalaloka 於 2004/12/12 19:55:10 發表人 - lalokalaloka 於 2004/12/12 22:08:49 發表人 - lalokalaloka 於 2004/12/13 00:08:38
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-13 20:08:36 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-13 23:24:11 IP:140.117.xxx.xxx 未訂閱
因為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
系統時間:2024-07-03 1:49:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!