Problème d'affichage de variables

Signaler
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007
-
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007
-
Voila, j'ai un problème avec mon code, j'ai mis les erreurs signalés par le compilateur en rouge et sur les lignes correspondantes. Je ne sus pas non plus sûr que mo MessageBox fonctionne correctement. Si quelqu'un veux bien jeter un coup d'œil à mon code :







VOID NotificationControle(HWND hWnd,UINT message,WPARAM wParam, LPARAM lParam)

{

UINT iId=LOWORD(wParam);

UINT iCode=HIWORD(wParam);

HWND hCtl=(HWND)lParam;

if(iId==ID_B_ANALYSE)

{

CHAR contig[4000];

CHAR MasqueMin[16];

CHAR TriValue[16];

CHAR Tri_MinMax;

GetWindowText(DomaineBox, contig, 4000);

GetWindowText(MasqueMinimumBox, MasqueMin, 16);

GetWindowText(TriOrderBox, TriValue, 16);

if(TriValue=="Min -> Max")

Tri_MinMax=true;

if(TriValue=="Max -> Min")

Tri_MinMax=false;

else Tri_MinMax=true;

int base_pivot = 0;
// Sera utile plus tard.

int masque = 8;
// Sera utile plus tard.

long contig_size = contig.length();

// Erreur : 164 AnalyseurADN.cpp request for member `length' in `contig', which is of non-class type `CHAR[4000]'

int T_total = 0;

int C_total = 0;

int A_total = 0;

int G_total = 0;

for (int i = 0; i < contig.length(); i++)

// Erreur : 171 AnalyseurADN.cpp request for member `length' in `contig', which is of non-class type `CHAR[4000]'

{

switch(contig[i])

{

case 'T':

T_total++;

break;

case 'C':

C_total++;

break;

case 'A':

A_total++;

break;

case 'G':

G_total++;

break;

}

}

char message[40]={0};

strncat(message, "Longueur du domaine : ", 40);

strncat(message, contig_size, 40);

// Erreur : 192 AnalyseurADN.cpp invalid conversion from `long int' to `const char*'
192 AnalyseurADN.cpp initializing argument 2 of `char* strncat(char*, const char*, size_t)'

strncat(message, " nucléotides.", 40);

MessageBox(hWnd, message, "CHAR_COUNT", MB_OK);

}

}

20 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
C'est agréable comme post, c'est bien présenté :)

Par contre, je sais pas d'ou tu sors une telle fonction:
long contig_size = contig.length();

Un tableau n'a jamais eu de méthodes. Par contre, tu peux récupérer la taille d'un tableau alloué sur la pile ( Uniquement !!! ) de la façon suivante:

int tab[10];
int longueur = sizeof(tab)/sizeof(int);

Ici longueur vaut 40/4 = 10 (en supposant qu'un entier est sur 4 octet)

Alors que:

int * tab = new int[10];
sizeof(tab) = 4 (ou 8) et non 40 !

Pour ton autre erreur, tu respectes pas le typage, donc ca peut pas aller.
strncat(message, contig_size, 40); <= jusqu'à maintenant, un entier EST un entier, et pas une chaine de caractère.

Pour transformer ton entier en chaine, regardes sur le forum, c'est posé chaque semaine cette question.
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

Luthor a écrit :,

----

<table bgcolor="#FFE4A2" border="1" title="Citation">
----,
Par contre, je sais pas d'ou tu sors une telle fonction:

long contig_size = contig.length();
</td>

</td>
</tr>
<tr>
<td>


Eh bien, en réalité, je souhaite inclure dans mon programme WinAPI le code de ce programme (donc y ajouter la même fonctionnalité) :




</td>
</tr>
<tr>
<td>
BASE_COUNT.CPP :


#include

#include <string>

using namespace std;

int main ()

{

std::string contig;

int base_pivot = 0; </string>
// Sera utile plus tard.

int masque = 8;
// Sera utile plus tard.

cin >> contig;

long nbchar = contig.length();

int T_total = 0;

int C_total = 0;

int A_total = 0;

int G_total = 0;

for (int i = 0; i < contig.length(); i++)

{

switch(contig[i])

{

case 'T':

T_total++;

break;

case 'C':

C_total++;

break;

case 'A':

A_total++;

break;

case 'G':

G_total++;

break;

}

}

cout <<"Domaine :\n"<<contig<<"\n\n\

Total : "<<nbchar<<"\n\

T : "<<T_total<<"\n\

C : "<<C_total<<"\n\

A : "<
// Programme non terminé.

int end;

cin>>end;

}




Comme tu peut le constater, .length() existe bel et bien, et sert à compter le nombre total de caractètres dans une chaîne, contig en l'occurence. Je ne comprend pas pourquoi elle ne fonctionne pas ici…


Pour la convertion des entiers en chaîne, j'ai beau chercher, je ne vois pas de message sur le forum traitant de ce sujet. ^^'

Qu'elqu'un peut éclairer ma lanterne ?
</td>
</tr>
</table>
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

*Quelqu'un
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
Tu confonds C et C++...

lenght() est une fonction membre de la classe c++ "string"....

Ors dans ton code, tu semble utiliser un bon vieux tableau C...

Faut pas mélanger les pommes et les poires....
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
On peut parfois donner raison à ceux qui recommande fortement de pas toucher au C++ pour débuter, puisque ca génère des catastrophes ...

Donc en C, pour convertir un entier en une chaine, tu tapes "C sprintf" dans google.

ex: http://grungie.code511.com/C/lesson3_fr.html
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

Ce que je ne comprend pas, c'est que <tt>CHAR contig[4000];</tt> ne déclare pas un entier, mil s'agis déjà d'une chaîne de caractères, non ?

En faite, je souhaite récupérer le texte entré dans l'EDIT "DomaineBox" – <tt>GetWindowText(DomaineBox, contig, 4000);</tt> –, texte pouvant atteindre une longueur de 4000 caractères.

Ensuite, je souhaîte compter le nombre total de caractères – <tt>long contig_size = contig.length();</tt> –, puis compte le nombre de 'T', 'C', 'A', et 'G'.
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

Ce que je ne comprend pas, c'est que <tt>CHAR contig[4000];</tt> ne déclare pas un entier, mil s'agis déjà d'une chaîne de caractères, non ?

En faite, je souhaite récupérer le texte entré dans l'EDIT "DomaineBox" – <tt>GetWindowText(DomaineBox, contig, 4000);</tt> –, texte pouvant atteindre une longueur de 4000 caractères.

Ensuite, je souhaîte compter le nombre total de caractères – <tt>long contig_size = contig.length();</tt> –, puis compte le nombre de 'T', 'C', 'A', et 'G'.
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

Ce que je ne comprend pas, c'est que <tt>CHAR contig[4000];</tt> ne déclare pas un entier, mil s'agis déjà d'une chaîne de caractères, non ?

En faite, je souhaite récupérer le texte entré dans l'EDIT "DomaineBox" – <tt>GetWindowText(DomaineBox, contig, 4000);</tt> –, texte pouvant atteindre une longueur de 4000 caractères.

Ensuite, je souhaîte compter le nombre total de caractères – <tt>long contig_size = contig.length();</tt> –, puis compte le nombre de 'T', 'C', 'A', et 'G'.
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

Oh non, j'ai cliqué trois fois. xD
Vive les forums où l'on peut supprimer ses propres messages. xD
Désolé.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
char config[4000]; <= n'est pas une chaine, mais un tableau d'octet dans lequel on peut stocker une chaine de caractère.

std::string <= c'est une classe de la STL qui gère les chaines de caractère et propose un ensemble de fonction sur ces chaines.
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

<tt>std::string contig;</tt> me donne les erreurs suivantes :

<table bgcolor= "#C9FFA2" border="1" title="Erreurs rapportés par Dev-C++">
----,
AnalyseurADN.cpp In function `void NotificationControle(HWND__*, UINT, WPARAM, LPARAM)':

147 AnalyseurADN.cpp `string' is not a member of `std'

147 AnalyseurADN.cpp expected `;' before \"contig\"

152 AnalyseurADN.cpp `contig' undeclared (first use this function)

(Each undeclared identifier is reported only once for each function it appears in.)

195 AnalyseurADN.cpp invalid conversion from `long int' to `const char*'

195 AnalyseurADN.cpp initializing argument 2 of `char* strncat(char*, const char*, size_t)'

</td>





Luthor a écrit :
</td>
</tr>
<tr>
<td>
char config[4000]; < = n'est pas une chaine, mais un tableau d'octet dans lequel on peut stocker une chaine de caractère.



C'est "contig", et non "config".


Bon, je vais vous passer mon code complet :

<center>AnalyseurADN.cpp</center>


</td>
</tr>
</table>
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
#include <string> en entete de ton fichier.
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

Ah oui, retirer le ".h" a résolu certains problèmes, mais pas tous.

<table align="center" bgcolor="#C9F4FF" width="500px" border="1" title="Code">
----,

std::string contig;

CHAR MasqueMin[16];

CHAR TriValue[16];

CHAR Tri_MinMax;

GetWindowText(DomaineBox, contig, 4000);

GetWindowText(MasqueMinimumBox, MasqueMin, 16);

GetWindowText(TriOrderBox, TriValue, 16);

</td>





Liste des erreurs :
</td>
</tr>
<tr>
<td>

AnalyseurADN.cpp In function `void NotificationControle(HWND__*, UINT, WPARAM, LPARAM)':

154 AnalyseurADN.cpp cannot convert `std::string' to `CHAR*' for argument `2' to `int GetWindowTextA(HWND__*, CHAR*, int)'

195 AnalyseurADN.cpp invalid conversion from `long int' to `const char*'

195 AnalyseurADN.cpp initializing argument 2 of `char* strncat(char*, const char*, size_t)'




</td>
</tr>
</table>
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
La prog c'est pas de la cuisine, faut etre rigoureux au niveau des types.
un "std::string" c'est pas un "char*", or la fonction GetWindowText prend un "char*" en second argument.

Faut utiliser la fonction c_str() de la classe string pour récupérer une chaine terminée par \0.
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

On me signal que `<tt>c_str</tt>' n'a pas été déclaré. :/
Pourquoi faut il déclarer une fonction ? J'ai pourtant bien inclus <string>. =/
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Comment l'utilises tu ?
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

<table align= "center" bgcolor="#C9F4FF" width="500px" border="1" title="Code">
----,

if(iId==ID_B_ANALYSE)
{

std::string contig;

CHAR MasqueMin[16];

CHAR TriValue[16];

CHAR Tri_MinMax;

c_str(DomaineBox, contig, 4000);

GetWindowText(MasqueMinimumBox, MasqueMin, 16);

GetWindowText(TriOrderBox, TriValue, 16);

if(TriValue == \"Min -> Max\")

Tri_MinMax=true;

if(TriValue == \"Max -> Min\")

Tri_MinMax=false;

else Tri_MinMax =true;

int base_pivot = 0;

// Sera utile plus tard.

int masque = 8;

// Sera utile plus tard.

long contig_size = contig.length();

</td>





Sinon, par quoi pourrais-je remplacer "<tt>CHAR MasqueMin[16];</tt>" et "<tt>GetWindowText(MasqueMinimumBox, MasqueMin, 16);</tt>" pour obtenir un nombre (sans signe ni virgule) ? Une sorte de "GetWindowsNumber", quoi.
</td>
</tr>
</table>
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Sans vouloir etre méchant, si j'étais a ta place, je supporterais pas de faire une erreur a chaque ligne que j'écris. Donc a mon avis, la meilleur chose a faire pour toi, c'est de lire un peu de documentation.

Car meme si t'en es pas convaincu, ca va te faire gagner un temps fou.

Juste pour l'info. La fonction length fait parti de std::string, au meme titre que c_str(), donc c_str() s'utilise de la meme facon que

GetWindowText(DomaineBox, contig.c_str(), 4000);
GetWindowText(MasqueMinimumBox, MasqueMin, 16);

Enfin pour finir, non seulement ca te fera gagner du temps de prendre juste un peu de temps pour apprendre et comprendre la base du langage, et perso, (je suppose que je suis pas le seul), on est pas la pour t'apprendre a programmer. Donc répondre a ce genre de pb, ca me sool un peu.

Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

Sans doute, désolé. =o

J'ai réussis à régler le problème de conversion CHAR* -> const Char*, il fallait utiliser <tt>sprintf</tt>. Merci de ton aide.


Toutefois, il me reste un problème d'une toute autre nature : ma MessageBox ne s'affiche pas lorsque je clique sur le bouton ID_B_ANALYSE. J'ai cherché, comparé avec d'autre codes, mais je ne voie pas d'où vient le problème…

AnalyseurADN.cpp (disponible 24h).


Es-ce que quelque un voit d'où cela pourrait provenir ?
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

C'est réglé.