顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


主題 - stlee

頁: [1] 2
1
在pc home股市的個股技術分析圖如果有跟我一樣看不到而且浏覽器剛好是goog chrom
雖然照指示安裝[最新版]java不過卻還是没辦法看到那該死的技術分析圖可以試試以下方法

1.點進無法顯示的圖下面有java下載的連结-->若你無法看到xxxx請先下載java軟體

2.進入java下載中心後到Linux區下載一個java壓縮檔到/home/xxxx裡面
   我下載的是 /home/stlee/jre-7u9-linux-i586.tar.gz

3.不太會解壓的請在Linux下載區那裡點一個<指示>的分頁出來在<2.安裝>的步骤<3.解壓縮 tarball 並安裝 Java >有解壓指令
  要注意該指令中的版本號與下載來的可能有一點點不同:
  指示的指令
   tar zxvf jre-7u7-linux-i586.tar.gz
  我下載的是
   jre-7u9-linux-i586.tar.gz
   所以複制到终端機執解壓時將7u7改成7u9就可以了
  解壓成功後在/home/stlee內會有一個jre1.7.0_09的目錄

4.<3.啟用與設定>雖然寫的是Firefox 或 Mozilla的解决方法不過卻指出一條路就是這一段
  建立符號連結至 libnpjp2.so 檔案 (位於瀏覽器外掛程式目錄中)
  * 請移至 Firefox 安裝目錄下的 plugins 子目錄
    cd <Firefox 安裝目錄>/plugins
  * 建立符號連結
    ln -s <Java 安裝目錄>/lib/i386/libnpjp2.so


5.是滴!!我們要做的就是
   cd /opt/google/chrome/plugins
  移到這個目錄下(或可先用檔案總管搜尋chrome)然後建立(重建)一個符號連結
    ln -s /home/stlee/jre1.7.0_09/lib/i386/libnpjp2.so
   不過如果libnpjp2.so本來就存在,用一般權限是殺不死它的,用下面指令殺吧
   sudo -s
   rm libnpjp2.so
   這時將libnpjp2.so重指到/home/stlee/........红色的libnpjp2.so就變成可以可連結的藍色了(终端機下ls指令時)

6.重開一個浏覽器然後執行需要java的頁面會問你每次都要執行或只有這一次這就看個人需求了


ps.我的情形是(個人猜想,没時間証實)java的安装,符號連結指向root那裡去了所以用一般登入時就不能使用java了


11/09日補充:

今天在另一台以此法實作發現在步驟5有個小問題
/opt/google/chrome下面沒有plugins這一個目錄(這一定是幻覺~_~)
既然沒有plugins那就自己做一個出來吧
  sudo -s
  mkdir plugins
然後一樣進入新做的plugins目錄後建立(重建)一個符號連結
  ln -s /home/stlee/jre1.7.0_09/lib/i386/libnpjp2.so
很好!!!我好多年沒在這一台pc上看到技術線型了,今天終於又重見了(拉炮)

3
C/C++程式設計討論區 / C語言-網路的封包
« 於: 2010-05-26 15:17 »
把這陣子研究用C語言與網路上的伺服器一問一答的工具和大家分享一下
如果有觀念錯誤或不對的地方請先進前輩們不吝指教,感謝^^!


首先....要能以"網址反查出網址"??這是在說什麼呀?
喔!簡單講就是在程式裏面不能以例如yahoo.com.tw或google.com當成參數來連上網路
所以您必須要有:
代碼: [選擇]
main()
{
  hostname[]="yahoo.com.tw";
  char *addr;
  int i;
  
  addr=malloc(128);
  memset(addr,'\0',127);
  i=lee_hostname2addr(hostname,addr);
  printf("********** i=%d addr=%s hostname=%s **********\n",i,addr,hostname);
}

int lee_hostname2addr(char *hostname,char *addrs)
{
  struct hostent *hp;
  struct in_addr in;
  struct sockaddr_in local_addr;

/*printf("hostname=%s \n",hostname);
*/
  if(!(hp=gethostbyname(hostname)))
  {
    fprintf(stderr,"lee_hostname2addr()反查錯誤!hostname參數需先以menset()函數清空的空間\n");
    return(-1);
  }
  memcpy(&local_addr.sin_addr.s_addr,hp->h_addr,sizeof(hp->h_addr));
  in.s_addr=local_addr.sin_addr.s_addr;
  strcpy(addrs,inet_ntoa(in));

/*printf("IP=%s addrs=%s size=%d ...lee_hostname2addr\n",inet_ntoa(in),addrs,sizeof(hp->h_addr));
*/
  return(1);
}

/*接受addr+port字串將之拆成addr及port
如176.38.182.18:8044這樣的一個字串會被拆成176.38.182.18--->以字串型態傳回
及8044--->轉成數字後設定給*po*/
char *lee_addrport(char *host,int *po)
{
  char *addr,*port;
  int di,sn,i,n;

  sn=strlen(host);
  di=lee_memchunt(host,":",0,strlen(host),FROM);
  addr=calloc(sizeof(char),di+1);
  port=calloc(sizeof(char),sn-di);

  for(i=0;i<di;i++)
    *(addr+i)=*(host+i);
  for(i=di+1,n=0;i<sn;i++,n++)
    *(port+n)=*(host+i);
//printf("host=%s addr=%s port=%s \n",host,addr,port);
  *po=atoi(port);
  free(port);
  return(&*addr);
}


然後就可以跟他來個一問一答了
首先是問的部份
代碼: [選擇]
/*
使用者端傳送資料
*/
//void lee_send(int fd,char *fmap,int mapsz,char *fkw,char *ekw)
void lee_send(int fd,char *sendmem,int sendmemsz)
{
  char *tmp;
  int i,tmpsz;

 /*除錯*/
printf("\n[傳送開始]***********************************************************[傳送開始]\n");
/**/
  /*傳去的資料量要減一是字串陣列的末尾'\0'字元否則封包都會多傳一個'\0'  */
/*  if(write(fd,tmp,tmpsz-1)>0 )
    printf("錯誤:傳送失敗\n");
/**/
/*  if(send(fd,tmp,tmpsz-1,0) < 0)
    printf("錯誤:傳送失敗\n");
/**/
  if(write(fd,sendmem,sendmemsz)<=0 )
    printf("錯誤:傳送失敗\n");
/*除錯*/
for(i=0;i<sendmemsz;i++)
  printf("%c",*(sendmem+i));
printf("[傳送完畢]***** lee_send()... sendmemsz=%d *****[傳送完畢]\n",
       sendmemsz);
/**/

//  free(tmp);
}

再來當然是接收他的答了,這裡可能稍微複雜一點,因為發回來的資料可能
1.資料有壓縮過
2.資料編碼方式跟您目前系統的不一樣
3.資料的長度到底是多少,該宣告多大的空間來接收
4.目前還沒遇到的其他各種狀況

關於第1點前陣子有討論過了有興趣可以看一下
http://phorum.study-area.org/index.php/topic,61245.0.html

這裡貼一下比較"正常狀況下"可以解決第3點問題的代碼
代碼: [選擇]
char *lee_recvc(int fd,int *recvsz)
{
  char ch[8];
  char *tmp;
  int i,gi,page;


  page=1;
  tmp=malloc((1024*page) * sizeof(char));/*宣告空間*/
  *recvsz=gi=0;
/*除錯*/
printf("\n[接收開始]***********************************************************[接收開始]\n");
/**/
  while(/*recv(fd,ch,1,0)>0*/ read(fd,ch,1)>0 )/*接收資料*/
  {
    *(tmp+gi)=ch[0];//只複製一個字元時這樣寫應該比strncpy(tmp+gi,ch,1);快很多
    gi+=1;
    if(gi > page*1024)
    {
      page+=1;
      tmp=realloc(tmp,(1024*page));
    }
  }
  *recvsz=gi;
  if(lee_memchunt(tmp,"Could not connect Database",0,gi,FROM) !=-1)
            printf("Could not connect Database  對方主機無回應!\n");

/*除錯*/
for(i=0;i<gi;i++)  printf("%c",*(tmp+i));
printf("\n[接收完畢]***** lee_recv()...page=%d gi=%d *recvsz=%d *****[接收完畢]\n",
       page,gi,*recvsz);
/**/
  return(&*tmp);
}

然後是整合問與答兩者的連線函數
代碼: [選擇]
char *lee_http(char *haddr,
               char *sendtmp,int sendtmpsz,
               int *recvsz/*int code*/)
{
  struct sockaddr_in address;
  int fd,len;
  char *addr,*recvtmp;
  int hap,port;


  if(haddr==NULL)
  {
    *recvsz=0;
    recvtmp=calloc(sizeof(char),1);
    return(recvtmp);
  }

//printf("lee_http()...haddr=%s[%d] addr=%s port=%d \n",haddr,strlen(haddr),addr,port);
  /*addr格式是xx.xx.xx.xx:zzzz 其中的:zzzz是指埠號,以*/
  if((hap=lee_memchunt(haddr,":",0,strlen(haddr),FROM)) !=-1)
    addr=lee_addrport(haddr,&port);//將addr及埠號分解
  else
  {
    addr=haddr;
    port=80;
  }
//printf("lee_http()...haddr=%s addr=%s port=%d \n",haddr,addr,port);


  /*建立連線*/
  fd = socket(AF_INET,SOCK_STREAM, 0);
  address.sin_family = AF_INET;
  address.sin_addr.s_addr = inet_addr(addr);
  address.sin_port = htons(/*80*/port);
  len = sizeof(address);
  if(connect(fd, (struct sockaddr *)&address, len) == -1)
    printf("錯誤:連線失敗\n");
  /*傳資料給伺服器*/
  lee_send(fd,sendtmp,sendtmpsz);
  /*接收伺服器的資料*/
//  recvtmp=lee_recv(fd,&*recvsz);
recvtmp=lee_recvc(fd,&*recvsz);

printf("\nlee_http()...haddr=%s addr=%s port=%d \n",haddr,addr,port);



  close(fd);/*中斷連線*/
  if(hap!=-1)
    free(addr);

  return(recvtmp);

}



等一下!等一下!......這裡說的一問一答到底都問些啥答些啥
其實就是我們以Wireshark所擷取的封包是也,把所擷取的封包照著發一次就好啦!
不過Wireshark擷取的封包必須先處理一下才能拿來用
要不然您也可以學我以前看著螢幕一個字一個字的照著敲然後用strcat()串接起來發出去
不過保證您玩個三天準備看醫生~~~~算了,不囉唆來看看怎麼取用Wireshark擷取的封包吧

首先當然是要有Wireshark啦,什麼!你沒有!!!google一下就有啦^^!
好的,這裡不是Wireshark教學所以自己網路上學一下,其實沒很困難,只要您能從上面看到這裡
相信也是"住巷子裡的"所以抓下來的封包就給他存起來吧

如果您是在win系統存起來的應該是*.pcap的檔案
這時請不要帥氣的左鍵連點兩下點開他而是以右鍵點一下,然後選[開啟檔案]->[WordPasd]
什麼,用Word開啟他....是的....其實用筆記本開就可以了=.=
然後給他另存新檔,檔案類型保持(或選擇) 文字文件
存起來的檔案就大概長這樣子
代碼: [選擇]
??\##P?�J??P#��###U#�K��##?##?###??###?{?d## ?#!E##�jY@#@##|o�#
??\##P}??�Z�P#��?##GET /images/leelib/xyzxxx.gif HTTP/1.1
Accept: */*
Accept-Language: zh-tw
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB6.4; InfoPath.1)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

U#�K v #########?{#??#�d## ##!E##��/@#?��??\o�#
#P#?�Z�}?�P##��##HTTP/1.1 304 Not Modified
Date: Thu, 20 May 2010 10:56:19 GMT
Server: Apache/2.2.3 (Unix) PHP/5.2.5
Connection: close

(以上封包有略為修改)

然後把GET部份的封包用lee_http()發出去就能得到HTTP/1.1 304 Not Modified這個相同的回應了嗎?
基本上是這樣沒錯的,不過其中有個"眉角"
就是您必須在每一行資料列後面跟著一個"\r\n"這樣的換列字元
不過這個"\r\n"您直接敲進去又不行,也就是說您把他改成這樣子
代碼: [選擇]
GET /images/leelib/xyzxxx.gif HTTP/1.1\r\n
Accept: */*\r\n
Accept-Language: zh-tw\r\n
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB6.4; InfoPath.1)\r\n
Accept-Encoding: gzip, deflate\r\n
Connection: Keep-Alive\r\n
\r\n
這肯定是行不通的,因為這個\r\n是"兩個字元",如果直接在文書處理器敲進去的則是4個字元的\r\n

這時如果您手上有vi或另一台電腦是Linux(裏面有vi)那麼將WordPasd存起來的那個檔案利用gmaile傳到Linux電腦上...
(不一定要靠gmaile啦,不過我都是用gmaile傳的,因為.......他免費=..=")

然後如果有轉碼問題(像我ubuntu附的文字編輯器無法自動辨識)則可以用OpenOffice開啟(開的時候會自動轉碼)
然後給他存下去,當然以保留目前格式方式存

再來以vi 打開這個檔案時您會發現在每一列的後面有個奇怪符號像這個樣子
代碼: [選擇]
GET /images/leelib/xyzxxx.gif HTTP/1.1^M
Accept: */*^M
Accept-Language: zh-tw^M
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB6.4; InfoPath.1)^M
Accept-Encoding: gzip, deflate^M
Connection: Keep-Alive^M
^M
是的!你得到他了
不過.....這一個^M你就算自己敲上去也沒用
因為他的顏色會明顯與您自己敲進去的字元的顏色不一樣(但這個字元在vi內是可以複製的)



這個\r\n還有第2種方法可以取得,前面有說過用strcat()函數串接吧
代碼: [選擇]
strcat(tmp,"GET /images/leelib/xyzxxx.gif HTTP/1.1\r\n");
strcat(tmp,"Accept: */*\r\n");
.....
.....
這樣子的方式其實也是可以的,不過如果我們如果可以把每一個GET或POST動作存在檔案裏面變成其中的一個步驟而已
那麼........事情應該會變得簡單多了
當然,讓事情變"簡單"以前,肯定是有點小複雜的,這就是我們要研究的地方啦.....待續



4
情形是這樣的
寫了一個程式是在網路上抓取網頁的
其中有一種封包抓下來是這樣的
代碼: [選擇]
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: text/html; Charset=UTF-8
Content-Encoding: gzip
Expires: Wed, 05 May 2010 14:43:26 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
P3P: CP="CAO PSA OUR"
Date: Thu, 06 May 2010 14:43:27 GMT
Content-Length: 287

Content-encoded entity body (gzip):287 bytes -> 261bytes     這一段是Wireshark的訊息(我抓到的封包裏面沒這一段)
............從這開始有287Byte的資料,使用Wireshark可以看到內容(明碼),不過Wireshark上的資訊也說這是壓縮過的資料
問題在最後面的 Content-Length: 287
發現他上面有這一句Content-Encoding: gzip的描述是說這287Byte資料是由gzip壓縮過的?
因為基本上用
for(i=0;i<sn;i++)
printf("%c",*(tmp+i));
這樣給他顯示時這一段287Byte的部份是亂碼

不過使用zlib函數庫內的公用函數uncompress(unzip,&unzipsz,zip,zipsz);給他解壓
給我傳回來一個Z_DATA_ERROR

請問是少做或多做還是哪裡沒做到了什麼!?
非常感謝^^!


ps.
問題一直有修改(增加內容),是因為還沒人回應,擔心是沒把問題說清楚,所以加上去,原來問題沒變,還是這個壓縮&解壓問題

5
Linux 討論版 / 升級ubuntu9.04後無法連線
« 於: 2009-05-04 16:33 »
話說剛剛從8.10升級(就是在安裝更新套件那裡的升級給他按下去)到9.04
居然不能上網了....耶!那怎麼能來這裡po文?....已經解決了嘛,不然您以為我有第2台電腦呀^^!
其實不能連線的原因就是.......DNS設定不見了

1.請開啟終端機輸入以下指令
sudo vi /etc/resolv.conf

2.然後在裏面輸入鳥哥的LINUX私房菜伺服器架設篇第6-16頁最下面那個東東
nameserver 168.95.1.1
nameserver 139.175.10.20
nameserver 163.28.113.1


3.重新開機,搞定,開工,上網

ps.
有可能是我在有一個刪除檔案的步驟時選是否要保留檔案,我選了不要保留>"<
不過到底原因是什麼...問題已經解決了,也沒想追根究底了,如果您有看到本文且剛好想升級
請說一下選另一個的結果會怎樣?謝謝啦^^!
或者是大家都沒問題,只有我遇到這個鳥問題...那...就算了 :P

6
剛剛因為女王吩咐要把動物園的開放時間查一下怕要去看貓熊會遇到休館(人家還沒開放您擔心到休館了>"<)
所以去動物園把動物園開放時間印下來....結果一直沒辦法印出來

我的印表機是SAMSUNG的ML-2010之前用8.04時沒有安裝的問題,因為有段時間了印象中一插上去就自動抓到裝好了

不過剛剛遇到一個小麻煩,由於(可能)之前是以ubuntu的更新管理員來進行升級的(不是重灌,但也滿接近了啦)

現在ubuntu8.10居然彷彿不認得印表機了....於是google...很像沒這種鳥問題

突然靈機一動:讓他重抓一次吧-------->搞定

請使用[系統]--->[管理]--->[列印]--->[新增]圖示按一下--->然後照其無腦安裝步驟一一完成

嗯...貓熊館應該近兩年是不會休館了(敢休貓熊館!不怕遊客拆房子嗎)

7
呵呵!隨著消費卷發放日期越近,老婆的勸敗指數也節節升高>"<

打從消費卷新聞一出來我們就鎖定要拿來買一台小筆電了,原因呢很簡單:一台電腦兩人搶

由於家裡只有兩口子人所以當然是要買一台一萬以下的了(兩份消費卷)

也許有人認為一萬以下沒好貨

不過這一台只是單純為懶惰的老婆不跟我搶電腦+能讓他舒舒服服在被窩裡上網看影音吃零食用的

所以我認為已經很夠用了

鎖定Aspire One與EPC901是因為前幾天到大潤發時看到這兩台的4G Linux機種(EPC很像是900不是901)都是特價6999

我想說現在已經殺成這樣了,如果消費卷真的出來了廠商應該是有一波促銷行動,所以EPC的部份就給他鎖定到901身上啦

至於價差的部份我想應該以目前來講規格都差不多只是差在SSD的部份(不過預計這台用個2~3年後SSD應該也都殺到血流成河了,到時再來加大)

現在想請有買的人能不能提供一下使用的心得(感想)來分享一下...非常感謝喔^^!


8
拾人牙慧 / vim-回到上次所編輯文件的位置
« 於: 2008-07-19 18:27 »
之前在RH9下使用vim有一個讓我非常"尬意"的功能

那就是在每次退出一份文件後再重新進入該文件時,游標就會在當時退出的地方

也就是說當我程式寫到aaa.c的第1452列時突然有事必須關電腦了,那在我下次開電腦以vim打開aaa.c時游標還是停在1452列

原本以為這是天經地義的(使用vim一定會有的功能)....

但當我轉換跑道到ubuntu8.04時.....天地難容阿...這個功能不見了....每次都要從第一列開始去"翻"到上一次寫的地方

如果只有在寫一個.c的檔案還好,但如果是同時編輯多個檔案...那死了.....上次到底是寫到哪裡了?_?.....哪裡有可能"漏溝"了?_?

前面講這麼多了還是來"禮贊"google大廟裡的眾神保佑
http://bbs.chinaunix.net/viewthread.php?tid=1024941&page=1

在.vimrc裏面加上這一行即可

au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

阿哈!開啟的文件都要能回到上次離開時的位置才是天公地道的事情呀^_^

--------------------------------------------------------------------------------------------------------------------
ubuntu8.04內定並不會將之前的"行程"保存,也就是說開了一個[終端機]並將之最小化後(不關閉)下次開機時還要開一次終端機

同上面vim一樣,如果同時編輯多個檔案....這也挺討厭的.....還要重新一個一個開起來

[系統]--->[偏好設定]--->[作業階段]---><作業階段選項>將"登出時自動記住執行中的應用程式"勾選起來.....下次開機還是那個終端機

不過沒試過不退出每個shell內的vim所編輯的檔案都會"原封不動".....下次給他試試(在RH9時shell雖被保留,但編輯的文件仍需重開)

保留shell其實就是保留住"所在路徑"....也可以說保留住一個"開發環境".....

3個shell專門搞.h檔的....5個shell就弄函數庫用的.....等之類的"環境"(每次開機都要開那麼多個shell也算累人了)




9
雜七雜八 / 抱怨文!中華電信
« 於: 2008-07-14 16:35 »
剛剛開機連上網時....告非....怎麼那麼慢!?

趕快開另一台起來...根本連不上去

嗯....之前有幾次經驗問題出在中華電信那裡!?

趕快打給客服....

客服:報上大名,身份證號!@#$#$%#驗證一番.....請問您作業系統(尾音->XP嗎?)....星光大道看多了是吧!還給我收尾音勒

我:Linux...Ubuntu的

客服:愣住............請等一下...........電話登登登的約五分鐘

客服:因為Linux版本太多了,請您到xxx網站那裡有教人如何如何!@#$@%#...因為我們這邊的線路測起來是正常的!

我:那好吧

想當然的我根本沒上去他說的網站,只是兩台都做個重開機的動作

重新開機以後....連不上去那台,連上去了....速度很慢那台,正常了..........見到大頭鬼了?!

==================================================================================
上一次的經驗是幫我轉呀轉的轉到很像是機房的單位...後來接電話那個人跟我說:接點鬆了!!@#$%^&*#$@


10
雜七雜八 / 台灣山上能拍到這個!
« 於: 2008-07-11 20:06 »

http://www.starworks.idv.tw/home.htm

在網頁右上那裡有個<天文鬥嘴古>....該站討論區的樣子

裏面有人展示作品....稍微逛一下後驚訝的發現....那些照片都是在台灣山上拍的

以前一直以為只有哈伯望遠鏡才能拍到這種畫面,沒想到在台灣山區也能拍出這些照片

照片總解析度當然不能跟哈伯望遠鏡比,不過技術也很嚇人了

========================================================================
以前曾經在印尼用"肉眼"看到過一個螺旋狀的星系...

後來看電視說該星系(名稱忘了)只能在南半球看到而且是唯一能用"肉眼"觀測到星系的旋臂

(當時以為看到飛碟了....仔細看以後原來是個星系...還以為只要無光害應該都能看到類似星系)


11
最後還是不死心,想要在ubuntu下不經過環境設定轉換的方式找出curses對UTF-8的亂碼有一個直接的解決辦法

終於google到幾篇文章
http://crazykevin.com/?p=92
http://my.opera.com/mingfal/blog/show.dml/395261
還有一個英文的(雖然看不懂,但丟到google翻譯倒也知道了個幾分的意思)
http://mail.nl.linux.org/linux-utf8/2004-08/msg00001.html

裏面所提的重點這裡不在贅述,只是我照著做以後發生了一個問題......
setlocale(LC_ALL,"");
這個函數一加到程式裏面就有了"include不進來?"的問題
http://phorum.study-area.org/index.php/topic,52403.0.html

解決方法呢?靠著一點點運氣,一點點經驗跟很多很多的到google大廟內參拜終於找到一個函數庫,這也就是第1點
1.從[系統]-->[管理]-->[synaptic套件管理程式]-->[搜尋]-->搜尋欄位輸入" locale "..搜尋於欄位選擇"描述及名稱"
這時會出來一大堆套件,不過我們要找的是一個"函數庫"所以只找libxxx名稱的套件,而以lib開頭的函數庫也還滿多的,再把目標縮小到有ubuntu標誌的那幾個
於是終於可以看到一個名為 libicu-dev 的函數庫

其實我也看不懂libicu-dev到底是做啥的!?只是看到其描述最後一句.....for unicode...就把他送到google大廟的偏殿google全文翻譯去....嗯...應該就是他沒錯了

然後呢??還是不行呀,拿出一點點經驗跟一點點想像力...很像跟編碼有關的都歸 locale 管的樣子,那麼是否有一個叫作 locale.h 的含引檔呢?
2.加入含引檔 #include <locale.h>
locale既然是一個在系統下的命令,那他也就是一個程式?既然是一個程式,那他就有可能有一個函數庫可供使用,函數庫..這都要有一個含引檔吧!
而以命名習慣來說你再給人亂取一通不是在找麻煩嘛XD.....(後面這句自己亂加的當沒看到吧XD)
如果第1.沒做直接做這裡說不定也是可以的,只是我所安裝的ubuntu8.04的版本算是一個"很乾淨"的版本,所以一些程式開發的東西可能都還要抓才可以

好了!由上面google到的3篇文章來說可以知道幾個訊息... curses 與 ncurses 是不同的函數庫,而可以處理UTF-8碼的函數庫名稱叫作  ncursesw 所以了
3.原來的#include <curses.h> 或 #include <ncurses.h> 要改成 #include <ncursesw.h> 或是 #include <ncursesw/ncurses.h>
至於該改成怎樣這就要看在您的系統下ncursesw到底是怎麼樣子的,比如我用檔案瀏覽器的搜尋功能去找 ncursesw 他有找到一個資料夾
名字剛好就是ncursesw(不過為何檔案瀏覽器沒辦法顯示點選物件的路徑呀?)所以我的是#include <ncursesw/ncurses.h>

然後在編譯指令也必須聯結到這一個ncursesw
4.原來的編譯指令gcc ..... -lcurses 或 gcc ..... -lncurses 則改成 gcc ..... -lncursesw 表示我們要聯結的是支援UTF-8的ncursesw函數庫不是curses也不是ncurses
xxx.h有可能會因為寫作技巧的關係讓我們叫用curses.h,ncurses.h,ncursesw.h都是一樣的(不過我沒試過,有興趣可以試一下),而且在英文的那個文件
看起來的意思(本人英文很差只能靠google翻出來2266的中文來猜)也是說ncursesw是專為UTF-8寫的一個函數庫所以這一步驟是滿重要的

還有在我實際使用時有一點也是覺得滿重要的
5.在初始化curses函數庫的 initscr() 前必須先叫用 setlocale(LC_ALL,"") 函數,順序不可以弄反了
其實這個也不算重點,就是一個邏輯上的關係而已,只是如果不提出來,又剛好死不死的就是弄錯順序了.那老是在抓前面4個點的錯誤....這不是很冤嗎^^!


最後有一點注意的,就是utf-8的編碼方式是不定長度的,也就是說編出來的一份文件不再是一個英數字型是1Byte一個中文字是2Byte的
這是我昨天寫來算一份文件(字串)要對應到螢幕上座標位置的片段
代碼: [選擇]
  for(n=0,y=dspy;n<size;y++)
  {
    for(bt=128,byt=0;bt>1;(bt/=2),byt++)/*求出這個utf-8編碼共佔多少Byte*/
      if(!(*(str+n) & bt))
        break;
  }

而這兩個函數是昨天想自行重組utf-8後丟進curses的觀察用工具(結果當然是失敗做收啦>"<),不過滿有趣的,跟危機百科的utf-8
http://zh.wikipedia.org/wiki/UTF-8
相互對照一下,看看倒底UTF-8都在編些啥東東@@!
代碼: [選擇]
/*顯示字串*str共size位元每一個Byte的Bit狀態主要是察看utf-8的狀態*/
int lee_utf8bitdsp(char *str,int size,int dspx,int dspy)
{

  int i,n,b,x,y,bt,byt;

  for(n=0,y=dspy;n<size;y++)
  {
    for(bt=128,byt=0;bt>1;(bt/=2),byt++)/*求出這個utf-8編碼共佔多少Byte*/
      if(!(*(str+n) & bt))
        break;
    if(byt<1)
    {
      lee_bitdsp(str+n,1,dspx,y);
      n+=1;
    }
    else
    {
      lee_bitdsp(str+n,byt,dspx,y);
      n+=byt;
    }
  }
  refresh();
}

/*將從*ptr開始的位置共len個Byte的每一Bit狀態顯示出來*/
int lee_bitdsp(char *ptr,int len,int dspx,int dspy)
{
  int i,x,b;

  for(i=0,x=dspx;i<len;i++)
  {
    for(b=128;b>0;(b/=2),x++)
    {
      if((*(ptr+i) & b))
        mvprintw(dspy,x,"1");
      else
        mvprintw(dspy,x,"0");
    }
    if(len>1)
    {
      mvprintw(dspy,x,",");
      x+=1;
    }
  }
}

12
C/C++程式設計討論區 / utf-8字碼顯示問題
« 於: 2008-06-29 20:17 »
先講一下我用Big5碼顯示的方法
代碼: [選擇]
如果有一字串我要讓他不是以字串顯示而是以一個bByte一個Byte出來
int euc(char *s,int sz)
{
  .....
  .....
  for(i=0,x=0;i<sz;i++,x++)
  {
    .....
    mvprintw(y,x,"%c",*(s+i));
    .....
  }
}
為什麼這樣做呢!因為邊界有半個中文的顯示問題,中文字都是"一個字"而沒有"半個字"的
所以在左右邊界的中文字剛好必須顯示"半個"時則加以判斷並以其他符號顯示出來如>號或<號

Big5碼都是以2Byte來表示一個中文字,這樣做沒問題

不過今天在將Big5文件都轉成utf-8後本以為一切順利...但是....出來的還是亂碼....

彷彿記的utf-8的編碼方式有點兒....奇怪!?

於是給他用"utf-8編碼方式"google到
http://zh.wikipedia.org/wiki/UTF-8
http://blog.csdn.net/polarman/archive/2007/04/30/1593159.aspx

仔細瞧瞧編碼方式....天阿!!

utf-8的編碼方式並沒有固定位元組數,而是必須以第一個Byte來決定其位元數

不禁有點後怕了...utf-16...utf-32.......不過先不管了

請問一下:
1.該如何知道這個位元是utf-8的第一個位元(老實講那兩個連結有點有看沒懂)
1.1.--->該Byte的最左一個Bit是1就是utf-8的前置碼反之最左一個Bit是0就是ASCII碼(這樣講不知有沒有對)

2.取得前置碼後按其描述往後讀出n個Byte將其送出就能顯示出utf-8的中文字?

3.要往前還是往後(很像還有如前置碼描述3Byte時這3Byte還有前後關係的樣子?)

非常感謝^^!


13
當裝好ubuntu8.04後雖然可以使用了,但是想在其下寫C還是會遇到一些中文上面的問題(英文不錯的就甭看下去了^^!)

本人是經過這裡
http://www.ubuntu.org.tw/
到這裡下載ubuntu8.04的
http://wiki.ubuntu.org.tw/index.php/%E5%A5%97%E4%BB%B6%E5%BA%AB%E4%BE%86%E6%BA%90%E8%88%87%E5%85%89%E7%A2%9F%E7%89%87%E4%B8%8B%E8%BC%89
然後用推荐的套件將ubuntu8.04的介面中文化
http://lazybuntu.openfoundry.org/
(還真不錯用)


裝好ubuntu8.04以後要寫程式首先就是vim的問題,vim有何問題?vim沒問題,有問題的是裏面根本就沒有vim而是vi

vim跟vi有差嗎?嗯....拿來寫C就會差很多了

這裡有安裝的方法(沒講到裝vim,但...),不過首先要把 libc6-dev 這個套件裝起來,不然想寫個hi都不行
http://phorum.study-area.org/index.php/topic,52403.0.html

再來就是本人遇到的問題:在原系統RH9轉換到ubuntu8.04
http://phorum.study-area.org/index.php/topic,52368.0.html

然後把原環境的檔案轉過來
http://phorum.study-area.org/index.php/topic,52441.0.html

在安裝enca時看到一個有趣的東東 libenca-dev 想說也是啦,自由軟體好處就在這裡,你除了可以用他的功能還有函數庫給你用(開發)
(我沒會錯意的話enca的函數庫就是他啦...趕快google研究一下先)

google到的這一篇是iconv的,雖有介紹在C語言使用iconv函數但無範例
http://www.jollen.org/blog/2006/09/libiconv_1.html

而以"c語言 iconv"去google可以找到一些範例,這一個是我認為比較看的懂的
http://www.w18.net/viewthread.php?tid=626






14
起因於這一篇文章
http://phorum.study-area.org/index.php/topic,52368.0.html
不過在最後的筆記已經有解決方案

於是寫了一個b2u.sh進行轉碼工作
代碼: [選擇]
mv file.h file.big5
mv filemenu.h filemenu.big5
mv hbpfs.h hbpfs.big5
mv keydec.h keydec.big5
mv net.h net.big5
mv scrcolor.h scrcolor.big5
mv state.h state.big5
mv stateo.h stateo.big5
mv udfmenu.h udfmenu.big5

iconv -f big5 -t utf8 file.big5 > file.h
iconv -f big5 -t utf8 filemenu.big5 > filemenu.h
iconv -f big5 -t utf8 hbpfs.big5 > hbpfs.h
iconv -f big5 -t utf8 keydec.big5 > keydec.h
iconv -f big5 -t utf8 net.big5 > net.h
iconv -f big5 -t utf8 scrcolor.big5 > scrcolor.h
iconv -f big5 -t utf8 state.big5 > state.h
iconv -f big5 -t utf8 stateo.big5 > stateo.h
iconv -f big5 -t utf8 udfmenu.big5 > udfmenu.h

不過....事情既然能做到更好,為何不把他做得更好呢?

也就是說如果我們能先收集所在目錄下的*.c檔名然後套用上面的b2u.sh

1.要能取得所在或指定目錄下的指定副檔名或相似檔名使之成為一字串陣列

2.將該字串陣列套用mv及iconv指令使用system()來進行大量檔案的轉碼工作

1.2.這兩點相信不難達成

不過目前的困難是該如何得知文件本身是何種編碼

也就是說今天檔案是自己寫的,這當然能夠知道其編碼

不過如果有天拿到一份檔案一開都是亂碼時該如何知道該文件原來使用的編碼

還是說已經有這個指令可以用了.......那!又可以偷懶了^_^

非常感謝^^!

15
C/C++程式設計討論區 / include不進來?
« 於: 2008-06-24 15:02 »
將之前在RH9寫的程式放到新灌的ubuntu8.04下編譯時

代碼: [選擇]
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <term.h>
#include <termios.h>
#include <time.h>
這幾列在編譯時,發生這個錯誤
代碼: [選擇]
/home/stlee/include/state.h:14:20: 錯誤: stdlib.h:沒有此一檔案或目錄
/home/stlee/include/state.h:15:19: 錯誤: stdio.h:沒有此一檔案或目錄
/home/stlee/include/state.h:16:20: 錯誤: string.h:沒有此一檔案或目錄
/home/stlee/include/state.h:17:18: 錯誤: term.h:沒有此一檔案或目錄
/home/stlee/include/state.h:18:21: 錯誤: termios.h:沒有此一檔案或目錄
/home/stlee/include/state.h:19:18: 錯誤: time.h:沒有此一檔案或目錄
/home/stlee/include/state.h:21:23: 錯誤: arpa/inet.h:沒有此一檔案或目錄
/home/stlee/include/state.h:23:27: 錯誤: linux/sockios.h:沒有此一檔案或目錄

但自訂的一些含引檔
代碼: [選擇]
#include "/home/stlee/include/keydec.h"
#include "/home/stlee/include/scrcolor.h"
#include "/home/stlee/include/file.h"
#include "/home/stlee/include/hbpfs.h" /*不限位數四則運算*/
#include "/home/stlee/include/net.h"
#include "/home/stlee/include/udfmenu.h" /*可設定式主選單*/
卻沒有錯誤訊息



我的寫法是這樣子的
1.在所有函數檔中都只含引一個"/home/stlee/include/state.h"
2.在state.h內則含引所有需要的含引檔如<stdio.h>,<stdlib.h>.......

請問為何這樣寫法在RH9可以,在ubuntu卻不行!?


16
Linux 討論版 / ubuntu文字模式問題
« 於: 2008-06-21 17:15 »


剛裝好的ubuntu如上圖所見在左邊文字模式下的vi無法顯示中文(有試過可以選擇的編碼了)

且連在撰寫的C原碼也不會自動變色(至少註解要變一下比較方便呀)

想請問到底是啥原因....

非常的感謝^^!

ps.檔案是之前在RH9下面寫的,複製到隨身碟後在灌好ubuntu後開啟的

PS2.隨身碟是[有點軟]的FAT?....想說兩邊都可以被讀到就不換成Linux的EXTx了.....



17
問題是這樣的

目前當我要重置一個指標陣列有兩項做法

第一個辦法是傳給重置函數原先的指標陣列後
在該重置函數內宣告一個新的指標陣列然後複製舊的指標陣列(某部分)
在傳回新的指標陣列前將舊的指標陣列釋放
代碼: [選擇]
main()
{
  char **sp;

  sp=aaa(sp);
}

char **aaa(char **orisp)
{
  char **newsp;

  newsp=(char **)malloc(x * sizeof(char **));
...
...
  free(orisp);
  return(newsp);
}

第二個辦法是在重置函數的參數內設一個對應遠一程的指標,並不傳回
代碼: [選擇]
main()
{
  char **sp;

  aaa(&sp);
}

void aaa(char ***ssp)
{
  char **sp;

  sp=*ssp;
...
...
  sp=(char **)malloc(x * sizeof(char **));
...
...
  *ssp=sp;
}

第一個辦法缺點是容易留下垃圾...有時候除了要free(sp)還有可能要free(*sp)

第二個辦法缺點是容易混淆,比如我的函數是要處理二維指標,但看函數原型卻容易認為要處理的是三維指標而傳入三維指標

所以想請問是否有型別的描述詞或其他的方法來避免掉這兩種方法的缺點?_?

謝謝^^!

18
試想想,如果我們有15個參數要傳遞給函數那應該要怎麼寫......

把這15個參數一一的傳過去....abc(a,b,c,d,e,f,.......)然後abc函數這樣宣告abc(int a,int b,int c,int d...........)

好吧....用結構

但如果我們這15個參數的每一個參數都只是代表著"開啟,關閉","是,否","要,不要".....這樣的狀況時

真的有必要去宣告15個參數......嗯...可以用短整數呀.....那何不只用一個int就能把他表達出來

權限的rwxrwxrwx這樣的表示法其實也是用這種"一個int表示多種狀況"的實用手法....真的嗎!?...喜金A

不過我們不是要講權限的,有興趣去參考一下標準函數stat()下的st_mode這個參數
(除了權限還有檔案類型的資訊都可以用一個參數(不是結構)就解決掉,但其長度(型別)可能不只int(32位元)而已)

要了解這種寫法首先必須先了解兩點
1.二進位的表示法
2.if的判斷如何成立或否定的

看起來很像很深奧....其實你叫我講太深奧的我也不會講,也只是就"使用心得"作一下報告

背後的原理....嘿嘿...機關都是藏在2樓的....我們可能剛入門在一樓而已連樓梯都還沒看到的就別管2樓的機關怎麼運作的了吧

好..先來看第一點:二進位的表示法

其實這不用講了----->01110101這就是一個八位元以二進未來表示的值

這沒啥好講的吧....嗯....那你會用哪一種方法來將他轉換成10進位的值?!

沒錯!將二進位表示法轉換成10進位的方法很多種(我是指在紙上作業的那幾種)不一一列舉了(也只是知道不只一種而已,也不會列舉啦)

不過有一種方法對我來說是比較容易的.....忘了是怎麼會的...應該不是書上看來的也不是老師教的(無師自通!!!應該沒那麼神奇啦(又不是神奇寶貝說),反正就是忘了)

那就是將這個以二進位表示法的0與1轉個90度,然後將其個別表示的值加起來就是該值的10進位的表示法了

上例的01110101轉過來就是(左上右下)
0
1
1
1
0
1
0
1
然後呢....2的升冪次會背嗎??就是1...2...4...8...16...32...64...128...256...512...1024...2048...4096....
由下而上一一帶入
代碼: [選擇]
0 * 128 =  0
1 * 64  = 64
1 * 32  = 32
1 * 16  = 16
0 * 8   = 0
1 * 4   = 4
0 * 2   = 0
1 * 1   = 1
把最右邊那些值加起來就是了......

這個轉換法和一個int傳32個參數有關係嗎!?....一點關係都沒有m(_._)m

挖勒靠北邊走...裝孝維喔......別生氣.....這和你要設定某個參數是開還是關有絕對的關係而且關係匪淺

不過在講到設定某個參數是開還是關又必須先了解第二點了.....if的判斷如何成立或否定的
代碼: [選擇]
if(0)
  printf("000\n");
if(1)
  printf("111\n");
if(3)
  printf("333\n");
if(-1)
  printf("-1-1-1\n");
if(-5)
  printf("-5-5-5\n");
你猜猜...有哪幾個會被執行.......試看看不就知道了^^!


答案是除了if(0)不會被執行,其他的都會被執行

那這個又和一個int傳32個參數有關係了!?當然是關係匪淺囉!!!

試想想如果我們的某項運算式只要運算結果不是0就會被執行,而運算式結果為0就不會被執行.......阿不就跟"開,關","是,否","要,不要"...的道理一樣

好...轉回到二進位的表示法,我們知道:當一位元組內某位元是1表示該位元經過運算後一定會是一個不為0的值

也就是
當最右邊的第一個位元代表1,而當該位元是0表示1不存在,該位元是1表示1存在--->最終的轉換是否要加上1
當最右邊的第二個位元代表2,而當該位元是0表示2不存在,該位元是1表示2存在--->最終的轉換是否要加上2
當最右邊的第三個位元代表4,而當該位元是0表示4不存在,該位元是1表示4存在--->最終的轉換是否要加上4
當最右邊的第四個位元代表8,而當該位元是0表示8不存在,該位元是1表示8存在--->最終的轉換是否要加上8
.....
.....
.....

所以當我們能在if()的判斷式內直接和其中某個位元進行運算進而判斷出該位元是否存在也就能達到一個數值傳遞多個參數的目的

那該怎麼做?!還記得前面2進位10進位轉換法嗎
00000001 = 1
00000010 = 2
00000100 = 4
00001000 = 8
00010000 =16
00100000 =32
01000000 =64
10000000 =128

看出奧妙所在了嗎......每增加一個次方也只是1向左移動一個位元

所以我們可以定義一些常數來代表一些狀況

比如
代碼: [選擇]
#define INSSTR   1
#define INSROW   2
#define INSCOL   4
#define DELSTR   8
#define DELROW   16
#define DELCOL   32
#define MOVSTR   64
#define MOVROW   128
#define MOVCOL   256

然後呢.....在C語言裡面有個運算子&可以用來做位元運算

什麼.....那是指標的取址符號....請把書再翻一下有關於運算子的章節先.......

好了...我們把用#define定義好的常數搭配&運算子就可以用來表示某個功能是否開啟了
代碼: [選擇]
abc(int funcode)
{
if(funcode & INSSTR)
  進行單一元素插入
else if(funcode & INSROW)
  進行元素列插入
else if(funcode & INSCOL)
  進行元素行插入
else if(funcode & DELSTR)
  進行單一元素刪除
else if(funcode & DELROW)
  進行元素列刪除
else if(funcode & DELCOL)
  進行元素行刪除
else if(funcode & MOVSTR)
  進行單一元素搬移
else if(funcode & MOVROW)
  進行元素列搬移
else if(funcode & MOVCOL)
  進行元素行搬移
else
{;}
}
阿勒...那麼多個if()...else if()....有點眼花.....這是寫作技巧的關係...當然可以用比較簡潔(有效率)的方法寫不過這裡不討論寫作技巧.......

看到了嗎....我們的abc()函數只用一個參數funcode達成了傳遞多個參數的目標了^_^y

不過這其中的限制是這個參數必須只有"開,關","是,否","要,不要"...這種狀況.....

權限的rwxrwxrwx不也就是這樣的(道理)嗎........

19
其實從一個一般的文字檔內取出我們在程式裡預先設定好格式的參數一點也不困難

在以前DOS下我都是這樣做的
fscanf("c:\aaa\bbb.txt","%s %d %s\n",a,&b,c);

可是這有些問題:
1.如果要取的參數很多那光是一一對準格式(型別)就是個大工程
2.在設定時有時候根本不知道哪個是哪個(也就是說可能無法有註解的情況)
3.格式幾乎固定無法予以"排版"
4.以一個32位元整數代表32種狀況的設定值可能要在取出函數內費一番大功夫
5.如果是多個行程共用的設定檔時該如何解決
6.最好能在未設定的參數時程式裡面能有內定值保證程式能順利運行

所以想寫一個模組起來可以排除這些狀況(達到這些要求)
其實要取的資料最多就大概三種格式1.字串2.數值3.替換值

字串與數值大概沒啥疑問,那替換值是啥東東!?
這樣子講好了:如果在螢幕調色盤共有256色的情況下你該不會想去記紅底白字的顏色是編號第X號色藍底黃字的顏色是編號第N號色......
但如果我們以B代表底色F代表文字顏色而底色從0~7共8色文字色從0~15共16色,所以紅底白字是B1F15藍底黃字是B4F11這樣的表示是否清楚好記呢

還有我們希望INSSTR表示使用者可單一元素插入,INSROW表示列插入,INSCOL表示行插入,DELSTR表示單一元素刪除,DELROW表示列刪除..........
而這些狀況只用一個int整數(不是陣列,就是一個32位元的整數值而已)就可以設定起來讓程式可以一這個設定來決定哪些功能需開啟哪些功能不開放
這種將我們容易記得的文字轉換成數值的設定法我稱之為替換值的設定

閒話休說看張圖先

是滴!這是我目前所用的自定設定檔的格式

標籤的部分可以讓多個不同的行程(程式)共用同一份文件
註解和連續的空列可以讓設定者自行排版出所喜愛的格式
三種資料格式應能應付一般使用者與程式溝通的橋樑(設定檔應該就是扮演程式和使用者之間橋樑的角色)

哇靠!?要達到的功能這麼多原始碼一定很複雜吧----->其實主要的取出以及判斷函數100行不到
100行不到?!這麼簡單----->其實複雜的是前置作業
那前置作業有多複雜!?....啊就一個觀念,一個地方注意一下,寫一個函數叫用....就可以了,並沒有~架~複~雜啦^_^







20
在其他語言中要做到不定長度的字串陣列可能很容易,但在c語言中很像沒有能達到這個需求的標準函數可以用
所以自己寫一個起來大家參考參考並請給予指教^^!

首先我們必須看一下一組資料在檔案(記憶體)內到底是"長"怎樣的
底下是一個自定設定檔在vi內所能看到的樣子,當然和三維字串陣列無關,只不過目前只有這張圖...就湊合著看吧@@!
(請不要理會上半部用小畫家畫的那些東西...那是要在"從檔案取出設定"的說明部分)

這當然看不出什麼....就是一個文字檔

不過我們在程式中當然不能只看到這些,因為還有一些"不可視字元"存在於這一份文件中的
也就是'\n'這個字元都會在每一列的列尾存在著
這張圖的'\0'字元是用一個函數將"//"到'\n'都替換成'\0'的....同樣的上半部"從檔案取出設定"的說明部分也請不要理他


嗯.....這兩張圖其實跟現在要說的其實沒有直接的關係(那幹麼po出來....就說先湊合著看了嘛>"<)
不過雖然沒關係卻也指出了一個重要的觀念
其實不論在檔案內或在記憶體內資料都是以線性(至少看起來是這樣)的方式存放的,而分行或分列只是利用某個字元加以區別行與列
也就是說當資料如下
111-0 111-1
222-0 222-1
333-0 333-1
我們看起來是三列但他真實的面目(實際存在於儲存設備)應該是這樣的(如果資料長度很長可能在實體設備中是被拆開的但在透過取出動作他一定是要看起來是連續的)
111-0 111-1\n222-0 222-1\n333-0 333-1\n

而這和不定長度三維字串陣列有何關係!!!嘿嘿!!機關藏在二樓,奧妙就在這裡 ;D
如果我們能找到一連續資料中代表每一列的末尾字元,就可以將之拆成二維字串
相對的,將每一個二維字串內的元素的末尾字元找到,就可以拆成三維字串

不過請注意一點,而且是非常重要的:就算定位到了"一維陣列中的每一個元素並不代表可以將該元素予以個別的釋放"
簡單講比如一字串"123456789"要變成"123489"你不能只將其中的"567"部分釋放而是必須將整個"123456789"釋放掉
這有何重要?!.....別忘了,現在要處理的是三維的陣列,也就是一個字串表格,你也不想只為了變動其中一個元素而去處理整個表格吧

這樣講不知道有沒有清楚??不清楚也沒辦法了,下面都是程式碼了......

21
C/C++程式設計討論區 / vmalloc()怎麼用??
« 於: 2008-04-01 20:44 »
請教一下有用過的大大

在#include <linux/vmalloc>時他告訴說該檔不存在

所以呢去搜尋了一個出來複製到/usr/include下....結果當然不能用

請問這個函數的使用是否還需要另外裝套件才能去用它

還是有特殊的指令???

不然他明明已經在我的電腦裏了,但就是不能用它

好痛苦阿>"<

22
請問在Linux下是否有像Turbo C的coreleft()函數可得知可用記憶體空間的函數

非常感謝^^!

23
Linux 討論版 / 隨身碟內的執行檔無法執行
« 於: 2008-03-14 16:21 »
請問一下^^!

有一顆隨身碟在平時是用作儲存一些寫好的程式做備份用

前兩天心血來潮下載了Live CD下來玩,當然該Live CD運作正常

就想說把存在隨身碟裡的程式給他跑看看

以Live CD開機後插入隨身碟...正常...檔案也都在

但執行一個執行檔時卻不能執行....想說可能用Live CD不是以root身分所以不行

拔回隨身碟插回原來的RH9想說把該執行檔改成一般使用者然後權限改為rwxrwxrwx應該可以了

現在問題來了.....不給我改.....換成root去改他總行了吧....想不到還他挺倔強的連權限也不給改>"<

原來的檔名為go權限為-rwxr-xr-x所在路徑為/mnt/usb/stlee/tmp

chmod u=rwx,g=rwx,o=rwx go----->此項操作並不被允許
chmod u=rwx go----->OK
chmod g=rwx go----->此項操作並不被允許
chmod o=rwx go----->此項操作並不被允許
要去執行他也說權限問題不給執行....嗯!該檔擁有者與群組都是root我也以root去執行了這樣也不行???

由於平常都是以RH9內所附的一個程式"檔案總管"進行備份動作,該程式在一般使用者執行時需要root密碼
所以存到/mnt/usb下時資料夾與檔案的擁有者與群組都會是root而權限都是-rwxr-xr-x

不過雖然不能執行但存取都很正常,也就是說平常做備份ok,當系統重灌然後將檔案抓回硬碟(改完使用者,群組,權限)後也都可以用

那麼現在的問題出在哪裡呢???

附帶一題:
1.當初插這顆隨身碟到RH9並無做格式化,而插到M$xp也可以存資料
2.一般存檔是以"RH9附的檔案總管"把/home下的stlee目錄整個夾過去

謝謝^^!





24
雜七雜八 / 羅馬尼亞的發文???
« 於: 2007-12-25 20:29 »


來自: Romania
 :o

真的還假的??

25
現在已經很少人會在純文字模式下寫應用程式了吧?_?

所以呢參考參考就好^^!

================================================

這是當初設計前畫的一個主要架構圖
代碼: [選擇]


         ┌-----------------------------(回到主控函數)----┐
         |              主 控 制 函 數                  |
 ┌---------(回到主控函數)---------┐                      |
 |       |                    |                      |
 |       |      (主流程只有一個,橫為主,直為副時主流程做在直式內)   |
 |       |                    └-----┐                 |
 |       |                          |                 |
 |   橫式選單控制函數                直式選單控制函數           |
 |       |                          |                 |
 |       |                          |                 |
 |   橫式選單→按鍵行為設定選項旗標      直式選單→按鍵行為設定選項旗標   |    
 |       |                          |                 |
 |       |                          |                 |
 |   橫式選單->選單顯示              直式選單->選單顯示         |
 |       |                          |                 |
 └-------┘                          └-----------------┘

在直式選單用遞迴來做多層次選單的實現方法所以還有一個遞迴流程示意圖.....哈!箭頭太多畫不出來>"<

2007.11.01修正...抓一些bug及將程式從開發中的.c檔抽離出來


/home/stlee/include/udfmenu.h
代碼: [選擇]


#define GM_ARCFKW     0  /*主選單前置識別關鍵字*/
#define GM_ARCEKW     1  /*主選單結尾識別關鍵字,實際設定時可與副選單前置識別關鍵字相同*/
#define GM_SECFKW     2  /*副選單前置識別關鍵字*/
#define GM_SECEKW     3  /*副選單結尾識別關鍵字,實際設定時可與執行檔前置識別關鍵字相同*/
#define GM_EXEFKW     4  /*執行檔前置識別關鍵字*/
#define GM_EXEEKW     5  /*執行檔結尾識別關鍵字,實際設定時可與執行參數前置識別關鍵字相同*/
#define GM_EXPFKW     6  /*執行參數前置識別關鍵字*/
#define GM_EXPEKW     7  /*執行參數結尾識別關鍵字,實際設定時可與快捷鍵前置識別關鍵字相同*/
#define GM_CACFKW     8  /*快捷鍵前置識別關鍵字*/
#define GM_CACEKW     9  /*快捷鍵結尾識別關鍵字*/
#define GM_ENDRKW    10  /*設定列結束識別關鍵字*/
#define GM_KWSMAX    11  /*供宣告以上相關設定的陣列最大值*/


#define GM_COLORFOOT    0  
#define GM_CLARCOPT     0  /*橫式選單一般選項字串顏色設定*/
#define GM_CLARCPRD     1  /*橫式選單反白選項字串顏色設定*/
#define GM_CLSECOPT     2  /*直式選單一般選項字串顏色設定*/
#define GM_CLSECPRD     3  /*直式選單反白選項字串顏色設定*/
#define GM_CLWINCOL     4  /*直式選單視窗顏色設定(外框),作用中副選單*/
#define GM_CLWINBAD     5  /*直式選單視窗顏色設定(外框),多層次的無作用中副選單*/
#define GM_COLOREND     6  

#define GM_MUSETFOOT    6
#define GM_ARCGAPCOL    6  /*橫式選單各選項間隔行數設定*/
#define GM_ARCPRDSPC    7  /*橫式選單反白選項間的留邊數*/
#define GM_SECMAXROW    8  /*直列式視窗的固定列數設定*/
#define GM_SECTGSROW    9  /*直列式視窗的下越界基準值設定*/
#define GM_SECRTCCOL   10  /*直列式視的第二層以後的副視窗回縮行數設定*/
#define GM_MUSETEND    11

#define GM_CLOCKFOOT   11
#define GM_CLOCKCX     11  /*時鐘顯示位置的X座標*/
#define GM_CLOCKCY     12  /*時鐘顯示位置的Y座標*/
#define GM_CLOCKMOD    13  /*時鐘顯示位置的Y座標*/
#define GM_CLOCKEND    14

#define GM_USRSETMAX   14  /**/


#define GM_CIRCU          1    /*循環*/
#define GM_PAGE           2    /*翻頁*/
#define GM_STOP           4    /*停止*/



/*................................................................................*/
/*..............................      keyact.c      ..............................*/
/*............................已在udfmenu.h中宣告原型.............................*/
/**udf主選單橫式選單按鍵行為的設定*/
void lee_udfmumst_keyact(int keycode,int strn,
                         int *pg_foot,int *pg_end,int *prd_flag);
/*udf主選單直式選單按鍵行為控制*/
void lee_udfmuslv_keyact(int keycode,int strn,int pagecode,
                         int pagewit,int *pg_foot,int *prd_flag);

/*................................................................................*/
/*..............................       mudsp.c      ..............................*/
/*................................................................................*/
/*udf主選單橫式選單的顯示,當不定長度陣列顯示超出範圍時可以不顯示*/
void lee_udfmumst_mudsp(WINDOW *winptr,
                        char **arcmustmpp,int arcmustrn,
                        int pgfoot,int prdflag,
                        int wlcx,int wrcx,int wmcy,int *usrset,
                        int *prdlcx,int *pgend);
/*udf主選單直式選單顯示*/
void lee_udfmuslv_mudsp(WINDOW *winptr,char **opttmpp,int optstrn,
                        int tcx,int tcy,int dcx,int dcy,int *usrset,
                        int pgfoot,int prdflag,
                        int *pg_end);

/*................................................................................*/
/*..............................      udfmenu.c     ..............................*/
/*................................................................................*/
/*udf主選單主流程控制*/
int lee_udfmenu(WINDOW *win_master,char *musphf,char *setphf);
/*udf主選單橫式選單流程控制*/
int lee_udfmumst(WINDOW *win_master,int keydec,
                 int lefcx,int rincx,int mmucy,int *usrset,
                 char **arcmustmpp,int arcmustrn,
                 int *pg_foot,int *pg_end,int *prd_flag,int *prdlcx);
/*多層次直式選單的視窗範圍控制與隨情況調整翻頁方式設定*/
char *lee_udfmuslv_brdwxy(char *sectmp,int secsize,char *fkws,char *ekws,
                int aclcx,int actcy,int *usrset,
                int *sectcx,int *sectcy,int *secdcx,int *secdcy,
                int *wdcx,int *wdcy,int *pagewit,int *pagecode,
                int *optsize,int *optstrn,int *optmlen);
/*udf主選單公用函數:取得設定檔內的設定*/
int *lee_udfmu_getmuset(char *musftmp,int musfsize,char *setftmp,int setfsize);
/*udf主選單公用函數:取得定義檔內的自定義標籤*/
char *lee_udfmu_getdkts(char *setftmp,int setfsize,int *dkkwssize);
/*udf主選單公用函數:取得*setftmp內與mem內所有快捷鍵識別字語鍵值資料列*/
char *lee_udfmu_getcackws(char **dkkwsp,char *mem,int memsize,char *setftmp,int setfsize,
                      int *cacsize,int *cacstrn,int *cacmlen);
/*udf主選單公用函數:對齊目前按鍵與快捷鍵設定*/
int lee_udfmu_cackws2dn(int keycode,char **cacsp,int cacstrn,char **tmpp,int tmpstrn,
                       int *pgfoot,int pgend,int *acdn);
/*udf主選單公用函數:副程式的執行,同時擁有副選單與副程式標籤會優先處理副選單*/
int lee_udfmu_callexe(char **dkkwsp,char *str);




/home/stlee/leelib/menu/udfmenu.c
代碼: [選擇]


#include "/home/stlee/include/state.h"


/*

*udf主選單主流程控制
int lee_udfmenu(WINDOW *win_master,char *musphf,char *setphf)

*udf主選單橫式選單流程控制
int lee_udfmumst(WINDOW *win_master,int keydec,
                 int lefcx,int rincx,int mmucy,int *usrset,
                 char **arcmustmpp,int arcmustrn,
                 int *pg_foot,int *pg_end,int *prd_flag,int *prdlcx)

*多層次直式選單的視窗範圍控制與隨情況調整翻頁方式設定
char *lee_udfmuslv_brdwxy(char *sectmp,int secsize,char *fkws,char *ekws,
                int aclcx,int actcy,int *usrset,
                int *sectcx,int *sectcy,int *secdcx,int *secdcy,
                int *wdcx,int *wdcy,int *pagewit,int *pagecode,
                int *optsize,int *optstrn,int *optmlen)

*取得設定檔內的設定
int *lee_udfmu_getmuset(char *musftmp,int musfsize,char *setftmp,int setfsize)

*取得定義檔內的自定義標籤
char *lee_udfmu_getdkts(char *setftmp,int setfsize,int *dkkwssize)

*取得*setftmp內與mem內所有快捷鍵識別字語鍵值資料列
char *lee_udfmu_getcackws(char **dkkwsp,char *mem,int memsize,char *setftmp,int setfsize,
                      int *cacsize,int *cacstrn,int *cacmlen)

*對齊目前按鍵與快捷鍵設定
int lee_udfmu_cackws2dn(int keycode,char **cacsp,int cacstrn,char **tmpp,int tmpstrn,
                       int *pgfoot,int pgend,int *acdn)

*副程式的執行,同時擁有副選單與副程式標籤會優先處理副選單
int lee_udfmu_callexe(char **dkkwsp,char *str)

*/



/*udf主選單主流程控制
WINDOW *win_master 選單顯示的視窗,目前只支援全營幕stdscr模式
         如要在營幕某視窗執行還需要四個座標參數搭配*win_master
char *setfna 定義檔檔名(顏色,按鍵,自定義捷取關鍵字的設定)
char *musphf 設定檔檔名(選單行為參數與選項字串的設定檔)
*/

int lee_udfmenu(WINDOW *win_master,char *musphf,char *setphf)
{
  /*一些生命週期不超過一頁的變數*/
  int x,y,i,n,k,sz,sn,len,keycode;
  char *tmp,**tmpp;
  int scrx,scry;

  /*定義檔相關宣告*/
  char *setftmp;
  int setfsize;
  /*主,副選項設定檔的相關宣告*/
  char *musftmp;
  int musfsize;

  /*顏色定義,是一個定義在設定檔內的陣列*/
  int *usrset;

  /*標籤關鍵字,同時也是設定檔預定搜尋的自設關鍵字識別字*/
  char *dkkwstmp,**dkkwsp;
  int dkkwssize;/*標籤無strn其值固定為GM_KWSMAX定義在udfmu.h*/
 
  /*從映射區擷取出有關橫式選單的所有資料*/
  char *arctmp,**arctmpp;
  int arctmpsize,arctmpstrn;
  /*橫式選單顯示用的字串陣列相關宣告(從arctmp擷取出)*/
  char *arcmustmp,**arcmustmpp;
  int arcmusize,arcmustrn,arcmumlen;
  int arcpgfoot,arcpgend,arcacdn,arcaccx,arclcx,arcrcx,arccy;
  /*橫式選單的快捷鍵相關宣告*/
  char *arccactmp;
  char **arccactmpp;
  int arccacsize,arccacstrn;
  /*在設定檔內自行定義的字串,也就是橫式選單各選項下的副選單識別字*/
  char *arc_sdafkw;

  /*從映射區擷取出所有非橫式選單的資料*/
  char *sectmp;  
  int secsize,secstrn;
  int secpgfoot,secacdn;  
  int seclayer;/*副選單的遞迴控制參數*/





  /*關鍵字與按鍵定義設定檔映射到settmp並消除註解部份*/
  setftmp=lee_fout2tmp(setphf,&setfsize,"//","\n");
  /*將musphf檔映射到musftmp*/
  musftmp=lee_fout2tmp(musphf,&musfsize,"//","\n");
/*mvwprintw(win_master,1,0,"setfsize=%d musfsize=%d ",setfsize,musfsize);
wrefresh(win_master);
/*除錯用*/


  /*自定義標簽取出,如檔案內無定義由lee_udfmu_getdkts()內定的字串陣列為標籤*/
  dkkwstmp=lee_udfmu_getdkts(setftmp,setfsize,&dkkwssize);
  dkkwsp=lee_mem2sp(dkkwstmp,dkkwssize);/*將*dkkwstmp定址*/
/*for(i=0,y=10;i<GM_KWSMAX;i++,y++)
  mvwprintw(win_master,y,30,"*(dkkwsp+%02d)=%s",i,*(dkkwsp+i));
wrefresh(win_master);
/*除錯用*/


  /*取出檔案內的顏色設定(分析*musftmp及*setftmp後篩選字串後得出一個整數陣列)*/  
  usrset=lee_udfmu_getmuset(musftmp,musfsize,setftmp,setfsize);
/*for(i=0,y=20;i<GM_USRSETMAX;i++,y++)
    mvwprintw(win_master,y,0,"*(usrset+%02d)=%d ",i,*(usrset+i));
wrefresh(win_master);
getchar();
/*除錯用*/


  /*將主選單部份從gpltmp分離出來且arcfkw到endrkw間的'\n'會被忽略*/
  arctmp=lee_rtvmkwsift(musftmp,musfsize,*(dkkwsp+GM_ARCFKW),*(dkkwsp+GM_ENDRKW),SIFTCOR,
                        &arctmpsize,&arctmpstrn);
  arctmpp=lee_mem2sp(arctmp,arctmpsize);/*將*arctmp定址*/
  /*擷取橫式選單的選項字串*/  
  arcmustmp=lee_rtvmkw2sa(arctmp,arctmpsize,*(dkkwsp+GM_ARCFKW),*(dkkwsp+GM_ARCEKW),YES,RETRB,
                    &arcmusize,&arcmustrn,&arcmumlen);
  arcmustmpp=lee_mem2sp(arcmustmp,arcmusize);/*將*arcmus定址*/
  /*擷取橫式選單的快捷鍵*/
  arccactmp=lee_udfmu_getcackws(dkkwsp,arctmp,arctmpsize,setftmp,setfsize,
                      &arccacsize,&arccacstrn,&len);
  arccactmpp=lee_mem2sp(arccactmp,arccacsize);/*將*arccactmp定址*/
  /*將非主選單部份從gpltmp分離出來*/
  sectmp=lee_rtvmkwsift(musftmp,musfsize,*(dkkwsp+GM_ARCFKW),*(dkkwsp+GM_ENDRKW),SIFTOTH,
                        &secsize,&secstrn);
/*for(i=0,y=15;i<arctmpstrn;i++,y++)
  mvwprintw(win_master,y,0,"arctmp[%02d]=%s ",i,*(arctmpp+i));
/**/
/*for(i=0,y=15;i<arcmustrn;i++,y++)
  mvwprintw(win_master,y,0,"arcmustmp[%02d]=%s ",i,*(arcmustmpp+i));
/**/
/*for(i=0,y=1;i<arccacstrn;i++,y++)
  mvwprintw(win_master,y,0,"arccactmpp[%02d]=%s ",i,*(arccactmpp+i));
/**/
/*tmpp=lee_mem2sp(sectmp,secsize);
for(i=0,y=1;i<secstrn;i++,y++)
  mvwprintw(win_master,y,0,"secsp[%02d]=%s ",i,*(tmpp+i));
/**/
/*wrefresh(win_master);
/*除錯用*/


  lee_getscrxy(&scrx,&scry);/*取得終端機營幕範圍最大值*/
  arclcx=0;
  arcrcx=scrx;
  arccy=0;

  arcpgfoot=0;
  arcpgend=0;
  arcacdn=0;
  arcaccx=0;  

  secpgfoot=0;  
  secacdn=0;
  seclayer=0;/*遞迴控制參數一定從第0次開始*/


  /*將主選單顯示出來,並初始設定第一個副選單的起始x座標*/
  lee_udfmumst_mudsp(win_master,
                     arcmustmpp,arcmustrn,
                     0,0,
                     arclcx,arcrcx,arccy,&*usrset,
                     &arcaccx,&arcpgend);
  do
  {
    /*找出反白主選項是否有副選單關鍵字,有則擷取該關鍵字到arc_sdafkw*/
    arc_sdafkw=lee_rtvstr2s(*(arctmpp+arcacdn),
                           *(dkkwsp+GM_SECFKW),*(dkkwsp+GM_SECEKW),RETRB);

    /*控制權交給直式選單,所以lee_udfmuslv()必須在lee_udfmumst()前面*/
    keycode=lee_udfmuslv(win_master,NOKEYIN,
                         arcaccx,arccy+1,&*usrset,            
                         arc_sdafkw,dkkwsp,
                         sectmp,secsize,
                         setftmp,setfsize,
                         arccactmpp,arccacstrn,arctmpp,arctmpstrn,
                         &secpgfoot,&secacdn,&seclayer);
     /*從lee_udfmuslv()出來後下一次進入都是從第0頁第0項開始,如果要保留每次反白所在
     可以宣告一個secacdn[]陣列保留每個副選單的上次的反白所在*/
     secpgfoot=0;
     secacdn=0;
     free(arc_sdafkw);

    /*橫式選單*/
    lee_udfmumst(win_master,keycode,
                 arclcx,arcrcx,arccy,&*usrset,  
                 arcmustmpp,arcmustrn,
                 &arcpgfoot,&arcpgend,&arcacdn,&arcaccx);

    switch(keycode)
    {
      case NOKEYIN:    
 
      break;
      case KDEC_ESC:

        free(setftmp);
        free(musftmp);
        free(usrset);
        free(dkkwstmp);
        free(dkkwsp);
        free(arctmp);
        free(arctmpp);
        free(arcmustmp);
        free(arcmustmpp);
        free(arccactmp);
        free(arccactmpp);
        /*free(arc_sdafkw);arc_sdafkw在lee_udfmuslv()出來後有釋放過了所以這裡不要釋放*/
        free(sectmp);  

        return(keycode);
      break;
      case KDEC_ENTER:
        /*選項命令:副程式標籤所指執行檔的執行;由於lee_udfmu_callexe()會先找副選單標籤
        所以同時擁有副選單與副程式標籤時副程式並不會被執行*/
        if(lee_udfmu_callexe(dkkwsp,*(arctmpp+arcacdn))==-1)
          break;

      break;
      default:

        /*搜尋快捷鍵是否被定義*/
        k=lee_udfmu_cackws2dn(keycode,arccactmpp,arccacstrn,arctmpp,arctmpstrn,
                              &arcpgfoot,arcpgend,&arcacdn);
        if(k==-1)
          break;
        /*將主選單重新顯示出來*/
        lee_udfmumst_mudsp(win_master,
                           arcmustmpp,arcmustrn,
                           arcpgfoot,arcacdn,
                           arclcx,arcrcx,arccy,&*usrset,
                           &arcaccx,&arcpgend);
      break;
    }

/*mvprintw(25,1,"arctmpsize=%d arctmpstrn=%d arcmusize=%d arcmustrn=%d arcmumlen=%d ",
             arctmpsize,arctmpstrn,arcmusize,arcmustrn,arcmumlen);
mvprintw(26,1,"arcpgfoot=%d arcpgend=%d arcacdn=%d arcaccx=%d arclcx=%d arcrcx=%d arccy=%d ",
             arcpgfoot,arcpgend,arcacdn,arcaccx,arclcx,arcrcx,arccy);
mvprintw(27,1,"arccacsize=%d arccacstrn=%d ",
             arccacsize,arccacstrn);
refresh();
/**/





  }while(1);
}







/*udf主選單橫式選單流程控制

WINDOW *win_master 由主流程的呼叫者持有的視窗
int keydec         主流程傳來的按鍵值

int lefcx
int rincx
int mmucy
int *usrset

char **arcmustmpp
int arcmustrn

int *pg_foot
int *pg_end
int *prd_flag
int *prdlcx
*/
int lee_udfmumst(WINDOW *win_master,int keydec,
                 int lefcx,int rincx,int mmucy,int *usrset,
                 char **arcmustmpp,int arcmustrn,
                 int *pg_foot,int *pg_end,int *prd_flag,int *prdlcx
                )

{
  int keycode;
 
  if(keydec==-1)/*當keydec永遠都傳來-1表示本函數是主要的迴路控制模式則須初始顯示*/
    lee_udfmumst_mudsp(win_master,
                       arcmustmpp,arcmustrn,              
                       *pg_foot,*prd_flag,
                       lefcx,rincx,mmucy,&*usrset,
                       &*prdlcx,&*pg_end);

  do
  {    
    if(keydec==-1)/*當keydec永遠都傳來-1表示本函數是主要的迴路控制模式*/
      keycode=lee_getkb(0);
    else
      keycode=keydec;
   
    switch(keycode)
    {
      case NOKEYIN:
        /*本函數因為是主要選單模式所以在此攔截住鍵盤控制權(無按鍵時不返回)*/      
      break;    

      case KDEC_LEFT:
      case KDEC_RIGHT:
      case KDEC_HOME:
      case KDEC_END:

        lee_udfmumst_keyact(keycode,arcmustrn,&*pg_foot,&*pg_end,&*prd_flag);    
   
        lee_udfmumst_mudsp(win_master,
                           arcmustmpp,arcmustrn,              
                           *pg_foot,*prd_flag,
                           lefcx,rincx,mmucy,&*usrset,
                           &*prdlcx,&*pg_end);    
     
      default:

      return(keycode);
    }

  }while(1);
}




/*udf主選單直式選單流程控制
 
WINDOW *win_master 由主流程的呼叫者持有的視窗
int keydec         主流程傳來的按鍵值

int aclcx          選單在win_master的左上x座標
int actcy          選單在win_master的左上y座標
int *usrset        udf選單行為設定的參數陣列

char *prd_sdafkw   作用中選項(可以是橫式或直式)的下一層副選單識別關鍵字
char **dkkwsp      自定義擷取識別關鍵字
char *sectmp       非橫式選單的arctmp的所有資料集合
int secsize        sectmp的長度
char *setftmp      定義檔的映射區資料
int setfsize       setftmp的長度
char **arccactmpp  橫式選單的快捷鍵定址指標陣列
int arccacstrn     arccactmpp的資料元素數量
char **arctmpp     橫式選單的的所有資料集合定址指標陣列
int arctmpstrn     arctmpp的資料元素數量

int *pg_foot       由主流程持有的直式選單本頁顯示選項起點旗標
int *prd_flag      由主流程持有的直式選單反白顯示選項起點旗標
int *win_layer     由主流程持有的直式選單遞迴控制參數


修正第二層以後有副選單的選項會往下偏移1的說明    
在多層次選單如下:
    <主選單>主選單二<選項>[AAA]<副選單></>
      [AAA]aaa-1<選項></>
      [AAA]aaa-2 -><選項>[BBB]<副選單>xxx</>
        [BBB]bbb-1<選項></>
        [BBB]bbb-2<選項></>
        [BBB]bbb-3<選項>[CCC]<副選單></>
          [CCC]ccc-1<選項></>
          [CCC]ccc-2<選項></>
          [CCC]ccc-3<選項></>
        [BBB]bbb-4<選項></>
        [BBB]bbb-5<選項></>
        [BBB]bbb-6<選項></>
      [AAA]AAA-3<選項></>
      [AAA]AAA-4<選項></>

 由於prd_sdafkw會隨每往下一層而改變所以當到第2層的[BBB]時傳給lee_rtvmkw2dt()的endkw是"</>"
 會發生第2層以後sectab都會往下偏一個選項才能正確的進入[BBB]層以後的副選單[CCC]
 因為以inr_sdafkw為起始關鍵字時在B層nvsectmpp要擷取出所有含[CCC]與</>此時擷取到的
 第0號字串是"[CCC]<副選單>xxx</>"而正確應該是"[CCC]ccc-1<選項></>",所以必須給予修正
*/
int lee_udfmuslv(WINDOW *win_master,int keydec,
                 int aclcx,int actcy,int *usrset,
                 char *prd_sdafkw,char **dkkwsp,      
                 char *sectmp,int secsize,
                 char *setftmp,int setfsize,
                 char **arccactmpp,int arccacstrn,char **arctmpp,int arctmpstrn,      
                 int *pg_foot,int *prd_flag,int *win_layer  
                )

{
  /*一些控制用的宣告*/
  int keycode,pagewit,pageend,pagecode;
  int isarccackey,isoptcackey;
  int i,n,k,x,y,mstcac;

  /*與視窗顯示相關的宣告*/
  WINDOW *winptr,*dstwin;
  int sectcx,sectcy,secdcx,secdcy;
  int wtcx,wtcy,wdcx,wdcy;  
  int scrx,scry;

  /*供進入遞迴後傳給下層選單對應本函數的控制參數*/
  int inr_pgfoot,inr_prdflag,inr_aclcx,inr_actcy,inr_keycode;
  char *inr_sdafkw;

  /*在*sectmp內所有含*prd_sdafkw字串的資料列*/
  char *nvsectmp,**nvsectmpp;
  int nvsecsize,nvsecstrn,nvseclen;
  /*顯示用的選項字串*/
  char *opttmp,**opttmpp;
  int optsize,optstrn,optmlen;
  /*本作用中直式選單的快捷鍵*/
  char *optcactmp,**optcactmpp;
  int optcacsize,optcacstrn,optcacmlen;





  /*遞迴快速出口(已進入遞迴且參數*prd_sdafkw是一個空字串)*/
  if(*win_layer>0 && strlen(prd_sdafkw)<1)
    return(keydec);

  /*取出與*prd_sdafkw相關的每一列資料(結尾關鍵字是*(dkkwsp+GM_ENDRKW)不是'\n'
    且擷取模式為RETRHBR)*/
  nvsectmp=lee_rtvmkw2sa(sectmp,secsize,prd_sdafkw,*(dkkwsp+GM_ENDRKW),YES,RETRHBR,
                &nvsecsize,&nvsecstrn,&nvseclen);
  nvsectmpp=lee_mem2sp(nvsectmp,nvsecsize);/*將*nsectmp定址*/
  /*修正第2層遞迴以後有副選單的選項會偏到下一個選項(上面有說明)*/
  if(*win_layer>0)
  {
    /*搜尋被修正前的**nvtmpp第0個字串內是否有快捷鍵,供快捷鍵修正的參考*/  
    mstcac=lee_memchunt(*(nvsectmpp+0),*(dkkwsp+GM_CACFKW),0,strlen(*(nvsectmpp+0)),FROM);
    /*開始修正*/
    for(i=0,n=1;n<nvsecstrn;i++,n++)    
      *(nvsectmpp+i)=*(nvsectmpp+n);    
    nvsecstrn-=1;
  }
  /*依旗標值表格sectab在這裡先取得第0項的下一層副選單的prd_sdafkw關鍵字*/
  inr_sdafkw=lee_rtvstr2s(*(nvsectmpp+0),*(dkkwsp+GM_SECFKW),*(dkkwsp+GM_SECEKW),RETRB);

/*mvprintw(28,30,"prd_sdafkw=%s nvsecsize=%d nvsecstrn=%d mstcac=%d ",
         prd_sdafkw,nvsecsize,nvsecstrn,mstcac);
for(i=0,y=15;i<nvsecstrn;i++,y++)
{
  if(y>=25)
    break;
  mvprintw(y,40,"nsecstmp[%02d]=%s ",i,*(nvsectmpp+i));
}
refresh();
/*除錯用*/

  /*一些初值設定,當無副選單時不會進入下面的if(nvsecstrn>0)內但在流程中有可能會用到其中
  的某些變數作為參數,例如optstrn,optcacstrn如果沒設初值則將會造成一些函數存取的溢位*/
  optsize=0;
  optstrn=0;
  optmlen=0;
  optcacsize=0;
  optcacstrn=0;
  optcacmlen=0;
  /*因為參數scrxx系列已是營幕的絕對座標所以wtcx與wtcy從0,0開始(視窗的左上角)否則當scrdy要
  傳固定值(外框底部固定)或浮動值(隨字串數量浮動)的情況時wdcx,wdcy與pagewit會無法定位*/
  wtcx=0;
  wtcy=0;  
  /*翻頁模式一律為CIRCU(循環),但在lee_setvmu()內有可能因選項數量超出營幕範圍而被改成PAGE(翻頁)*/
  pagecode=CIRCU;
  pageend=0;
  /*取得終端機營幕範圍最大值*/
  lee_getscrxy(&scrx,&scry);

  if(nvsecstrn>0)
  {
    /*將反白選單的"選項字串"篩選出來,並設定視窗的各座標參數*/
    opttmp=lee_udfmuslv_brdwxy(nvsectmp,nvsecsize,prd_sdafkw,*(dkkwsp+GM_ARCEKW),
                               aclcx,actcy,&*usrset,
                               &sectcx,&sectcy,&secdcx,&secdcy,
                               &wdcx,&wdcy,&pagewit,&pagecode,
                               &optsize,&optstrn,&optmlen);
    opttmpp=lee_mem2sp(opttmp,optsize);/*將*opttmp定址*/

    /*取得目前作用中副選單各選項的快捷鍵描述與鍵值*/
    optcactmp=lee_udfmu_getcackws(dkkwsp,nvsectmp,nvsecsize,setftmp,setfsize,
                                  &optcacsize,&optcacstrn,&optcacmlen);
    optcactmpp=lee_mem2sp(optcactmp,optcacsize);
    /*修正第2層遞迴以後有副選單的選項會偏到下一個選項(上面有說明)
    但快捷鍵的修正必須在*nvsectmpp修正前的第0個字串內是否快捷鍵辨識值mstcac不是-1的值
    (從上層下來的選項內擁有快捷鍵)這樣才不會讓本層的第1個快捷鍵在上層選項無快捷鍵的情
    形下被修正掉*/
    if(*win_layer>0 && mstcac!=-1)
    {
      for(i=0,n=1;n<optcacstrn;i++,n++)
        *(optcactmpp+i)=*(optcactmpp+n);    
      optcacstrn-=1;
    }

    /*將要顯示的區塊先複製起來*/
    dstwin=newwin(wdcy,wdcx,sectcy,sectcx);
    copywin(curscr,dstwin,sectcy,sectcx,0,0,wdcy-1,wdcx-1,FALSE);  
    /*宣告要顯示的視窗winptr後顯示出來*/
    winptr=newwin(wdcy,wdcx,sectcy,sectcx);
    lee_wmuboxl(winptr,wtcx,wtcy,wdcx,wdcy,*(usrset+GM_CLWINCOL),NOT);/*畫出副選單外框及區塊*/    
    /*顯示出直式選單*/
    lee_udfmuslv_mudsp(winptr,opttmpp,optstrn,
                       wtcx+1,wtcy+1,wdcx-1,wdcy-1,&*usrset,
                       *pg_foot,*prd_flag,
                       &pageend);

  }

/*mvprintw(1,35,"*win_layer=%d secsize=%d maxrow=%d aclcx=%d actcy=%d *",
             *win_layer,secsize,maxrow,aclcx,actcy);
mvprintw(2,35,"prd_sdafkw=%s(len=%d) inr_sdafkw=%s(len=%d)",
             prd_sdafkw,strlen(prd_sdafkw),inr_sdafkw,strlen(inr_sdafkw));
mvprintw(3,35,"optstrn=%d vmumlen=%d vmutdn=%d sectdn=%d ",
             optstrn,vmumlen,vmutdn,sectdn);
mvprintw(4,35,"sectcx=%d sectcy=%d secdcx=%d secdcy=%d (scrx=%d scry=%d) ",
             sectcx,sectcy,secdcx,secdcy,scrx,scry);
mvprintw(5,35,"wtcx=%d wtcy=%d wdcx=%d wdcy=%d pagewit=%d ",
             wtcx,wtcy,wdcx,wdcy,pagewit);
refresh();
/**/



  do
  {
    if(keydec==NOKEYIN)/*當keydec永遠都傳來-1表示本函數是主要的迴路控制模式*/
      keycode=lee_getkb(0);    
    else
      keycode=keydec;
    switch(keycode)
    {
      case NOKEYIN:
        /*當keydec永遠都傳入NOKEYIN則本函數在此攔截住鍵盤控制權(無按鍵時不返回)
        而非本函數的控制鍵則傳回按鍵值由主流程控制函數分配流程*/      

      break;
      case KDEC_UP:
      case KDEC_DOWN:
      case KDEC_PGUP:
      case KDEC_PGDOWN:      

        if(nvsecstrn<1)/*無直式選單選項*/
          break;

        free(inr_sdafkw);/*釋放上一次(上次反白項目)的下層副選單prd_sdafkw關鍵字*/
        /*直列式選單的行為控制*/
        lee_udfmuslv_keyact(keycode,optstrn,pagecode,pagewit,&*pg_foot,&*prd_flag);        
        /*直列式選單整頁顯示*/
        lee_udfmuslv_mudsp(winptr,opttmpp,optstrn,
                           wtcx+1,wtcy+1,wdcx-1,wdcy-1,&*usrset,
                           *pg_foot,*prd_flag,
                           &pageend);
        /*依旗標值表格sectab取得本次反白選項的下一層副選單的prd_sdafkw關鍵字*/
        inr_sdafkw=lee_rtvstr2s(*(nvsectmpp + *prd_flag),
                                *(dkkwsp+GM_SECFKW),*(dkkwsp+GM_SECEKW),RETRB);

      break;  
      case KDEC_ENTER:/*Enter是遞迴的絕對入口以及選項命令執行入口*/

        /*選項命令:副程式標籤所指執行檔的執行;由於lee_udfmu_callexe()會先找副選單標籤
        所以同時擁有副選單與副程式標籤時副程式並不會被執行
        選項命令執行必須本次叫用有"選項"可執行(nvsecstrn不為0)否則須往下執行返回
        呼叫者並傳回按鍵值的動作(執行主選單選項的副程式)*/
        if(nvsecstrn>0 && lee_udfmu_callexe(dkkwsp,*(nvsectmpp + *prd_flag))==1)
          break;        

      case KDEC_RIGHT:/*右鍵是有條件的遞回入口*/
        /*反白選項下有副選單*/
        if(strlen(inr_sdafkw)>0 && nvsecstrn>0 )
        {
          /*以遞迴叫出的副選單從第0頁的第0項顯示,反白旗標也是從第0項開始*/
          inr_pgfoot=0;
          inr_prdflag=0;

/*要控制進入遞迴後的副選單在右邊界超出時其它方式的顯示行為由此控制試試2007.10.11*/
          inr_aclcx=secdcx - *(usrset+GM_SECRTCCOL);
          if(*(usrset+GM_SECMAXROW)<=0)/*不固定列數時以反白選項所在列為下一層選單起始列的參考*/
            inr_actcy=*prd_flag+actcy+1;
          else/*固定列數時以視窗上框所在列為下一層選單起始列的參考*/
            inr_actcy=actcy+1;

          /*遞迴控制參數+1*/
          *win_layer+=1;
          /*目前副選單外框變色*/
          lee_wmuboxl(winptr,wtcx,wtcy,wdcx,wdcy,*(usrset+GM_CLWINBAD),YES);/*目前副選單外框變色*/
          /*呼叫自己進入遞迴*/
          keycode=lee_udfmuslv(win_master,keydec,
                               inr_aclcx,inr_actcy,&*usrset,
                               inr_sdafkw,dkkwsp,
                               sectmp,secsize,
                               setftmp,setfsize,
                               arccactmpp,arccacstrn,arctmpp,arctmpstrn,
                               &inr_pgfoot,&inr_prdflag,&*win_layer);
          /*遞迴退出將目前副選單外框顏色還原*/
          lee_wmuboxl(winptr,wtcx,wtcy,wdcx,wdcy,*(usrset+GM_CLWINCOL),YES);
                   
          /*遞迴返回時的先期處理*/        
          if(keycode==KDEC_LEFT || keycode==KDEC_ESC)/*內定只退回一層的按鍵*/        
            break;
          else
          {
          ;
          }  
        }      
       
      default:/*不是直列式選單的控制鍵*/
        /*快捷鍵的處理:非橫式選單程式或本函數內定的按鍵都有可能是被定義的快捷鍵
        如果橫式選單或主流程有定義其它的按鍵必須加入這裡排除,否則會在這裡被攔截而失效*/
        if(keycode!=KDEC_ENTER && keycode!=KDEC_RIGHT &&
           keycode!=KDEC_HOME && keycode!=KDEC_END)
        {        
          /*先看該鍵是不是橫式選單所定義的
          由於這裡會做先查看橫式選單的快捷鍵動作所以各層副選單內的快捷鍵如和橫式選單重覆
          將以橫式選單優先處理
          但在直式選單內各層的快捷鍵是各自獨立的所以可重覆定義(同層以選項順序決定->先找到的)*/
          isarccackey=lee_udfmu_cackws2dn(keycode,arccactmpp,arccacstrn,arctmpp,arctmpstrn,
                            &i,arccacstrn,&k);
          if(optcacstrn>0 && isarccackey==-1)/*不是橫式選單定義的按鍵*/
          {
            /*再找是不是本作用中副選單定義的*/
            isoptcackey=lee_udfmu_cackws2dn(keycode,optcactmpp,optcacstrn,nvsectmpp,nvsecstrn,
                          &*pg_foot,pageend,&*prd_flag);
            if(isoptcackey==-1)/*不是本作用中副選單定義的*/
              break;
            /*直列式選單整頁顯示*/
            lee_udfmuslv_mudsp(winptr,opttmpp,optstrn,
                               wtcx+1,wtcy+1,wdcx-1,wdcy-1,&*usrset,
                               *pg_foot,*prd_flag,
                               &pageend);
            break;      
          }
        }

      case KDEC_LEFT:/*左鍵不管在哪一層都是該層的出口*/
        /*函數(遞迴)的唯一出口*/
        if(*win_layer<1)        
          touchwin(win_master);        
        else
        {
          *win_layer-=1;
          wrefresh(dstwin);          
        }

        /*釋放本函數所有的資源*/
        free(nvsectmp);
        free(nvsectmpp);
        free(inr_sdafkw);
        if(nvsecstrn>0)  
        {
          delwin(winptr);
          delwin(dstwin);
         
          free(opttmp);
          free(opttmpp);          
          free(optcactmp);
          free(optcactmpp);
        }          
      return(keycode);
    }
    /*時鐘*/
/*    lee_wclock(win_master,70,scry-1);*/


/*mvprintw(30,1,"keycode=%d pagewit=%d *pg_foot=%d pageend=%d *prd_flag=%d inr_sdafkw=%s(%d)*",
             keycode,pagewit,*pg_foot,pageend,*prd_flag,inr_sdafkw,strlen(inr_sdafkw));
refresh();
/**/

  }while(1);
}


/*===============================================================================================*/
/*===============================================================================================*/
/*===============================================================================================*/
/*===============================================================================================*/
/*===============================================================================================*/
/*===============================================================================================*/


/*多層次直式選單的視窗範圍控制與隨情況調整翻頁方式設定
*/
char *lee_udfmuslv_brdwxy(char *sectmp,int secsize,char *fkws,char *ekws,
                int aclcx,int actcy,int *usrset,
                int *sectcx,int *sectcy,int *secdcx,int *secdcy,
                int *wdcx,int *wdcy,int *pagewit,int *pagecode,
                int *optsize,int *optstrn,int *optmlen
               )
{
  int scrx,scry;
  char *opttmp;

  if(strlen(fkws)<1)
  {
    *optsize=0;
    *optstrn=0;
    *pagewit=0;
    opttmp=(char *)malloc(1);
    return(&*opttmp);  
  }

  lee_getscrxy(&scrx,&scry);/*取得終端機營幕範圍最大值*/
  opttmp=lee_rtvmkw2sa(sectmp,secsize,fkws,ekws,NOT,RETRB,
                       &*optsize,&*optstrn,&*optmlen);

  if(optstrn>0)
  {
    /*這裡所使用的座標是"視窗要在營幕的那裡顯示的絕對座標,不是該視窗的相對座標(視窗都從0,0開始)"
    這樣在lee_udfmuslv()會自行計算並顯示該視窗然後在非控制鍵時自動回收視窗資源*/
    *sectcx=aclcx;
    *sectcy=actcy;
   
    *secdcx=aclcx + *optmlen + 2;
    if(*secdcx>=scrx)/*錯誤修正:*secdcx已超出營幕範圍*/
    {
      *secdcx=scrx-1;/*留邊一行*/
      *sectcx=scrx - *optmlen - (2+1);/*減外框兩行及留邊一行*/
    }

    if(*(usrset+GM_SECMAXROW)<=0)/*不固定列數:maxrow傳入0以下的值表示視窗範圍依字串數量各別增減*/
      *secdcy=actcy + *optstrn + 2;/*依選項數量決定副選單列數,如要固定則可令secdcy固定在0以上*/
    else      
      *secdcy=actcy + *(usrset+GM_SECMAXROW) + 2;/*副選單每頁固定列數加上下框2列*/    
   
    if(*secdcy>=scry)/*錯誤修正:*secdcy已超出營幕範圍*/
      *secdcy=scry-1;/*留邊一列*/

    /*錯誤修正:字串數量有5個以上但可顯示列數不足5列--->視窗往上開*/
    *pagewit=(*secdcy - *sectcy) - 2;

    if((scry-1-*sectcy) < (*(usrset+GM_SECTGSROW)+2))
    {      
      *secdcy=actcy+1;
      *sectcy=(actcy+1)-*optstrn-2;
      if(*sectcy<=0)/*已超出營幕範圍*/
        *sectcy=1;/*留邊一列*/    
    }

    *wdcx=*secdcx - *sectcx;
    *wdcy=*secdcy - *sectcy;

    /*一頁資料量,只給lee_udfmuslv_keyact()翻頁參考,可大於optstrn(視窗外框固定大小:maxrow非0值)*/  
    *pagewit=(*secdcy - *sectcy) - 2;
    if(*pagewit < *optstrn)    
      *pagecode=PAGE;
   
  }
  else
    *pagewit=0;

/*mvprintw(27,0,"*(usrset+GM_SECMAXROW)=%d *(usrset+GM_SECTGSROW)=%d aclcx=%d actcy=%d ",
         *(usrset+GM_SECMAXROW),*(usrset+GM_SECTGSROW),aclcx,actcy);
mvprintw(28,0,"*sectcx=%d *sectcy=%d *secdcx=%d *secdcy=%d ",*sectcx,*sectcy,*secdcx,*secdcy);
mvprintw(29,0,"*wdcx=%d *wdcy=%d *pagewit=%d *stgecode=%d ",*wdcx,*wdcy,*pagewit,*stgecode);
mvprintw(30,0,"*optsize=%d *optstrn=%d *optmlen=%d ",*optsize,*optstrn,*optmlen);
refresh();
/*除錯用*/
  return(&*opttmp);

}

/*取得設定檔內的設定
*/
int *lee_udfmu_getmuset(char *musftmp,int musfsize,char *setftmp,int setfsize)
{
 
  int i,y,sz;
  char *buf,*tmp,**tmpp;
  int *usrset;
  char *clkws,**clkwsp;
  char **dclkwsp;
  char dclkws[GM_USRSETMAX][21]={
         "CLARCOPT","CLARCPRD",
         "CLSECOPT","CLSECPRD",
         "CLWINCOL","CLWINBAD",
         "ARCGAPCOL","ARCPRDSPC",
         "SECMAXROW","SECTGSROW","SECRTCCOL",
         "CLOCKCX","CLOCKCY","CLOCKMOD"
       };
  /*檔內無設定參數時的內定值*/
  char ddclkws[GM_USRSETMAX][11]={
         "(B7F0)","(B2F0)",
         "(B7F0)","(B1F0)",
         "(W2B4)","(W6B4)",
         "2","1",
         "-1","5","1"
         "-1","-1","-1"
       };
 


  usrset=(int *)malloc(sizeof(int) * GM_USRSETMAX);
 
  /*取得musftmp內所有含dclkws[][]相同字串的資料列給tmp當檔案內沒設定時
  以dclkws[][]的內定字串做為描述詞*/
  dclkwsp=lee_mem2sp((char *)dclkws,sizeof(dclkws));
  tmp=lee_rtvfset2sa(musftmp,musfsize,dclkwsp,GM_USRSETMAX,"=","\n","//",&sz);
  tmpp=lee_mem2sp(tmp,sz);  

  /*取得setftmp內所有與tmp相同字串的資料列在"="號後面的常數值字串當設定檔內的設定是
  一個常數時套用這個clkws有可能會有錯誤,比如設定"SECTGSROW = 1"而去setftmp找出來的有
  可能是"(B0F1) = 2" 的2,因為在setftmp內會以"1"去找所以找到第一個"1"的"="號後面的2*/
  clkws=lee_rtvfset2sa(setftmp,setfsize,tmpp,GM_USRSETMAX,"=","\n","//",&sz);
  clkwsp=lee_mem2sp(clkws,sz);
 
  /*迴路內的if()...else if()...else...結構是要排除顏色GM_CLxxx是以取得musftmp內的描述詞後
  到setftmp擷取該描述詞的值,而視窗行為是直接設定常數不用到setftmp擷取所需的常數*/
  for(i=0;i<GM_USRSETMAX;i++)
  {
    if(i>=GM_COLORFOOT && i<GM_COLOREND)/*顏色設定的部份*/
    {
      if(strcasecmp(dclkws[i],*(tmpp+i))==0)/*與內定的參照字串相同(檔內未設定)*/
      {
        /*以ddckws內定描述詞去setftmp找*/
        buf=lee_rtvfset2s(setftmp,setfsize,ddclkws[i],"=","\n","//");
        *(usrset+i)=atoi(buf);
        free(buf);
      }
      else/*檔案內有設定*/
        *(usrset+i)=atoi(*(clkwsp+i));/*直接取用clkwsp內的值*/
    }
    /*視窗行為設定的部份與時鐘顯示方式相同(不必透過參照轉換)*/
    else if((i>=GM_MUSETFOOT && i<GM_MUSETEND) || (i>=GM_CLOCKFOOT && i<GM_CLOCKEND))
    {  
      if(strcasecmp(dclkws[i],*(tmpp+i))==0)/*與內定的參照字串相同(檔內未設定)*/
        *(usrset+i)=atoi(ddclkws[i]);/*直接取用ddclkws內定的值*/
      else/*檔案內有設定*/
      {
        /*擷取musftmp內dclkws[i]字串相同的資料列中"="號後面的常數字串*/    
        buf=lee_rtvfset2s(musftmp,musfsize,dclkws[i],"=","\n","//");
        *(usrset+i)=atoi(buf);
        free(buf);      
      }
    }
    else
    {
    ;
    }
  }

  /*錯誤設定的檢查*/  
  /*直列式視窗的下越界基準值不得<=0*/
  if(*(usrset+GM_SECTGSROW)<=0)
     *(usrset+GM_SECTGSROW) = atoi(ddclkws[GM_SECTGSROW]);
  /*橫式選單各選項間的間距行數不得小於0*/
  if(*(usrset+GM_ARCGAPCOL)<0)
     *(usrset+GM_ARCGAPCOL) = atoi(ddclkws[GM_ARCGAPCOL]);
  /*橫式選單反白選項間的留邊數不得小於0*/
  if(*(usrset+GM_ARCPRDSPC)<0)
     *(usrset+GM_ARCPRDSPC) = atoi(ddclkws[GM_ARCPRDSPC]);
  /*橫式選單反白選項間的留邊數大於各選項間的間距行數*/
  if(*(usrset+GM_ARCPRDSPC)>*(usrset+GM_ARCGAPCOL))
     *(usrset+GM_ARCPRDSPC) = *(usrset+GM_ARCGAPCOL);


/*for(i=0,y=10;i<GM_USRSETMAX;i++,y++)
  mvprintw(y,0,"*(dclkwsp%02d)=%9s *(tmpp+%02d)=%9s *(clkwsp+%02d)=%3s *(usrset+%02d)=%d...lee_udfmu_getmuset(",
            i,*(dclkwsp+i),i,*(tmpp+i),i,*(clkwsp+i),i,*(usrset+i));
refresh();
/*除錯用*/
  free(tmp);
  free(tmpp);
  free(clkws);
  free(clkwsp);
  return(&*usrset);

}

/*取得定義檔內的自定義標籤
*/
char *lee_udfmu_getdkts(char *setftmp,int setfsize,int *dkkwssize)
{
  /*內定關鍵字,同時也是設定檔預定搜尋的自設關鍵字識別字*/
  char *dkkwstmp;
  char **ddkkwsp;
  char ddkkws[GM_KWSMAX][9]={
         "[ARCFKW]","[ARCEKW]",
         "[SECFKW]","[SECEKW]",
         "[EXEFKW]","[EXEEKW]",
         "[EXPFKW]","[EXPEKW]",
         "[CACFKW]","[CACEKW]",
         "[ENDRKW]"
        };

  /*將ddkkws[][]定址可讓lee_rtvsetf2sa()依此為參數按順序擷取可能沒按順序排列的映射區資料*/
  ddkkwsp=lee_mem2sp((char *)ddkkws,sizeof(ddkkws));
  /*依dstkw[][]的順序取出檔內設定的替代字串,如果檔內沒有與dstkw[][]相同的設定則以內定的
  dstkw[][]內的字串資料做為關鍵字*/
  dkkwstmp=lee_rtvfset2sa(setftmp,setfsize,ddkkwsp,GM_KWSMAX,"=","\n","//",&*dkkwssize);

  return(&*dkkwstmp);

}

/*取得*setftmp內與mem內所有快捷鍵識別字語鍵值資料列
*/
char *lee_udfmu_getcackws(char **dkkwsp,char *mem,int memsize,char *setftmp,int setfsize,
                      int *cacsize,int *cacstrn,int *cacmlen)
{

  char *tmp,**tmpp;
  char *cacstmp;
  int i,y,sz,len;  

  /*將*mem內所有有關快捷鍵的設定抽取出來*/
  tmp=lee_rtvmkw2sa(mem,memsize,*(dkkwsp+GM_CACFKW),*(dkkwsp+GM_CACEKW),YES,RETRB,
                    &sz,&*cacstrn,&*cacmlen);
  /*將*tmp定址供lee_rtvfset2sa()擷取出有效的快捷鍵值*/
  tmpp=lee_mem2sp(tmp,sz);
  /*將*setftmp內有在*mem定義的快捷鍵的值篩選出來給*cacstmp*/
  cacstmp=lee_rtvfset2sa(setftmp,setfsize,tmpp,*cacstrn,"\n","\n","//",&*cacsize);
  /**cacstmp定址由呼叫者函數執行否則*cacstmp將無法以free()釋放,這樣會造成如副選單快捷鍵的
  取得時每一次副選單都必須取得一塊記憶體空間但回到主選單後卻只能釋放以lee_mem2sp()定址的
  指標陣列空間但實際放資料的*cacstmp一直被要求重新取得記憶體空間*/
  free(tmp);
  free(tmpp);
  return(cacstmp);
}


/*對齊目前按鍵與快捷鍵設定
*/
int lee_udfmu_cackws2dn(int keycode,char **cacsp,int cacstrn,char **tmpp,int tmpstrn,
                       int *pgfoot,int pgend,int *acdn)
{
  char keycodestr[11];
  char *tmp;
  int i,y,k;
 
  /*將目前鍵值轉換成字串*/
  snprintf(keycodestr,sizeof(keycodestr),"%d",keycode);

  /*擷取該鍵值的描述字串,如"(F1)"或"(F9)"*/
  tmp=lee_rtvsp2fore(cacsp,cacstrn,keycodestr,"=");
  if(strlen(tmp)<1)/*該鍵值的描述字串未被使用者定義*/
  {
    free(tmp);/*tmp最少會有一個空白字元所以必須釋放*/
    return(-1);
  }

  /*取得該描述字串在arctmpp的第幾個元素*/
  k=lee_memshunt(tmpp,tmp,0,tmpstrn,FROM);
  if(k==-1)/*該鍵值的描述字串未被使用者定義*/
  {
    free(tmp);
    return(-1);        
  }        

  if(k>=*pgfoot && k<=pgend)/*該元素的選項字串在營幕範圍內*/
    *acdn=k;
  else/*該元素的選項字串在營幕範圍外*/
  {
    *pgfoot=k;
    *acdn=k;  
  }        

  free(tmp);
  return(1);
}


/*副程式的執行,同時擁有副選單與副程式標籤會優先處理副選單
*/
int lee_udfmu_callexe(char **dkkwsp,char *str)
{
  WINDOW *dstwin;
  int scrx,scry;
  char *seckws,*exekws,*expkws;
  int r;

  /*檢查是否有副選單標籤*/
  seckws=lee_rtvstr2s(str,*(dkkwsp+GM_SECFKW),*(dkkwsp+GM_SECEKW),RETRB);
  if(strlen(seckws)>0)/*選項擁有副選單關鍵字*/
  {      
    free(seckws);
    return(0);
  }

  /*檢查是否有副程式標籤*/
  exekws=lee_rtvstr2s(str,*(dkkwsp+GM_EXEFKW),*(dkkwsp+GM_EXEEKW),RETRB);
  if(strlen(exekws)<1)
  {
    free(exekws);
    free(seckws);
    return(-1);
  }

  /*檢查是否有參數標籤*/
  expkws=lee_rtvstr2s(str,*(dkkwsp+GM_EXPFKW),*(dkkwsp+GM_EXPEKW),RETRB);

  r=lee_callexe(exekws,1);

  free(seckws);
  free(exekws);
  free(expkws);

  return(1);

}




/home/stlee/leelib/menu/keyact.c
代碼: [選擇]


#include "/home/stlee/include/state.h"

/*
*udf主選單橫式選單按鍵行為的設定
void lee_udfmumst_keyact(int keycode,int strn,
                         int *pg_foot,int *pg_end,int *prd_flag)

*udf主選單直式選單按鍵行為控制
void lee_udfmuslv_keyact(int keycode,int strn,int pagecode,
                         int pagewit,int *pg_foot,int *prd_flag)

*/

/*udf主選單橫式選單按鍵行為的設定
*/
void lee_udfmumst_keyact(int keycode,int strn,
                         int *pg_foot,int *pg_end,int *prd_flag)
{

  switch(keycode)
  {
    case KDEC_LEFT:
      if(*prd_flag <= 0)
        break;
      *prd_flag-=1;                    
      if(*pg_foot > *prd_flag)  
        *pg_foot-=1;

    break;
    case KDEC_RIGHT:    
      if(*prd_flag >= strn-1)
        break;  
      *prd_flag+=1;          
      if(*prd_flag > *pg_end)
        *pg_foot=*pg_end;      

    break;
    case KDEC_HOME:
      *prd_flag=*pg_foot;      

    break;
    case KDEC_END:
      *prd_flag=*pg_end;
    break;
  }

}


/*udf主選單直式選單按鍵行為控制
*/
void lee_udfmuslv_keyact(int keycode,int strn,int pagecode,
                         int pagewit,int *pg_foot,int *prd_flag)
{
  int pgfoot,pgend,prdflag;

  if(pagewit<=0)
    return;

  prdflag=*prd_flag;/*反白所在旗標*/  
  pgfoot=*pg_foot;/*本頁起始旗標*/
  pgend=pgfoot+(pagewit-1);/*本頁終止旗標*/

  switch(keycode)
  {
    case KDEC_UP:
   
      if(prdflag <= 0 && pagecode!=CIRCU)
        break;
      prdflag -= 1;
      if(pgfoot > prdflag)/*反白已移到頁首須翻頁*/
      {
        if(pagecode==CIRCU)/*在本頁循環,此模式只有PAGE UP或DOWN才可進行翻頁*/
{
 if(pgend > strn-1)
   prdflag = strn-1;  
 else
   prdflag = pgend;  
}  
else if(pagecode==PAGE)/*翻到上一頁*/      
 pgfoot -= pagewit;    
else if(pagecode==STOP)/*停住,此模式只有PAGE UP或DOWN才可進行翻頁*/
{
 prdflag += 1;
 break;    
}  
else
 break;/*pagecode參數錯誤*/                        
      }    
      if(pgfoot < 0)
        pgfoot = 0;
     
    break;
    case KDEC_DOWN:
   
      if(prdflag >= strn-1 && pagecode != CIRCU)
        break;
      prdflag += 1;        
      if(prdflag > pgend || prdflag > strn-1)/*反白已移到頁尾須翻頁*/
      {
        if(pagecode==CIRCU)/*在本頁循環,此模式只有PAGE UP或DOWN才可翻頁*/
 prdflag = pgfoot;
else if(pagecode==PAGE)/*翻到下一頁*/
 pgfoot = prdflag;    
else if(pagecode==STOP)/*頁末停住,此模式只有PAGE UP或DOWN才可翻頁頁*/
{
 prdflag -= 1;
 break;    
}  
else
 break;/*pagecode參數錯誤*/                    
      }
     
    break;    
    case KDEC_PGUP:
   
      if(prdflag <= 0 || strn-1 < pagewit)
        break;
      if(pgfoot-pagewit < 0)/*無上一頁(最前一頁)時等同KDEC_UP鍵*/
        prdflag -= 1;
      else
      {
        pgfoot -= pagewit;
        prdflag -= pagewit;/*反白旗標與頁首減同值可令翻頁後的反白停在相同位置*/
      }
     
    break;
    case KDEC_PGDOWN:
   
      if(prdflag >= strn-1 || strn-1 < pagewit)
        break;
      if(pgfoot+pagewit >= strn)/*無下一頁(最後一頁)時等同KDEC_DOWN鍵*/
        prdflag += 1;
      else if(prdflag+pagewit > strn-1)/*下頁相對位置的反白超出選單範圍*/
      {
        pgfoot += pagewit;
        prdflag = pgfoot;/*令反白在頁首*/
      }
      else  
      {
        pgfoot += pagewit;
        prdflag += pagewit;/*反白旗標與頁首加同值可令翻頁後的反白停在相同位置*/
      }
     
    break;
  }

  *pg_foot=pgfoot;
  *prd_flag=prdflag;

}



/home/stlee/leelib/menu/mudsp.c
[code]

#include "/home/stlee/include/state.h"

/*
*udf主選單橫式選單的顯示,當不定長度陣列顯示超出範圍時可以不顯示
void lee_udfmumst_mudsp(WINDOW *winptr,
      char **arcmustmpp,int arcmustrn,
      int pgfoot,int prdflag,
      int wlcx,int wrcx,int wmcy,int *usrset,
      int *prdlcx,int *pgend)
     
*udf主選單直式選單顯示
void lee_udfmuslv_mudsp(WINDOW *winptr,char **opttmpp,int optstrn,
                        int tcx,int tcy,int dcx,int dcy,int *usrset,
                        int pgfoot,int prdflag,
                        int *pg_end)

*/

/*udf主選單橫式選單的顯示,當不定長度陣列顯示超出範圍時可以不顯示
*/
void lee_udfmumst_mudsp(WINDOW *winptr,
      char **arcmustmpp,int arcmustrn,
      int pgfoot,int prdflag,
      int wlcx,int wrcx,int wmcy,int *usrset,
      int *prdlcx,int *pgend
                 )
{  
  int i,n,k,x,y,px;

  /*清空顯示區*/
  lee_wmucls(winptr,wlcx,wmcy,wrcx,wmcy,*(usrset+GM_CLARCOPT),NOT);
  x=wlcx+1;
  /*顯示到arcmustrn,如已超出顯示範圍dcy則跳出迴路*/
  for(i=pgfoot; i < arcmustrn;i++)
  {
    n=strlen(*(arcmustmpp+i));/*計算每一個字串的長度*/    
    if(x+n >= wrcx)/*已超出顯示範圍*/
      break;
    if(i==prdflag)/*反白所在*/
      px=x;
    mvwprintw(winptr,wmcy,x,"%s",*(arcmustmpp+i));/*顯示字串*/
    x+=n+*(usrset+GM_ARCGAPCOL);/*加上下一個顯示字串的間隔*/  
  }
  /*清空反白列*/
  k=*(usrset+GM_ARCPRDSPC);
  n=strlen(*(arcmustmpp+prdflag));
  lee_wmucls(winptr,px-k,wmcy,px+n+k,wmcy,*(usrset+GM_CLARCPRD),NOT);
  mvwprintw(winptr,wmcy,px,"%s",*(arcmustmpp+prdflag));
  wrefresh(winptr);/*刷新*/

  *prdlcx=px;/*設定反白選項的子選單初始x座標*/
  *pgend=i-1;

}

/*udf主選單直式選單顯示
*/
void lee_udfmuslv_mudsp(WINDOW *winptr,char **opttmpp,int optstrn,
                        int tcx,int tcy,int dcx,int dcy,int *usrset,
                        int pgfoot,int prdflag,
                        int *pg_end
                       )
{
  int i,n,k,x,y,py;

  /*清空顯示區*/
  lee_wmucls(winptr,tcx,tcy,dcx,dcy,*(usrset+GM_CLSECOPT),NOT);
  /*顯示到optstrn,如已超出顯示範圍dcy則跳出迴路*/
  for(i=pgfoot,y=tcy;i<optstrn;i++,y++)
  {
    if(y>=dcy)/*超出顯示範圍*/
      break;
    if(i==prdflag)/*反白所在*/
      py=y;

26
請問在ncurses中是否有將WINDOW的curscr複製下來的方法

主要目的是希望用遞迴透過複製curscr(不是要複製stdscr)來達到收斂副選單時有逐層收回效果

比如:
代碼: [選擇]


┌--------------------------------------------┐
│主選單選項1      主選單選項2      主選單選項3        │   ------->主選單在stdscr作用,也可在主流程中宣告一個winptr使之作用
└-------------------------------------------­­-┘
┌------┐
│ 副選單 │
│ A 層 │
│      │┌------┐
­└-----­­-┘│ 副選單 │
      │ B 層 │
        │      │┌------┐
        └-----­­-┘│ 副選單 │
                │ C .. │    
                │      │
                └-----­­-┘

副選單在另一函數中以遞迴(如果有需要B以後的副選單時)叫用自己以展開副選單B,C
而沒有需要B以後的副選單時則只顯示A層副選單並在按下左右方向鍵時
以touchwin(stdscr)刷新stdscr後返回主控制函數(主流程移動到下一個主選單選項)


現在展開B以後層的副選單時要收回來有點問題!!!
比如現在已經到達C層的副選單了,要回到B層的副選單時可以順利的動作但原來的C層副選單卻仍留在畫面上

如果以touchwin()的方式就是不知道應該傳哪個參數給他

1.用stdscr但無法達到逐層回去的效果

2.用刪掉副選單函數內宣告的winptr的方式但要留住A,B層副選單的畫面不太好弄(容易寫成stdscr缺角的情況,這在底下沒東西是沒關係但原stdscr有東西時就完蛋)

3.傳副選單的winptr給touchwin().....沒有意義

所以理想狀況就是能在副選單的函數一開始就把stdscr複製起來等到要離開那一層副選單時就還原回去
touchwin()很像可以達到離開時的還原動作,但前面的複製動作不知道應如何去達成

因為目前寫的是可以透過設定檔內的關鍵字來隨意設定主副選單的選項字串與設定值(目前只寫到選項字串),而設定值可能是一個副程式的路徑檔名及參數或是快捷鍵
所以副選單以遞迴的方式來寫可以不限定層次(雖然實用可能不超過3層)

ps.如果以TurboC來說就是希望能達到gettext()和puttext()的功能

謝謝^^!

27
程式討論版 / 土法鍊鋼的鍵盤控制
« 於: 2007-09-05 18:34 »
這是去年寫的雖可以正常運作,不過還是有點小奇怪(複合鍵有些是重覆的)

不知道是不是有可以取得"掃描碼"的函數庫???

謝謝

代碼: [選擇]

/*############################################################################
 初始化鍵盤
 相關函數:叫用此函數後可以lee_getkb()取得使用者按下的按鍵的鍵盤碼
############################################################################*/
void lee_initkb(void)
{
  tcgetattr(0,&initial_settings);
  new_settings=initial_settings;

  new_settings.c_lflag &= ~ICANON;
  new_settings.c_lflag &= ~ECHO;
  new_settings.c_lflag &= ~ISIG;

  new_settings.c_cflag &= ~CS8;

  new_settings.c_cc[VMIN] = 1;
  new_settings.c_cc[VTIME] = 0;
  tcsetattr(0,TCSANOW,&new_settings);

/*  noecho();/*抑制鍵入字元回應(例如按ESC鍵會回應^[後將之顯示出來)*/

}



/*#############################################################################
鍵盤碼取得後傳回呼叫者函數
傳回值:使用者按下的按鍵碼,無按鍵時傳回-1
叫用此函數前需以lee_initkb()初始化鍵盤(或以lee_initkbscr()初始化鍵盤及營幕)
叫用此函數前需含引 #include "/home/stlee/include/keydec.h"
int sensitive 是否區分大小寫 0=不分大小寫 1=要分大小寫
#############################################################################*/
int lee_getkb(int sensitive)
{
  char ch;
  char chs[7];
  int nread,code;
  int i;  

  memset(chs,0,7);

  nread=read(0,&chs,6);

/*  new_settings.c_cc[VMIN] = 0;
  tcsetattr(0,TCSANOW,&new_settings);  
  nread=read(0,&chs,6);
  new_settings.c_cc[VMIN] = 1;
  tcsetattr(0,TCSANOW,&new_settings);  
/*
mvwprintw(stdscr,2,2,"nread=%d chs=%s initkbscr.c -> lee_getkb()\n",nread,chs);
wrefresh(stdscr);
*/

  if(nread>0)
  {
    /*設定各鍵的起始值,功能鍵佔2個位元以上..因為是累加各位元的值
      所以起始值必須不同以免造成兩個組合鍵有同一個值*/
    if(nread==1)
      code=0;
    else if(nread==2)
      code=256;
    else if(nread==3)
    {
      if(chs[1]=='O')/*視窗模式下F1~F4補128*/
        code=512+128;
      else
        code=512;      
    }
    else if(nread==4)
      code=1024;
    else if(nread==5)
      code=2048;
    else if(nread==6)
      code=4096;
    else
      code=0;
   
    if(nread>1)/*一個以上的字元是功能鍵(非ascii字元)*/
      for(i=0;i<nread;i++)
        code += chs[i];
    else
      code=chs[0];

   
    if(sensitive==1)/*字母要分大小寫時直接傳回*/
      return(code);

    /*字母不分大小寫的處理,小寫轉大寫後加8192;大寫直接加8192*/    
    if(code>=97 && code<=122)
    {  
      code-=32;
      code+=8192;
    }  
    else if(code>=65 && code<=90)    
      code+=8192;    
    else if(code>=380 && code<=405)/*Alt+a~z小寫*/
    {
      code-=32;
      code+=8192;
    }
    else if(code>=348 && code<=373)/*Alt+A~Z大寫*/
      code+=8192;
    else/*其它按鍵不位移*/
    {
    ;
    }
    return(code);
  }  
  return(NOKEYIN);
}

/*#############################################################################
鍵盤碼取得,設定呼叫者函數的字串
除可傳回鍵盤碼也可將參數*s的字串加入按下的按鍵(可見字元),可正確的分辨大小寫
中文的輸入是雙位元,此函數可順利補第二個位元到*s使中文的輸入完整

#############################################################################*/


int lee_getkbsi(char *s)
{
  char ch;
  char chs[7];
  int nread,code;
  int i,sensitive;  

  memset(chs,0,7);
  nread=read(0,&chs,6);

/*  new_settings.c_cc[VMIN] = 0;
  tcsetattr(0,TCSANOW,&new_settings);  
  nread=read(0,&chs,6);
  new_settings.c_cc[VMIN] = 1;
  tcsetattr(0,TCSANOW,&new_settings);  
*/

  if(nread>0)
  {
    /*設定各鍵的起始值,功能鍵佔2個位元以上..因為是累加各位元的值
      所以起始值必須不同以免造成兩個組合鍵有同一個值*/
    if(nread==1)
      code=0;
    else if(nread==2)
      code=256;
    else if(nread==3)
    {
      if(chs[1]=='O')/*視窗模式下F1~F4補128*/
        code=512+128;
      else
        code=512;
    }
    else if(nread==4)
      code=1024;
    else if(nread==5)
      code=2048;
    else if(nread==6)
      code=4096;
    else
      code=0;
   
    if(nread>1)/*一個以上的字元是功能鍵(非ascii字元)*/
      for(i=0;i<nread;i++)        
        code += chs[i];
    else
      code=chs[0];
/*
mvprintw(9,0,"chs[0]=%c chs[1]=%c chs[2]=%c chs[3]=%c chs[4]=%c chs[5]=%c nread=%d code=%d .../menu/initkbscr.c/lee_getkbsi()",
              chs[0],chs[1],chs[2],chs[3],chs[4],chs[5],nread,code);
refresh();
*/

    memset(s,ISNULL,3);    
    if(nread<=2)
    {          
      /*非輸入狀態:2位元的第1個位元是^[時為功能鍵
        只有1個位元但不是可列印字元時不加入字串*/
      if(chs[0]==ISESC || (nread==1 && !isprint(chs[0])) )
      {
        if( chs[0] == ISTAB )/*TAB鍵*/
          s[0]=ISTAB;

        return(code);  

      }      
      /*輸入狀態時將輸入的按鍵或雙位元文字加到*s;可處理中文的雙位元輸入*/
      strcat(s,chs);
    }    
    return(code);
  }  
  return(NOKEYIN);
}




keydec.h
代碼: [選擇]

/*字母要分大小寫時使用下列                        */
#define KDEC_CA         65   /*按鍵A大寫          */
#define KDEC_CB         66   /*按鍵B大寫          */
#define KDEC_CC         67   /*按鍵C大寫          */
#define KDEC_CD         68   /*按鍵D大寫          */
#define KDEC_CE         69   /*按鍵E大寫          */
#define KDEC_CF         70   /*按鍵F大寫          */
#define KDEC_CG         71   /*按鍵G大寫          */
#define KDEC_CH         72   /*按鍵H大寫          */
#define KDEC_CI         73   /*按鍵I大寫          */
#define KDEC_CJ         74   /*按鍵J大寫          */
#define KDEC_CK         75   /*按鍵K大寫          */
#define KDEC_CL         76   /*按鍵L大寫          */
#define KDEC_CM         77   /*按鍵M大寫          */
#define KDEC_CN         78   /*按鍵N大寫          */
#define KDEC_CO         79   /*按鍵O大寫          */
#define KDEC_CP         80   /*按鍵P大寫          */
#define KDEC_CQ         81   /*按鍵Q大寫          */
#define KDEC_CR         82   /*按鍵R大寫          */
#define KDEC_CS         83   /*按鍵S大寫          */
#define KDEC_CT         84   /*按鍵T大寫          */
#define KDEC_CU         85   /*按鍵U大寫          */
#define KDEC_CV         86   /*按鍵V大寫          */
#define KDEC_CW         87   /*按鍵W大寫          */
#define KDEC_CX         88   /*按鍵X大寫          */
#define KDEC_CY         89   /*按鍵Y大寫          */
#define KDEC_CZ         90   /*按鍵Z大寫          */
/*-----------*/
#define KDEC_LA         97   /*按鍵A小寫          */
#define KDEC_LB         98   /*按鍵B小寫          */
#define KDEC_LC         99   /*按鍵C小寫          */
#define KDEC_LD         100  /*按鍵D小寫          */
#define KDEC_LE         101  /*按鍵E小寫          */
#define KDEC_LF         102  /*按鍵F小寫          */
#define KDEC_LG         103  /*按鍵G小寫          */
#define KDEC_LH         104  /*按鍵H小寫          */
#define KDEC_LI         105  /*按鍵I小寫          */
#define KDEC_LJ         106  /*按鍵J小寫          */
#define KDEC_LK         107  /*按鍵K小寫          */
#define KDEC_LL         108  /*按鍵L小寫          */
#define KDEC_LM         109  /*按鍵M小寫          */
#define KDEC_LN         110  /*按鍵N小寫          */
#define KDEC_LO         111  /*按鍵O小寫          */
#define KDEC_LP         112  /*按鍵P小寫          */
#define KDEC_LQ         113  /*按鍵Q小寫          */
#define KDEC_LR         114  /*按鍵R小寫          */
#define KDEC_LS         115  /*按鍵S小寫          */
#define KDEC_LT         116  /*按鍵T小寫          */
#define KDEC_LU         117  /*按鍵U小寫          */
#define KDEC_LV         118  /*按鍵V小寫          */
#define KDEC_LW         119  /*按鍵W小寫          */
#define KDEC_LX         120  /*按鍵X小寫          */
#define KDEC_LY         121  /*按鍵Y小寫          */
#define KDEC_LZ         122  /*按鍵Z小寫          */
/*字母不要分大小寫時使用下列                      */
#define KDEC_A          8257 /*按鍵A              */
#define KDEC_B          8258 /*按鍵B              */
#define KDEC_C          8259 /*按鍵C              */
#define KDEC_D          8260 /*按鍵D              */
#define KDEC_E          8261 /*按鍵E              */
#define KDEC_F          8262 /*按鍵F              */
#define KDEC_G          8263 /*按鍵G              */
#define KDEC_H          8264 /*按鍵H              */
#define KDEC_I          8265 /*按鍵I              */
#define KDEC_J          8266 /*按鍵J              */
#define KDEC_K          8267 /*按鍵K              */
#define KDEC_L          8268 /*按鍵L              */
#define KDEC_M          8269 /*按鍵M              */
#define KDEC_N          8270 /*按鍵N              */
#define KDEC_O          8271 /*按鍵O              */
#define KDEC_P          8272 /*按鍵P              */
#define KDEC_Q          8273 /*按鍵Q              */
#define KDEC_R          8274 /*按鍵R              */
#define KDEC_S          8275 /*按鍵S              */
#define KDEC_T          8276 /*按鍵T              */
#define KDEC_U          8277 /*按鍵U              */
#define KDEC_V          8278 /*按鍵V              */
#define KDEC_W          8279 /*按鍵W              */
#define KDEC_X          8280 /*按鍵X              */
#define KDEC_Y          8281 /*按鍵Y              */
#define KDEC_Z          8282 /*按鍵Z              */

/*================================================
xxx_PTxx定義為虛擬終端機模式下的功能鍵值與Xwindow下略有不同
==================================================*/
#define KDEC_PTF1       1298 /*                   */
#define KDEC_PTF2       1299 /*                   */
#define KDEC_PTF3       1300 /*                   */
#define KDEC_PTF4       1301 /*                   */
#define KDEC_PTF5       1302 /*                   */
#define KDEC_PTHOME     1317 /*到第一行           */
#define KDEC_PTEND      1320 /*到最後一行         */
/*以下為功能鍵定義                                */
#define KDEC_ESC        27   /*                   */
#define KDEC_F1         826  /*補128              */
#define KDEC_F2         827  /* ""                */
#define KDEC_F3         828  /* ""                */
#define KDEC_F4         829  /* ""                */
#define KDEC_F5         2394 /*                   */
#define KDEC_F6         2396 /*                   */    
#define KDEC_F7         2397 /*                   */    
#define KDEC_F8         2398 /*                   */    
#define KDEC_F9         2390 /*                   */    
#define KDEC_F10        2391 /*                   */
#define KDEC_F11        2393 /*                   */
#define KDEC_F12        2394 /*                   */
/*                                                */                    
#define KDEC_HAIRY      96   /*毛毛蟲             */
#define KDEC_NISSB      45   /*上方減-號          */
#define KDEC_EQUSB      61   /*上方=號            */
#define KDEC_BKLASH     92   /*反斜線\            */
#define KDEC_BACK       127  /*<-刪除前一字元     */
#define KDEC_TAB        9    /*Tab鍵              */
#define KDEC_XBRL       91   /*大括弧左[          */
#define KDEC_XBRR       93   /*大括弧右]          */
#define KDEC_SEMI       59   /*分號 ;             */
#define KDEC_SS         39   /*上引號 "           */
#define KDEC_MBRL       44   /*中括弧左<          */
#define KDEC_MBRR       46   /*中括弧右>          */
#define KDEC_BIAS       47   /*斜線/              */
#define KDEC_ENTER      13   /*Enter鍵            */
#define KDEC_SPACE      32   /*空白鍵             */
/*                                                */
#define KDEC_INSERT     1318 /*增列               */
#define KDEC_DELETE     1319 /*刪除游標所在       */
#define KDEC_HOME       702  /*到第一行           */
#define KDEC_END        700  /*到最後一行         */
#define KDEC_PGUP       1321 /*上翻一頁           */
#define KDEC_PGDOWN     1322 /*下翻一頁           */
#define KDEC_UP         695  /*上                 */
#define KDEC_DOWN       696  /*下                 */
#define KDEC_LEFT       698  /*左                 */
#define KDEC_RIGHT      697  /*右                 */
/*                                                */
#define KDEC_1BN        49   /*數字鍵1            */
#define KDEC_2BN        50   /*數字鍵2            */
#define KDEC_3BN        51   /*數字鍵3            */
#define KDEC_4BN        52   /*數字鍵4            */
#define KDEC_5BN        53   /*數字鍵5            */
#define KDEC_6BN        54   /*數字鍵6            */
#define KDEC_7BN        55   /*數字鍵7            */
#define KDEC_8BN        56   /*數字鍵8            */  
#define KDEC_9BN        57   /*數字鍵9            */  
#define KDEC_0BN        48   /*數字鍵0            */  
#define KDEC_DOT        46   /*數字鍵.號          */
#define KDEC_PLUSS      43   /*數字鍵+號          */
#define KDEC_NINUSS     45   /*數字鍵-號          */
#define KDEC_TIMESS     42   /*數字鍵*號          */
#define KDEC_DIVISS     47   /*數字鍵/號          */

/*=======================================================================
以下定義為複合鍵Alt+..的值
=======================================================================*/
/*字母要分大小寫時使用下列                            */
#define KDEC_ALT_CA         348  /*按鍵A大寫          */
#define KDEC_ALT_CB         349  /*按鍵B大寫          */
#define KDEC_ALT_CC         350  /*按鍵C大寫          */
#define KDEC_ALT_CD         351  /*按鍵D大寫          */
#define KDEC_ALT_CE         352  /*按鍵E大寫          */
#define KDEC_ALT_CF         353  /*按鍵F大寫          */
#define KDEC_ALT_CG         354  /*按鍵G大寫          */
#define KDEC_ALT_CH         355  /*按鍵H大寫          */
#define KDEC_ALT_CI         356  /*按鍵I大寫          */
#define KDEC_ALT_CJ         357  /*按鍵J大寫          */
#define KDEC_ALT_CK         358  /*按鍵K大寫          */
#define KDEC_ALT_CL         359  /*按鍵L大寫          */
#define KDEC_ALT_CM         350  /*按鍵M大寫          */
#define KDEC_ALT_CN         361  /*按鍵N大寫          */
#define KDEC_ALT_CO         362  /*按鍵O大寫          */
#define KDEC_ALT_CP         363  /*按鍵P大寫          */
#define KDEC_ALT_CQ         364  /*按鍵Q大寫          */
#define KDEC_ALT_CR         365  /*按鍵R大寫          */
#define KDEC_ALT_CS         366  /*按鍵S大寫          */
#define KDEC_ALT_CT         367  /*按鍵T大寫          */
#define KDEC_ALT_CU         368  /*按鍵U大寫          */
#define KDEC_ALT_CV         369  /*按鍵V大寫          */
#define KDEC_ALT_CW         370  /*按鍵W大寫          */
#define KDEC_ALT_CX         371  /*按鍵X大寫          */
#define KDEC_ALT_CY         372  /*按鍵Y大寫          */
#define KDEC_ALT_CZ         373  /*按鍵Z大寫          */
/*---------------*/
#define KDEC_ALT_LA         380  /*按鍵A小寫          */
#define KDEC_ALT_LB         381  /*按鍵B小寫          */
#define KDEC_ALT_LC         382  /*按鍵C小寫          */
#define KDEC_ALT_LD         383  /*按鍵D小寫          */
#define KDEC_ALT_LE         384  /*按鍵E小寫          */
#define KDEC_ALT_LF         385  /*按鍵F小寫          */
#define KDEC_ALT_LG         386  /*按鍵G小寫          */
#define KDEC_ALT_LH         387  /*按鍵H小寫          */
#define KDEC_ALT_LI         388  /*按鍵I小寫          */
#define KDEC_ALT_LJ         389  /*按鍵J小寫          */
#define KDEC_ALT_LK         390  /*按鍵K小寫          */
#define KDEC_ALT_LL         391  /*按鍵L小寫          */
#define KDEC_ALT_LM         392  /*按鍵M小寫          */
#define KDEC_ALT_LN         393  /*按鍵N小寫          */
#define KDEC_ALT_LO         394  /*按鍵O小寫          */
#define KDEC_ALT_LP         395  /*按鍵P小寫          */
#define KDEC_ALT_LQ         396  /*按鍵Q小寫          */
#define KDEC_ALT_LR         397  /*按鍵R小寫          */
#define KDEC_ALT_LS         398  /*按鍵S小寫          */
#define KDEC_ALT_LT         399  /*按鍵T小寫          */
#define KDEC_ALT_LU         400  /*按鍵U小寫          */
#define KDEC_ALT_LV         401  /*按鍵V小寫          */
#define KDEC_ALT_LW         402  /*按鍵W小寫          */
#define KDEC_ALT_LX         403  /*按鍵X小寫          */
#define KDEC_ALT_LY         404  /*按鍵Y小寫          */
#define KDEC_ALT_LZ         405  /*按鍵Z小寫          */
/*字母不要分大小寫時使用下列                      */
#define KDEC_ALT_A          8540 /*按鍵A              */
#define KDEC_ALT_B          8541 /*按鍵B              */
#define KDEC_ALT_C          8542 /*按鍵C              */
#define KDEC_ALT_D          8543 /*按鍵D              */
#define KDEC_ALT_E          8544 /*按鍵E              */
#define KDEC_ALT_F          8545 /*按鍵F              */
#define KDEC_ALT_G          8546 /*按鍵G              */
#define KDEC_ALT_H          8547 /*按鍵H              */
#define KDEC_ALT_I          8548 /*按鍵I              */
#define KDEC_ALT_J          8549 /*按鍵J              */
#define KDEC_ALT_K          8550 /*按鍵K              */
#define KDEC_ALT_L          8551 /*按鍵L              */
#define KDEC_ALT_M          8552 /*按鍵M              */
#define KDEC_ALT_N          8553 /*按鍵N              */
#define KDEC_ALT_O          8554 /*按鍵O              */
#define KDEC_ALT_P          8555 /*按鍵P              */
#define KDEC_ALT_Q          8556 /*按鍵Q              */
#define KDEC_ALT_R          8557 /*按鍵R              */
#define KDEC_ALT_S          8558 /*按鍵S              */
#define KDEC_ALT_T          8559 /*按鍵T              */
#define KDEC_ALT_U          8560 /*按鍵U              */
#define KDEC_ALT_V          8561 /*按鍵V              */
#define KDEC_ALT_W          8562 /*按鍵W              */
#define KDEC_ALT_X          8563 /*按鍵X              */
#define KDEC_ALT_Y          8564 /*按鍵Y              */
#define KDEC_ALT_Z          8565 /*按鍵Z              */
/*                                                    */
#define KDEC_ALT_HAIRY      379  /*毛毛蟲             */
#define KDEC_ALT_NISSB      328  /*上方減-號          */
#define KDEC_ALT_EQUSB      344  /*上方=號            */
#define KDEC_ALT_BKLASH     375  /*反斜線\            */
#define KDEC_ALT_BACK       410  /*<-刪除前一字元     */
#define KDEC_ALT_XBRL       374  /*大括弧左[{         */
#define KDEC_ALT_XBRR       376  /*大括弧右]}         */
#define KDEC_ALT_SEMI       342  /*分號 ;             */
#define KDEC_ALT_SS         322  /*上引號 "           */
#define KDEC_ALT_MBRL       327  /*中括弧左<          */
#define KDEC_ALT_MBRR       329  /*中括弧右>          */
#define KDEC_ALT_BIAS       330  /*斜線/              */
#define KDEC_ALT_ENTER      296  /*Enter鍵            */
#define KDEC_ALT_SPACE      315  /*空白鍵             */
/*                                                    */
#define KDEC_ALT_INSERT     2369 /*增列               */
#define KDEC_ALT_DELETE     2370 /*刪除游標所在       */
#define KDEC_ALT_HOME       1241 /*到第一行           */
#define KDEC_ALT_END        1239 /*到最後一行        */
#define KDEC_ALT_PGUP       2372 /*上翻一頁           */
#define KDEC_ALT_PGDOWN     2373 /*下翻一頁           */
#define KDEC_ALT_UP         1234 /*上                 */
#define KDEC_ALT_DOWN       1235 /*下                 */
#define KDEC_ALT_LEFT       1237 /*左                 */
#define KDEC_ALT_RIGHT      1236 /*右                 */
/*                                                    */
#define KDEC_ALT_1BN        332  /*數字鍵1            */
#define KDEC_ALT_2BN        333  /*數字鍵2            */
#define KDEC_ALT_3BN        334  /*數字鍵3            */
#define KDEC_ALT_4BN        335  /*數字鍵4            */
#define KDEC_ALT_5BN        336  /*數字鍵5            */
#define KDEC_ALT_6BN        337  /*數字鍵6            */
#define KDEC_ALT_7BN        338  /*數字鍵7            */
#define KDEC_ALT_8BN        339  /*數字鍵8            */  
#define KDEC_ALT_9BN        340  /*數字鍵9            */  
#define KDEC_ALT_0BN        331  /*數字鍵0            */  
#define KDEC_ALT_DOT        329  /*數字鍵.號          */
#define KDEC_ALT_PLUSS      326  /*數字鍵+號          */
#define KDEC_ALT_NINUSS     328  /*數字鍵-號          */
#define KDEC_ALT_TIMESS     325  /*數字鍵*號          */
#define KDEC_ALT_DIVISS     330  /*數字鍵/號          */


寫得有點怪不過能用就是了^^!

28
程式討論版 / 如何將游標隱藏???
« 於: 2007-09-05 16:27 »
在使用curses函數庫時可以利用clear()及refresh()將螢幕清空

這在需要在文字模式下寫一個選單程式是很好用的函數庫

不過現在有個小討厭>"<

那就是在螢幕清空後游標還是一直留在那裡,雖然可以把他移到其他位置

不過還是最好能將之隱藏起來,這樣在選單畫面中才不會給他有點奇怪

所以想請問一下如何將游標隱藏起來...謝謝

以下是清除營幕的代碼
代碼: [選擇]


main()

{
  lee_initscr();/*鍵盤,營幕顯示控制起始,清除營幕並將游標*/

getch();

  lee_closescr();/*鍵盤,營幕顯示控制終止*/
}


/*############################################################################
 初始化終端機營幕顯示色彩並清除營幕

 1-64=低亮度文字
 65-128=高亮度文字
 129-192=低亮度+文字閃爍  中文模式下無法閃爍(Xwindow的終端機視窗可以)
 193-256=高亮度+文字閃爍  中文模式下無法閃爍(Xwindow的終端機視窗可以)
#############################################################################*/
void lee_initscr(void)
{
  int color[8]={COLOR_BLACK,  /*黑*/
                COLOR_RED,    /*紅*/
                COLOR_GREEN,  /*綠*/
                COLOR_YELLOW, /*黃*/
                COLOR_BLUE,   /*藍*/
                COLOR_MAGENTA,/*紫*/
                COLOR_CYAN,   /*青*/
                COLOR_WHITE   /*灰*/
               };
  int i,f,b;

  initscr();/*營幕顯示控制起始化*/
  if(!has_colors() || start_color() != OK)
  {
    fprintf(stderr,"色彩起始失敗-> 函數 lee_initscr()..htart_color() start_color()\n");
    getchar();
    return;
  }
  /*清除營幕並將游標移至0,0*/
  clear();
  refresh();


  /*定義要被COLOR_PAIR()存取的屬性,其參數必須是連續的值,由i=1開始經迴路後共設64種基本組合*/
  i=1;
  for(b=0;b<=7;b++)/*背景共8色:每8種組合換1個背景色*/
    for(f=0;f<=7;f++,i++)/*前景共8色:每種組合換1前景色,換完8色後再從第1色開始*/
      init_pair(i,color[f],color[b]);

}

/*############################################################################
 營幕顯示控制結束
############################################################################*/
void lee_closescr(void)
{
  endwin();/*營幕顯示控制終止*/
}


29
雜七雜八 / 找到兇手了!!!
« 於: 2007-06-11 02:27 »
想說六月五號那一天怎麼跳到四百多人那麼熱鬧?_?

http://eoffice.im.fju.edu.tw/phpbb/viewtopic.php?p=18046#18046

不知道是哪位潛水員呢?_?

30
好康報報 / 把妹聖地^^!
« 於: 2007-05-30 15:27 »
不知道各位宅男們是否有欠"妹"

可能我是多此一舉啦!!!不過最近在各大新聞媒體炒作的娛樂話題之一就是"星光幫"&"蕭敬騰"

http://www.wretch.cc/hala/viewforum.php?f=163
在這個討論區(無名的花痴大帝國討論區)

還有這裡蕭敬騰的討論版....這裡比較缺^^!....因為都是一些散兵游勇組成的
http://forums.guestbook.com.tw/f12/index.php?mforum=globe760330

是滿缺少一些"高手"去幫他們處理一些事情的(追星族還能有啥事情呢???)

去發揮一下專長吧^^!

當然這不是廣告,只是前幾個禮拜老婆瘋得跟什麼似的所以本人有去逛了一下

看到一些事情(文章)真的只能用瘋狂形容>"<

所以再想到之前在本討論區有人說php不能幫他把到妹--->現在很像可以了耶^^!

唉....學php真好

ps1."無名的花痴大帝國討論區"是本人取的暱稱,如有不妥請告知,謝謝^^!
ps2.純粹是报一下(這算好康的吧??)的,把不到妹不要來找我負責呀>"<

頁: [1] 2