📄 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[MAXFIELD]; DBC * cursor_words; DBT key, data; WORDS my_words; char seq[MAXFIELD]; 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 = strlen(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 + -