openMotif和C编程问题将字符串传输到对话框小部件

openMotif和C编程问题将字符串传输到对话框小部件,c,string,motif,C,String,Motif,我的代码有问题。目标是显示在词典中找到的单词(加载到列表中)并返回翻译。除了对话框中显示的字符串只是显示了一种奇怪的编码,而不是我希望他显示的单词之外,一切都正常。在终端中,程序工作正常,但我认为问题是要以正确的方式为Xm_字符串编码字符串。这是我的密码: //gcc promt3.c -o promt3 -Wall -L/usr/X11R6/lib -lX11 -lXm #include <Xm/Xm.h> #include <Xm/Text.h> #include

我的代码有问题。目标是显示在词典中找到的单词(加载到列表中)并返回翻译。除了对话框中显示的字符串只是显示了一种奇怪的编码,而不是我希望他显示的单词之外,一切都正常。在终端中,程序工作正常,但我认为问题是要以正确的方式为Xm_字符串编码字符串。这是我的密码:

//gcc promt3.c -o promt3 -Wall -L/usr/X11R6/lib -lX11 -lXm

#include <Xm/Xm.h>
#include <Xm/Text.h>
#include <Xm/MainW.h>
#include <Xm/CascadeB.h>
#include <Xm/MessageB.h>
#include <Xm/PushB.h>
#include <Xm/SelectioB.h>
#include <Xm/RowColumn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void prompt_pop_up(Widget W, XtPointer Ev, XtPointer client);

void prompt_activate(Widget W, XtPointer Ev, XtPointer client);
void quit_activate(Widget dialog);

Widget top_wid;

enum {
    MaxLigne = 100, MaxMot = 30, MAX = 7876,
};

struct liste {
    /* lignes du fichier */
    char LIGNE[MaxLigne];

    /* cdr */
    struct liste *cdr;
};
struct liste * ajouter(struct liste * dico, char valeur);
char * rechercher(struct liste *dico, char * recherche);
void decouper(char * ligne, char * separ, char * mot[], int maxmot);

char ligne[MaxLigne];
int i = 0;
char ligne3[MaxLigne];
struct liste * francais = NULL;

void quit_call(Widget W, XtPointer Ev, XtPointer client) {
    printf("Quitting program\n");
    exit(0);
}

int main(int argc, char *argv[])

{

    //preparation du dictionnaire:

    FILE * fichier1 = fopen("dico.tab", "r");
    if (fichier1 == NULL) {
        printf("erreur fichier");
    }
    int k;
    for (k = 0; k < MAX; k++) {
        struct liste * nouveau = malloc(sizeof(*nouveau));

        if (nouveau != NULL) {
            fgets(nouveau->LIGNE, sizeof ligne, fichier1);
            nouveau->cdr = NULL;
            if (francais->LIGNE == NULL) {
                francais = nouveau;
            } else {
                struct liste * p = francais;
                while (p->cdr != NULL) {
                    p = p->cdr;
                }
                p->cdr = nouveau;
            }
        }
        i++;
    }
    printf("Le dictionnaire contient %i entrées\n", i);
    fclose(fichier1);

    XtAppContext app;
    Widget main_w, menu_bar, prompt;

    top_wid = XtVaAppInitialize(&app, "Demos", NULL, 0, &argc, argv, NULL, NULL);

    main_w = XtVaCreateManagedWidget("main_window", xmMainWindowWidgetClass,
            top_wid, XmNheight, 300, XmNwidth, 300, NULL);

    menu_bar = XmCreateMenuBar(main_w, "main_list", NULL, 0);
    XtManageChild(menu_bar);

    /* widget chercher */
    prompt = XtVaCreateManagedWidget("Chercher", xmCascadeButtonWidgetClass,
            menu_bar, XmNmnemonic, 'P', NULL);

    /* callback de chercher */
    XtAddCallback(prompt, XmNactivateCallback, prompt_pop_up, NULL);

    /* pour fermer */

    Widget quit = XtVaCreateManagedWidget("Fermer", xmCascadeButtonWidgetClass,
            menu_bar, NULL);
    XtAddCallback(quit, XmNactivateCallback, quit_call, NULL);

    XtRealizeWidget(top_wid);
    XtAppMainLoop(app);

    return 0;
}

void prompt_pop_up(Widget W, XtPointer Ev, XtPointer client)

{
    Widget dialog;
    Widget effacer1, effacer2;
    XmString xm_string1;

    //structure pour receuillir les données envoyées par le widget
    Arg args[2];

    /* label du dialogue */
    xm_string1 = XmStringCreateLocalized("Entrez le mot a chercher:");
    XtSetArg(args[0], XmNselectionLabelString, xm_string1);

    XtSetArg(args[1], XmNtextString, xm_string1);

    /* Create the WarningDialog */
    dialog = XmCreatePromptDialog(W, "Recherche", args, 3);

    XmStringFree(xm_string1);
    //XmStringFree(xm_string2);


    XtAddCallback(dialog, XmNokCallback, prompt_activate, NULL);

    /*pour effacer les boutons inutiles, par defaut PromtDialog contient 3 boutons: OK, CANCEL, HELP*/
    effacer1 = XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON);
    XtUnmanageChild(effacer1);

    effacer2 = XmSelectionBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON);
    XtUnmanageChild(effacer2);

    XtManageChild(dialog);
    XtPopup(XtParent(dialog), XtGrabNone);
}

/* fonction de recherche */

void prompt_activate(Widget W, XtPointer Ev, XtPointer client)

{
    Widget dialog, effacer1, effacer2;
    Arg args[2];
    XmString xm_string, xm_string2;
    //structure pour receuillir les données envoyée par le widget
    XmSelectionBoxCallbackStruct *cbs = (XmSelectionBoxCallbackStruct *) client;

    xm_string = XmStringCreateLocalized("");

    //concatenation de la chaine à rechercher
    xm_string = XmStringConcat(xm_string, cbs->value);

    //la fonction XmStringUnparse permet d'obtenir la chaine contenue dans XmString
    String x = XmStringUnparse(xm_string, NULL, 0, XmCHARSET_TEXT, NULL, 0,
            XmOUTPUT_ALL);

    printf("valeur : %s\n", x); //pour verifier ce qu'elle renvoie --->OK

    char * ligne2 = malloc(MaxMot);

    //on cherche à obtenir la ligne qui nous intéresse, si on l'obtient on imprime les mots qui nous interesent
    ligne2 = rechercher(francais, x);

    if (ligne2 != NULL) {
        char ligne5[MaxLigne];
        char * ligne6[MaxLigne];
        char * mot1[MaxMot];
        char * mot2[MaxMot];
        strcpy(ligne5, ligne2);

        decouper(ligne5, "\n-", ligne6, MaxLigne);
        decouper(ligne6[0], "\t[]", mot1, MaxMot);
        decouper(ligne6[1], "[]", mot2, MaxMot);

        //supprimer le premier espace
        strcpy(mot2[0], mot2[0] + 1);

        //mot2[0] est le mot qu'on recherche
        xm_string2 = XmStringCreateLocalized(mot2[0]);
        //xm_string2 = XmStringConcat(xm_string2,mot2[0]);

        printf("%s,  %s se traduit par: %s, %s\n", x, mot1[1], mot2[0], mot2[1]);

    } else {
        printf("Le mot %s n'est pas dans le dictionnaire\n", x);
        xm_string2 = XmStringCreateLocalized("Mot pas trouve");
    }
    //XtSetArg(args[0], XmNmessageString, xm_string);
    XtSetArg(args[0], XmNmessageString, xm_string2);
    /* bouton OK */XtSetArg(args[1], XmNdefaultButtonType,
            XmDIALOG_OK_BUTTON);

    /* dialogue pour renvoyer la chaine trouvée */
    dialog = XmCreateInformationDialog(top_wid, "Resultat", args, 2);

    /*pour enlever les boutons inutiles, par defaut PromtDialog contient 3 boutons: OK, CANCEL, HELP*/
    effacer1 = XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON);

    effacer2 = XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON);
    XtUnmanageChild(effacer2);
    XtUnmanageChild(effacer1);
    free(x);
    free(xm_string);
    free(xm_string2);
    XtManageChild(dialog);
    XtPopup(XtParent(dialog), XtGrabNone);

}

char * rechercher(struct liste *dico, char * recherche) {
    int k;
    struct liste *p = dico;
    char ligne4[MaxLigne];
    strcpy(ligne4, recherche);
    for (k = 0; k < i; k++) {
        int v = strlen(recherche);
        strcpy(ligne3, p->LIGNE);
        if (strncmp(ligne3, recherche, v) == 0) {
            return ligne3;

        } else {
            p = p->cdr;
        }
    }
    return NULL;
}

void decouper(char * ligne, char * separ, char * mot[], int maxmot) {
    int i;

    mot[0] = strtok(ligne, separ);
    for (i = 1; mot[i - 1] != 0; i++) {
        if (i == maxmot) {
            fprintf(stderr, "Erreur dans la fonction decouper: trop de mots\n");
            mot[i - 1] = 0;
        }
        mot[i] = strtok(NULL, separ);
    }
}
//gcc promt3.c-o promt3-Wall-L/usr/X11R6/lib-lX11-lXm
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效提示弹出窗口(小部件W、XtPointer Ev、XtPointer客户端);
无效提示_激活(小部件W、XtPointer Ev、XtPointer客户端);
无效退出\激活(小部件对话框);
小部件顶部宽度;
枚举{
MaxLigne=100,MaxMot=30,MAX=7876,
};
结构列表{
/*菲舍尔路线*/
半木质素[最大木质素];
/*cdr*/
结构列表*cdr;
};
struct liste*ajouter(struct liste*dico,char valeur);
char*rechercher(struct liste*dico,char*recherche);
void decouper(char*ligne,char*separ,char*mot[],int-maxmot);
半木质素[最大木质素];
int i=0;
半木质素3[MaxLigne];
struct liste*francais=NULL;
void quit_调用(小部件W、XtPointer Ev、XtPointer客户端){
printf(“退出程序”);
出口(0);
}
int main(int argc,char*argv[])
{
//语言准备:
文件*fichier1=fopen(“dico.tab”,“r”);
if(fichier1==NULL){
printf(“erreur fichier”);
}
int k;
对于(k=0;k木质素、木质素尺寸、菲舍尔1);
nouveau->cdr=NULL;
如果(法语->木质==NULL){
法语=新潮;
}否则{
struct liste*p=法语;
而(p->cdr!=NULL){
p=p->cdr;
}
p->cdr=新潮;
}
}
i++;
}
printf(“语言连续%i entrées\n”,i);
fclose(fichier1);
XtAppContext应用程序;
小部件主窗口、菜单栏、提示;
top_wid=XtVaAppInitialize(&app,“Demos”,NULL,0,&argc,argv,NULL,NULL);
main_w=XtVaCreateManagedWidget(“主窗口”,xmMainWindowWidgetClass,
顶部宽度,XmNheight,300,XmNwidth,300,NULL);
菜单栏=XmCreateMenuBar(主菜单,“主菜单列表”,NULL,0);
XtManageChild(菜单栏);
/*小部件切赫*/
prompt=XtVaCreateManagedWidget(“Chercher”,xmCascadeButtonWidgetClass,
菜单栏,XmNmnemonic,'P',NULL);
/*切赫酒店*/
XtAddCallback(提示,XmNactivateCallback,提示弹出,空);
/*倒酒*/
Widget quit=XtVaCreateManagedWidget(“Fermer”,xmCascadeButtonWidgetClass,
菜单栏,空);
XtAddCallback(quit,XmNactivateCallback,quit_call,NULL);
XtRealizeWidget(顶部宽度);
XtAppMainLoop(app);
返回0;
}
无效提示弹出窗口(小部件W、XtPointer Ev、XtPointer客户端)
{
窗口小部件对话框;
小工具effacer1、effacer2;
XmString xm_string1;
//结构倾倒
Arg-args[2];
/*对话标签*/
xm_string1=XmStringCreateLocalized(“Entrez le mot a chercher:”);
XtSetArg(args[0],XmNselectionLabelString,xm_string1);
XtSetArg(args[1],XmNtextString,xm_string1);
/*创建警告对话框*/
dialog=XmCreatePromptDialog(W,“Recherche”,args,3);
XmStringFree(xm_string1);
//XmStringFree(xm_string2);
XtAddCallback(对话框,XmNokCallback,提示激活,空);
(3):取消,帮助*
effacer1=XmSelectionBoxGetChild(对话框,XmDIALOG\u帮助\u按钮);
XtUnmanageChild(effacer1);
effacer2=XmSelectionBoxGetChild(对话框,XmDIALOG\u取消按钮);
XtUnmanageChild(effacer2);
XtManageChild(对话框);
XtPopup(XtParent(对话框),XtGrabNone);
}
/*里切赫基金会*/
无效提示\激活(小部件W、XtPointer Ev、XtPointer客户端)
{
小部件对话框,effacer1,effacer2;
Arg-args[2];
XmString xm_string,xm_string2;
//结构倾倒
XmSelectionBoxCallbackStruct*cbs=(XmSelectionBoxCallbackStruct*)客户端;
xm_string=XmStringCreateLocalized(“”);
//链连接法
xm_string=XmStringConcat(xm_string,cbs->value);
//XmString的作用是在XmString的上下文中对其进行分析
字符串x=XmStringUnparse(xm_字符串,NULL,0,XmCHARSET_文本,NULL,0,
XMU输出(全部);
printf(“valeur:%s\n”,x);//浇注验证器ce qu'elle renvoie-->OK
char*ligne2=malloc(MaxMot);
//在《情书》中,我对《情书》中的即兴格言感到兴趣
ligne2=rechercher(法语,x);
如果(ligne2!=NULL){
半木质素5[MaxLigne];
char*ligne6[MaxLigne];
char*mot1[MaxMot];
char*mot2[MaxMot];
strcpy(ligne5,ligne2);
退超(ligne5,“\n-”,ligne6,MaxLigne);
退超(ligne6[0],“\t[]”,mot1,MaxMot);
退超(ligne6[1],“[]”,mot2,MaxMot);
//埃斯佩斯总理酒店
strcpy(mot2[0],mot2[0]+1);
//莫特2[0]这是一个很好的例子
xm_string2=XmStringCreateLocalized(mot2[0]);
//xm_string2=XmStringConcat(xm_string2,mot2[0]);
printf(“%s,%s-se-traduit par:%s,%s\n”,x,mot1[1],mot2[0],mot2[1]);
}否则{
printf(“该词不适用于其他词语”,x);
xm_string2=XmStringCreateLocalized(“Mot pas trouve”);
}
//XtSetArg(args[0],xmn消息传递,xm_字符串);
XtSetArg(args[0],xmn消息传递,xm_string2);
/*bouton OK*/XtSetArg(args[1],xmndefaultbuttonype,
XmDIA