?? blind_ime_more.h~
字號:
//stop_t2s("由同音字詞語選漢字"); cur = first; while(1) //沒有按下ENTER鍵且鏈表未讀完時循環 { get_first_phrase(s_tmp,cur->phrase); T2S_t2s(s_tmp);//調用語音函數讀出漢字 printf("s_tmp=%s\n",s_tmp); usleep(1800000); //stop_t2s(s_tmp);//選擇等待時間 if(cur->link==NULL) { cur=first; } else cur=cur->link; }}void * associate_th(void * data) //語音讀同音字鏈表線程{ char s_tmp[40],ph_tmp[20]; int i_st=0,i_pht=0; // T2S_option( FEMALE, 2, 1 ); //調用語音函數讀出漢字 // T2S_t2s("選擇漢字或詞語"); //stop_t2s("選擇漢字或詞語"); sprintf(s_tmp,"%s,%s",cur->character,cur->phrase); while(1) { i_pht=0; while(s_tmp[i_st]!=','&&s_tmp[i_st]!='\0')/*取得字或詞組*/ { ph_tmp[i_pht++]=s_tmp[i_st++]; } i_st++; ph_tmp[i_pht]='\0'; T2S_t2s(ph_tmp);//調用語音函數讀出漢字 strcpy(character,ph_tmp); printf("ph_tmp=%s\n",ph_tmp); usleep(2000000);//選擇等待時間 // stop_t2s(ph_tmp); if(s_tmp[i_st]=='\0') { i_st=0; } }}//觸摸屏漢字選擇線程void * read_th(void * data) //語音讀同音字鏈表線程{ pthread_t th_display=-1,th_associate=-1; int ret; /*同音詞選擇*/ printf("display_th start\n"); pthread_create(&th_display, NULL, display_th, 0); ret=bime_left_or_right(); pthread_cancel(th_display); /*聯想選擇*/ printf("associate_th start\n"); pthread_create(&th_associate, NULL, associate_th, 0); ret=bime_left_or_right(); pthread_cancel(th_associate); printf("%s\n", character ); freq_change( &my_stock, cur->sequence ); //字頻改編函數} /* 修改字庫表中的字頻項 */void freq_change(STOCK_DBS *my_stock , char * sequence){ int ret,i; char seq_cp[10]; DBC * cursor_words; DBT key, data; WORDS my_words; char seq[10]; strcpy( seq, sequence ); //將sequence的值賦給數組seq,保證其穩定性 memset(&my_words, 0, sizeof(WORDS)); memset(&key, 0, sizeof(DBT)); memset(&data, 0, sizeof(DBT)); ret = my_stock->words_dbp->cursor( my_stock->words_dbp, NULL, &cursor_words, 0); print_error(ret); key.data = seq ; key.size = strlen( seq ) +1 ; ret = cursor_words->get( cursor_words, &key, &data, DB_SET_RANGE ) ; print_error( ret ); data.data = &my_words; data.size = sizeof( my_words ); data.ulen = sizeof( WORDS ); data.flags = DB_DBT_USERMEM; ret = cursor_words->get( cursor_words, &key, &data, DB_CURRENT ) ; print_error( ret ); my_words.freq+=1; //改變字頻//數據庫中記錄的關鍵字賦值 key.size = sizeof(my_words.sequence) + 1; key.data = my_words.sequence; //數據庫中記錄的數據項賦值 data.size = sizeof(WORDS); data.data = &(my_words);/* 運用 put 函數將記錄放入 words 數據庫中.*/ ret=cursor_words->put( cursor_words, &key, &data, DB_KEYFIRST ); print_error(ret);}/* 根據同音字起始序列號查找并顯示字庫表記錄 */int get_words_record(STOCK_DBS *my_stock , const char *program_name, FILE *error_file_pointer,char * sequence){ int ret,i; char seq_cp[20]; DBC * cursor_words; DBT key, data; WORDS my_words; char seq[MAXFIELD]; pthread_t th_read; void *retval; strcpy( seq, sequence ); //將sequence的值賦給數組seq,保證其穩定性 printf("seq=%s",seq); printf("character=%s",character); memset(&my_words, 0, sizeof(WORDS)); memset(&key, 0, sizeof(DBT)); memset(&data, 0, sizeof(DBT)); ret = my_stock->words_dbp->cursor( my_stock->words_dbp, NULL, &cursor_words, 0); print_error(ret); // printf("\n***********字庫表*********\n"); key.data = seq ; key.size = strlen( seq ) +1 ; ret = cursor_words->get( cursor_words, &key, &data, DB_SET_RANGE ) ; print_error( ret ); data.data = &my_words; data.size = sizeof( my_words ); data.ulen = sizeof( WORDS ); data.flags = DB_DBT_USERMEM; ret = cursor_words->get( cursor_words, &key, &data, DB_CURRENT ) ; print_error( ret ); display( my_words ); //調用排序函數 for( i=0; i<strlen(seq); i++ ) { if( isdigit (seq[i]) != 0 ) break; seq_cp[i]=seq[i]; }; seq_cp[i] = '\0'; ret = cursor_words->get( cursor_words, &key, &data, DB_NEXT); i=1; while(1) { i++; if ( (strncmp( (char *)key.data, seq_cp, strlen(seq_cp) ) != 0) ||!isdigit( ((char *)key.data)[strlen(seq_cp)]) ) break; key.data = data.data; key.size = strlen(data.data) + 1; data.data = &my_words; data.ulen = sizeof(WORDS); data.flags = DB_DBT_USERMEM; display(my_words); //調用排序函數 if( (ret = cursor_words->get( cursor_words, &key, &data, DB_NEXT)) != 0) break; } printf("\n");//顯示排序后的鏈表 cur = first; while(cur) { printf("character: %s ", cur->character ); printf("\t freq: %d\n", cur->freq ); cur=cur->link; }// 開啟觸摸屏漢字選擇線程 printf("touch selction start\n"); pthread_create(&th_read, NULL, read_th, 0); printf("touch selction over\n"); pthread_join(th_read, &retval); if( cursor_words != NULL) cursor_words->close(cursor_words); return 0;}/* 漢字查詢函數 */int database_get(STOCK_DBS *my_stock , const char *program_name, FILE *error_file_pointer){ int ret; char sequence[MAXLINE]="", syllable[MAXLINE]=""; //觸摸屏輸入查詢查詢// array 為觸摸屏接口參數 ( 聯調觸摸屏程序時要定義全局變量 array 接收字符串 ) get_blind_record( my_stock , program_name , error_file_pointer, array,syllable ); printf( "sta_db:syllable:%s\n",syllable); //sleep(3); get_index_record( my_stock , program_name, error_file_pointer, syllable,sequence ); printf( "words_index_db:sequence:%s\n",sequence); //sleep(3); if ( sequence[0] == '\0') return 0; strcpy(character,""); ret = get_words_record( my_stock , program_name, error_file_pointer , sequence); return ret;}void db_search_touch(char *statistics){ struct cha *ptr; array=statistics; database_get(&my_stock, "database_get", stderr); //調用檢索函數進行 while(first!=NULL) //將查詢后的同音字鏈表清空 { ptr = first; first=first->link; free(ptr); } }int blind_db( char *statistics,char *ime_ret){ int ret, size ; char *basename, *words_index_file, *words_file, *keyboard_file; pthread_t th_a; void *retval; first=NULL; cur=NULL; initialize_stockdbs(&my_stock); basename = "./blind_ime/"; //所有數據庫存放文件 set_db_filenames(&my_stock);/* 打開所有數據庫 */ ret = databases_setup(&my_stock, "databases_setup", stderr); if (ret != 0) { fprintf(stderr, "Error opening databases\n"); return (ret); } /*數據庫搜索*/ db_search_touch(statistics);/* 輸入所得字符串拷貝至ime_ret */ strcpy(ime_ret,character);/* 關閉所有數據庫 */ databases_close(&my_stock); return (0);}#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -