Un problème avec c#

Signaler
Messages postés
12
Date d'inscription
vendredi 25 février 2011
Statut
Membre
Dernière intervention
11 avril 2011
-
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
-
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

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
41
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é. -
Messages postés
12
Date d'inscription
vendredi 25 février 2011
Statut
Membre
Dernière intervention
11 avril 2011

o niveau de cette ligne
binaryval = Convert.ToString(Convert.ToInt64(hexvalue, 16), 2);
Messages postés
12
Date d'inscription
vendredi 25 février 2011
Statut
Membre
Dernière intervention
11 avril 2011

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
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
41
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é. -
Messages postés
12
Date d'inscription
vendredi 25 février 2011
Statut
Membre
Dernière intervention
11 avril 2011

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
Messages postés
12
Date d'inscription
vendredi 25 février 2011
Statut
Membre
Dernière intervention
11 avril 2011

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;
}
}
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
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é
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
41
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é. -
Messages postés
12
Date d'inscription
vendredi 25 février 2011
Statut
Membre
Dernière intervention
11 avril 2011

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
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
ç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 ;)