Un problème avec c#

amzerd Messages postés 12 Date d'inscription vendredi 25 février 2011 Statut Membre Dernière intervention 11 avril 2011 - 7 mars 2011 à 15:21
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 - 9 mars 2011 à 09:26
bonjour
je suis débutans en c# j'ai rencontre plusieurs problème et parmis c problème une erreur quand je compile mon prog
l'erreur est :
L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
Nom du paramètre : startIndex
voila mon programe :
public string HexaChar { get; set; }

//Constructor
public ClassReceive()
{
HexaChar = "0123456789ABCDEF";
}

// remove non-hexadecimal characters
public string RemoveNonHexa(string StrToTest)
{
string result = "";
string charToTest = "";
int index = 0;
StrToTest = StrToTest.ToUpper();
for (index = 0; index < StrToTest.Length; index++)
{
charToTest = StrToTest.Substring(index, 1);
if (HexaChar.Contains(charToTest))
{
result = result + charToTest;
}
}
return result;
}

public string hex2binary(string hexvalue)
{

StringBuilder sb = new StringBuilder();
string binaryval = "";
//if (hexvalue != "")
//{
binaryval = Convert.ToString(Convert.ToInt64(hexvalue, 16), 2);
long AMz = Convert.ToInt64(binaryval);
sb.Append(AMz.ToString("D32"));
return sb.ToString();
// }

aidez moi svp

10 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
8 mars 2011 à 14:25
Salut

Quelle ligne t'indique-t-il lors de l'erreur ?
Avec quelle valeur en paramètre ?

Chez mon ton programme fonctionne (il est très limité par la taille de l'Int64, mais il fonctionne).

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
amzerd Messages postés 12 Date d'inscription vendredi 25 février 2011 Statut Membre Dernière intervention 11 avril 2011
8 mars 2011 à 14:29
o niveau de cette ligne
binaryval = Convert.ToString(Convert.ToInt64(hexvalue, 16), 2);
0
amzerd Messages postés 12 Date d'inscription vendredi 25 février 2011 Statut Membre Dernière intervention 11 avril 2011
8 mars 2011 à 14:33
l'idée de mon programe c'est que je recois une trame je sup ts se ki né pas hexa é apré je fé une conversion en binaireeeeee
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
8 mars 2011 à 15:08
Quand, pour t'aider, on te pose plusieurs questions, merci de répondre à TOUTES.

Avec quelle valeur en paramètre ?

Car je te rappelle que ton programme fonctionne chez moi. Or vu que la seule différence entre nos deux programmes, c'est le paramètre avec lequel tu appelles la fonction...

PS : Merci de faire attention à ton orthographe et de ne pas écrire en SMS, car c'est vraiment insupportable de lire des message comme ton dernier !

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
amzerd Messages postés 12 Date d'inscription vendredi 25 février 2011 Statut Membre Dernière intervention 11 avril 2011
8 mars 2011 à 15:56
j'ai pas compris ce que tu voulasi dire avec paramètre???
je sais que le programme marche
je recois cette erreur si je rentre un caractère non hexa
exemple si je rentre KKKK
je recois le message d'erreur
0
amzerd Messages postés 12 Date d'inscription vendredi 25 février 2011 Statut Membre Dernière intervention 11 avril 2011
8 mars 2011 à 16:00
et voila le code que j'ai mis dans ma windowsform
private void textBox_Registre_derreurs_TextChanged(object sender, EventArgs e)
{
/*if (textBox_Registre_derreurs != null)
{
return ;
}*/


ClassTreatment objClassTreatment = new ClassTreatment();



string StrToTest;
StrToTest = textBox_Registre_derreurs.Text;
string StrToConvert;
StrToConvert = objClassTreatment.RemoveNonHexa(StrToTest);
StringBuilder StrToDisplay;
StrToDisplay = objClassTreatment.hex2binary(StrToConvert);
textBox_Display_Conversion_registre_derreurs.Text = StrToDisplay.ToString();
string data = StrToDisplay.ToString();

label_BIt0.Text = " " + data.ElementAt(31).ToString();
label_Bit1.Text = " " + data.ElementAt(30).ToString();
label_Bit2.Text = " " + data.ElementAt(29).ToString();
label_Bit3.Text = " " + data.ElementAt(28).ToString();
label_Bit4.Text = " " + data.ElementAt(27).ToString();
label_Bit5.Text = " " + data.ElementAt(26).ToString();
label_Bit6.Text = " " + data.ElementAt(25).ToString();
label_Bit7.Text = " " + data.ElementAt(24).ToString();
label_Bit8.Text = " " + data.ElementAt(23).ToString();
label_Bit9.Text = " " + data.ElementAt(22).ToString();
label_Bit10.Text = " " + data.ElementAt(20).ToString();
label_Bit11.Text = " " + data.ElementAt(19).ToString();
label_Bit12.Text = " " + data.ElementAt(18).ToString();




if (data.ElementAt(31).ToString() == "1")
{
label_A.ForeColor = Color.Red;
}

else
{
label_A.ForeColor = Color.Black;
}

if (data.ElementAt(30).ToString() == "1")
{
label_B.ForeColor = Color.Red;
}
else
{
label_B.ForeColor = Color.Black;
}
if (data.ElementAt(29).ToString() == "1")
{
label_C.ForeColor = Color.Red;
}
else
{
label_C.ForeColor = Color.Black;
}
if (data.ElementAt(28).ToString() == "1")
{
label_D.ForeColor = Color.Red;
}
else
{
label_D.ForeColor = Color.Black;
}
if (data.ElementAt(27).ToString() == "1")
{
label_E.ForeColor = Color.Red;
}
else
{
label_E.ForeColor = Color.Black;
}
if (data.ElementAt(26).ToString() == "1")
{
label_F.ForeColor = Color.Red;
}
else
{
label_F.ForeColor = Color.Black;
}
if (data.ElementAt(25).ToString() == "1")
{
label_G.ForeColor = Color.Red;
}
else
{
label_G.ForeColor = Color.Black;
}
if (data.ElementAt(24).ToString() == "1")
{
label_H.ForeColor = Color.Red;
}
else
{
label_H.ForeColor = Color.Black;
}
if (data.ElementAt(23).ToString() == "1")
{
label_I.ForeColor = Color.Red;
}
else
{
label_I.ForeColor = Color.Black;
}
if (data.ElementAt(22).ToString() == "1")
{
label_J.ForeColor = Color.Red;
}
else
{
label_J.ForeColor = Color.Black;
}
if (data.ElementAt(21).ToString() == "1")
{
label_K.ForeColor = Color.Red;
}
else
{
label_K.ForeColor = Color.Black;
}
if (data.ElementAt(20).ToString() == "1")
{
label_L.ForeColor = Color.Red;
}
else
{
label_L.ForeColor = Color.Black;
}
if (data.ElementAt(19).ToString() == "1")
{
label_M.ForeColor = Color.Red;
}
else
{
label_M.ForeColor = Color.Black;
}
if (data.ElementAt(18).ToString() == "1")
{
label_N.ForeColor = Color.Red;
}
else
{
label_N.ForeColor = Color.Black;
}
}
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
8 mars 2011 à 16:29
Salut, je dirais que ton souci apparaît lorsque tu n'as aucun "caractère hexa". Du coup ta première fonction renvoie une chaîne vide et Convert.ToInt64("", 16) lève l'Exception qui colle à ton erreur.

Tu t'en doutais certainement vu qu'il y a un test (commenté, pourquoi ?) sur le param hexvalue dans ta fonction hex2binary

Pour conclure, il devrait suffir de rajouter cette ligne au début de ta fonction hex2binary :
if (hexvalue == "") return "";


Ah, et dans le cas où tu voudrais "blinder" le code, je rajouterai qu'il vaudrait mieux que hex2binary fasse l'appel à RemoveNonHexa, plutôt que traiter ta chaîne en amont, ça évitera de tester si elle est au bon format.

En espérant avoir aidé
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
8 mars 2011 à 17:03
Un paramètre, ou argument, est une valeur que tu transmets à une fonction/méthode lors de l'appel.
En l'occurrence, le string avec lequel tu appelles ta fonction hex2binary().
Donc comme tu l'as dit : "KKKK".

De plus, tu dis toi-même que tu sais que ton programme marche. Donc l'erreur n'est pas à la compilation, contrairement à ce que tu disais dans ton premier message.

Et effectivement, ton problème vient du fait que ta chaîne est vide, il ne peut donc pas la convertir en Int64.
La correction de Jopop suffira à éviter ton problème.

Et comme il dit, tu as commenté le code qui corrigeait ton problème. Je suppose que c'est parce que tu as vu que ça ne compilait pas si tu enlevais les commentaires, mais tu n'as pas dû regarder pourquoi. La raison est toute simple : c'est que dans ce cas la méthode pourrait ne rien retourner. Un simple return ""; ou return null; à la fin de ta méthode aurait suffit.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
amzerd Messages postés 12 Date d'inscription vendredi 25 février 2011 Statut Membre Dernière intervention 11 avril 2011
9 mars 2011 à 09:01
j'ai ajouter ce que m'as dit Jopop mais j'ai renconter un autre problème c'est

Erreur 1 Impossible de convertir implicitement le type 'string' en 'System.Text.StringBuilder'
o niveau de la ligneee
return"";
je pense que mon programme n'est pas structurer é je pense que je doit utiliser un string o lieu d'un
StringBuilder
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
9 mars 2011 à 09:26
ça s'est tout bête, tu devrais pouvoir trouver par toi-même ... ou alors t'es pas rendu pour le reste de ton code ^^

Tu dois avoir une fonction du genre :
public string mafonction() {
StringBuilder sb = new StringBuilder();
[..]
return sb;
}


Or un StringBuilder n'est pas une string.
Il faut donc faire la conversion, toute simple :
return sb.ToString();


Vu que tes questions sont sur des problèmes "de base", tu devrais revoir un peu tes cours/tuto, ça sera autrement plus simple pour toi. Là, c'est comme essayer de passer l'examen du code de la route sans avoir lu le Code Rousseau ;)
0
Rejoignez-nous