Connexion
Vous n'avez pas encore de compte personnel ? Vous devriez en créer un. Une fois enregistré vous aurez certains avantages, comme pouvoir modifier l'aspect du site, ou poster des commentaires signés...
Support
Activité du Site

Pages vues depuis 06/01/2019 : 13 006 040

  • Nb. de membres 366
  • Nb. d'articles 2 843
  • Nb. de forums 24
  • Nb. de sujets 13
  • Nb. de critiques 0

Top 10  Statistiques

Index du forum »»  Développement »» Demande d'aide en C - MUI

Demande d'aide en C - MUI#521

3Contributeur(s)
BeWorldrmais96Fab
2 Modérateur(s)
PapiosaurBeWorld
BeWorld BeWorldicon_post
Voila j'ai besoin d'un coup de main. PS: Je débute en C.. alors désolé si c'est bête....

Je souhaite faire une petit console en MUI (rajouter du texte).

Voici le morceau qui nous interesse pour l'interface MUI :

Child, ColGroup(2),
    Child, Label("Console:"),
         Child, ListviewObject, MUIA_Weight, 50, MUIA_Listview_Input, FALSE, MUIA_Listview_List,
               str=FloattextObject, MUIA_Frame, MUIV_Frame_ReadList, MUIA_Background, MUII_ReadListBack,
                  MUIA_Floattext_Text, (ULONG) "Bienvenue !", MUIA_Floattext_TabSize, 2, MUIA_Floattext_Justify, TRUE,
        End, End,
 End,     



Et maintenant la fonction qui permet écrire dans "str" :

VOID PutTextMUI(char *val) {
   // 
   //  ULONG oldvaleur;
   // GetAttr(MUIA_Text_Contents, texte, &oldvaleur);  
   // >> oldvaleur + val....
   //
   SetAttrs(str, MUIA_Floattext_Text, val);
}   



Ca marche mais cela remplace le texte. (j'ai bien essayer avec le GetAttr mais je crois que je me loupe à la suite, récupérer et ajouter du texte dans la chaine....)

Si j'appelle PutTextMUI("\nà toi!"), j'aimerais qu'au final s'affiche dans la console :
Bienvenue !
à toi

2ème question (c'est en c++):
Comment écrire cela correctement (passage dans le paramètre de la fonction):
string coucou="beworld";
PutTextMUI("\nattention "+coucou+"\n");

Merci à vous
IMAC 2.1 / PB 1.5G 17 / PM G5 2.7
My Works
rmais96 rmais96icon_post
En C++, l'opérateur '+' ne donnera pas une chaînes de type char * qu'attend PutTextMUI().
Ne serait-ce pas plutôt :

string coucou("beworld"); 
PutTextMUI(("\nattention "+coucou+"\n").c_str()); 



Tu peux aussi utiliser une fonction de manipulation de chaîne de la libc, comme snprintf :

const char * MakeMessage(const char * UserName)
{
   static char WorkingBuffer[256];
   snprintf(WorkingBuffer, 256, "\nAttention %s\n", UserName);
   return WorkingBuffer;
}

Fab Fabicon_post
Oui, fais attention si tu utilises des types C++ comme string.. Les chaines C classiques sont des char *, donc il faut appeler la méthode c_str() comme RMAIS l'a bien fait remarquer.

Sinon, il manque un TAG_DONE Ã la fin de tes SetAttrs(). Pour les appels qui utilisent des TAGLISTS, il ne faut pas oublier de terminer la liste par un TAG_DONE, sinon ça peut crasher aléatoirement.
BeWorld BeWorldicon_post
ok :-# merci.... je vais tester ca.

Une idée pour MUI (ajouter du texte au lieu de le remplacer) ?

BeWorld
IMAC 2.1 / PB 1.5G 17 / PM G5 2.7
My Works
BeWorld BeWorldicon_post
bon....

J'ai ca :

string path;
string name;
DiskFile::SplitFilename(filename, path, name);
cout << "Loading \"" << name << "\"." << endl;
PutTextMUI(("\nLoading "name".\n").c_str()); 

et quand je compile ca fait ca :

par2repairer.cpp: In method `bool Par2Repairer::LoadPacketsFromFile(basic_string,__default_alloc_template >)':
par2repairer.cpp:293: passing `const char *' as argument 1 of `PutTextMUI(char *)' discards qualifiers
par2repairer.cpp:293: parse error before character 0240
make[1]: *** [par2repairer.o] Error 1

ahah, je sais pas si je vais y arriver.... :paf

J'ai essayer ca : PutTextMUI(name.c_str()); et pareil !
IMAC 2.1 / PB 1.5G 17 / PM G5 2.7
My Works
rmais96 rmais96icon_post
Même problème si tu utilises des string il faut c_str() pour obtenir une chaîne de type char *.
Et il manque le TAG_DONE comme indiqué par Fab.

void AppendTextMUI(char * text)
{
   const char * oldtext;
   GetAttr(MUIA_Floattext_Text, str, (ULONG *) &oldtext);
   {
      string newtext(oldtext);
      newtext += text; 
      SetAttrs(str,  MUIA_Floattext_Text, (ULONG) newtext.c_str(), TAG_DONE);
   }
}


rmais96 rmais96icon_post
c_str() retourne un 'const char *' or PutTextMUI prend un 'char *' et le
compilateur refuse de caster une chaîne constante en une chaîne qui
ne l'est pas.

Tu peux changer ta fonction pour qu'elle prenne un 'const char *' en
paramètre.
BeWorld BeWorldicon_post
ok merci.

J'utilise aussi strcat pour combler le + :)


IMAC 2.1 / PB 1.5G 17 / PM G5 2.7
My Works
Fab Fabicon_post
Puisque le projet est entièrement en C++, autant manipuler des chaines stl (std::string), et quand tu dois les passer à des appels systèmes (MUI ou autre), tu utilises (char *) toto.c_str().

En plus, si tu utilises des chaines C, il faut bien que tu te souviennes qu'il faut allouer la mémoire toi même (stack ou tas), et les gérer correctement (et strcat ne protège pas contre les buffer overflow, par exemple, idem pour strcpy auquel il faut préférer stccpy).
BeWorld BeWorldicon_post
merci du tuyau...

Je me suis attaquer à quelques choses d'un peu trop gros (....) pour débuter, bon c'est pas grave j'ai déjà appris pas mal de truc.
IMAC 2.1 / PB 1.5G 17 / PM G5 2.7
My Works