C Sharp - Variablen Wert splitten und dann damit rechnen
Hallo,
Es geht hier um die Programmiersprache "C#"
eines mal vorweg, im Bereich Programmieren habe ich 0 Erfahrung.
Überblick:
Ich bekomme über eine Serielle Schnittstelle Werte übergeben.
Diese Werte sehen immer wie folgt aus (301, 220, 117, ...)
Was brauche ich:
Beispiel es wird die Zahl 301 übertragen,
dann möchte ich eine Variable mit dem Wert "3"
und eine Variable mit dem Wert "01"
Anschließend brauche ich noch eine dritte Variable,
wo ich diese zwei Variablen multipliziere.
Mein Problem:
Ich kann die Zahlen zwar Splitten,
aber ich kann damit dann nicht rechnen.
Die Code Zeile "21" funktioniert nicht.
Danke schon mal.
Lg
Es geht hier um die Programmiersprache "C#"
eines mal vorweg, im Bereich Programmieren habe ich 0 Erfahrung.
Überblick:
Ich bekomme über eine Serielle Schnittstelle Werte übergeben.
Diese Werte sehen immer wie folgt aus (301, 220, 117, ...)
Was brauche ich:
Beispiel es wird die Zahl 301 übertragen,
dann möchte ich eine Variable mit dem Wert "3"
und eine Variable mit dem Wert "01"
Anschließend brauche ich noch eine dritte Variable,
wo ich diese zwei Variablen multipliziere.
Mein Problem:
Ich kann die Zahlen zwar Splitten,
aber ich kann damit dann nicht rechnen.
Die Code Zeile "21" funktioniert nicht.
private void timer1_Tick(object sender, EventArgs e)
{
string A = serialPort1.ReadExisting();
if (A != "")
{
Convert.ToInt16(A); // Konventiere die Variable zu einen Zahlentyp (Integer)
label1.Text = A; // Gib die Variable im Label1 aus (Beispiel: 302)
string Faktor = A.Substring(0,1); // Zerlege die 3 Stellige Zahl und speichere die erste Zahl in die Variable "Faktor"
label4.Text = Faktor; // Gib die Variable im Label4 aus (Beispiel: 3)
string Wert = A.Substring(1,2); // Zerlege die 3 Stellige Zahl und speichere die zweite und dritte Zahl in die Variable "Wert"
label7.Text = Wert; // Gib die Variable im Label7 aus (Beispiel: 02)
Convert.ToInt16(Faktor); // Konvertiere die Variable "Faktor" zu einen Zahlentyp (Integer)
Convert.ToInt16(Wert); // Konvertiere die Variable "Wert" zu einen Zahlentyp (Integer)
int gesamt = Faktor * Wert; // Multipliziere "Faktor" * "Wert" und speichere den Wert in die Varialbe "gesamt"
Danke schon mal.
Lg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 280362
Url: https://administrator.de/contentid/280362
Ausgedruckt am: 22.11.2024 um 10:11 Uhr
18 Kommentare
Neuester Kommentar
Hallo,
Klar einen Text kann man auch nicht multiplizieren du musst die Variable in einen Zahlenwert verwandeln.
http://stackoverflow.com/questions/1303934/convert-string-to-integer
Klar einen Text kann man auch nicht multiplizieren du musst die Variable in einen Zahlenwert verwandeln.
http://stackoverflow.com/questions/1303934/convert-string-to-integer
Moin,
wie Wiesi200 schon schreibt du versuchst zwar in Zeile 8, 18 und 19 die Strings wieder in integer zu wandeln, jedoch vergisst du dort das Ergebnis der Konvertierung auch wieder Variablen zuzuweisen.
Also mach das so, dann musst du nicht zweimal hin und her konvertieren:
Gruß jodel32
wie Wiesi200 schon schreibt du versuchst zwar in Zeile 8, 18 und 19 die Strings wieder in integer zu wandeln, jedoch vergisst du dort das Ergebnis der Konvertierung auch wieder Variablen zuzuweisen.
Also mach das so, dann musst du nicht zweimal hin und her konvertieren:
// Substrings extrahieren
string strFaktor = A.Substring(0, 1);
string strWert = A.Substring(1, 2);
// Strings in Integerwerte wandeln
int intFaktor = Convert.ToInt32(strFaktor);
int intWert = Convert.ToInt32(strWert);
//Ergebnis berechnen und Variablen zuweisen
int gesamt = intFaktor * intWert;
Sorry, kleiner Typenfehler, ist oben korrigiert ...
int ist ja effektiv Int32 und nicht Int16 ...
C# ist halt kein VB da müssen die Typen der Variablen immer genauestens beachtet werden.
int ist ja effektiv Int32 und nicht Int16 ...
C# ist halt kein VB da müssen die Typen der Variablen immer genauestens beachtet werden.
Was macht das für einen Unterschied ob 16 oder 32, ist doch nur die max. Größe oder ?
Ja ist nur die max. Größe der Variablen.Kann ich die Werte jeztzt auch über ein "Label" ausgeben oder muss ich es konvertieren ?
Machst du so:Label1.Text = intFaktor.toString();
Klar geht meine Variante 100% !!
Das kann nie und nimmer ....da du wieder vergisst die Umwandlung einer Variablen oder direkt dem Label zuzuweisen...
https://msdn.microsoft.com/de-de/library/system.int32.tostring(v=vs.110) ...
Den Bildercode kannst du in jedes Kommentar einfügen.
Formatierungen in den Beiträgen
Fehlermeldung würde hier schon helfen ....
Bei mir nicht : (
Ich würde ja ein Foto schicken, aber das geht als Kommentar nicht oder ?
Doch, schau in die Formatierungshilfe hier im Forum... Abschnitt Bilder hinzufügen hast du ja oben schon gemacht!Ich würde ja ein Foto schicken, aber das geht als Kommentar nicht oder ?
Den Bildercode kannst du in jedes Kommentar einfügen.
Formatierungen in den Beiträgen
Fehlermeldung würde hier schon helfen ....
Hi,
du hast wieder vergessen das Ergebnis der Convert.ToInt32 Methode in einer Variable abzuspeichern.
Falsch:
Richtig:
oder kürzer:
In deinem Ursprungscode sollte es dann so aussehen:
Noch eine kleine Anmerkung meinerseits zu deinem Programmierstil:
Variablen sollten normalerweise klein geschrieben werden ;)
Schau dir mal dazu Codekonventionen für C# an.
Gruss
Crazy
du hast wieder vergessen das Ergebnis der Convert.ToInt32 Methode in einer Variable abzuspeichern.
Falsch:
Convert.ToString(Faktor);
label4.Text = intFaktor;
Richtig:
string ergebnis = Convert.ToString(Faktor);
label4.Text = ergebnis;
oder kürzer:
label4.Text = Convert.ToString(Faktor);
In deinem Ursprungscode sollte es dann so aussehen:
private void timer1_Tick(object sender, EventArgs e)
{
string A = serialPort1.ReadExisting();
if (A != "")
{
Convert.ToInt16(A); // Konventiere die Variable zu einen Zahlentyp (Integer)
label1.Text = A; // Gib die Variable im Label1 aus (Beispiel: 302)
string Faktor = A.Substring(0,1); // Zerlege die 3 Stellige Zahl und speichere die erste Zahl in die Variable "Faktor"
label4.Text = Faktor; // Gib die Variable im Label4 aus (Beispiel: 3)
string Wert = A.Substring(1,2); // Zerlege die 3 Stellige Zahl und speichere die zweite und dritte Zahl in die Variable "Wert"
label7.Text = Wert; // Gib die Variable im Label7 aus (Beispiel: 02)
int ergebnis = Convert.ToInt32(Faktor) * Convert.ToInt32(Wert) // Initialisiere neue int Variable "ergebnis" und weise ihr den Wert "Faktor" multipliziert mit "Wert" zu
label4.Text = ergebnis.ToString();
Noch eine kleine Anmerkung meinerseits zu deinem Programmierstil:
Variablen sollten normalerweise klein geschrieben werden ;)
Schau dir mal dazu Codekonventionen für C# an.
Gruss
Crazy
Hab ich Ihm auch schon per PM geschrieben, aber er postet ja leider keine Fehlermeldung ...
Na bitte gerne ;)
So würde ich es machen:
Spart nochmals ein paar Zeilen Code und sichert dich noch ab falls a Null oder Empty ist oder nur ein Leerzeichen enthält.
Gruss
Crazy
So würde ich es machen:
private void timer1_Tick(object sender, EventArgs e)
{
string a = serialPort1.ReadExisting();
if (!string.IsNullOrEmpty(a) && !string.IsNullOrWhiteSpace(a))
{
string strFaktor = a.Substring(0, 1);
string strWert = a.Substring(1, 2);
int intGesamt = Convert.ToInt32(strFaktor) * Convert.ToInt32(strWert);
label1.Text = a;
label4.Text = strFaktor;
label7.Text = strWert;
label9.Text = Convert.ToString(intGesamt);
}
else
{
MessageBox.Show("String a leer", "Fehler", MessageBoxButtons.OK);
}
}
Spart nochmals ein paar Zeilen Code und sichert dich noch ab falls a Null oder Empty ist oder nur ein Leerzeichen enthält.
Gruss
Crazy
Und zur absoluten Sicherheit für den Fall das das Lesen des Serial-Ports abstürzt, noch ein TryCatch einbauen
Du siehst es gilt vieles zu beachten, für einen reibungslosen Betrieb.
try{
string a = serialPort1.ReadExisting();
}catch (Exception ex){
MessageBox.Show("Fehler! " + ex.Message);
}
Du siehst es gilt vieles zu beachten, für einen reibungslosen Betrieb.
Vollkommen richtig!
Und wenn du dann schon mit TryCatch arbeitest würde ich die NullOrEmpty Abfrage auch mit einer Exception quitieren :D
Und wenn du dann schon mit TryCatch arbeitest würde ich die NullOrEmpty Abfrage auch mit einer Exception quitieren :D
private void timer1_Tick(object sender, EventArgs e)
{
try{
string a = serialPort1.ReadExisting();
}catch (Exception ex){
throw ex;
}
try
{
if (string.IsNullOrEmpty(a) || string.IsNullOrWhiteSpace(a))
{ throw new ArgumentNullException("String a leer"); }
}
catch{ throw };
string strFaktor = a.Substring(0, 1);
string strWert = a.Substring(1, 2);
int intGesamt = Convert.ToInt32(strFaktor) * Convert.ToInt32(strWert);
label1.Text = a;
label4.Text = strFaktor;
label7.Text = strWert;
label9.Text = Convert.ToString(intGesamt);
}