k-ist-k
Goto Top

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.

6018de917b60d88fb915ec9d23bd75d1



 

        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

Content-Key: 280362

Url: https://administrator.de/contentid/280362

Printed on: April 25, 2024 at 01:04 o'clock

Member: wiesi200
wiesi200 Aug 16, 2015 at 05:37:53 (UTC)
Goto Top
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
Mitglied: 114757
Solution 114757 Aug 16, 2015 updated at 14:54:42 (UTC)
Goto Top
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:
// 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;
Gruß jodel32
Member: K-ist-K
K-ist-K Aug 16, 2015 at 11:31:16 (UTC)
Goto Top
@114757,

danke für den Code.
Es sah sehr viel versprechend aus,
aber es funktioniert nicht.

Problem In der Zeile:
Int16 intGesamt = intFaktor * intWert;

schreibt er folgenden Fehler:
(lokale Variable) short intFaktor
Der Typ "int" kann nicht impliziert in "short" konvertiert werden.
Es ist bereits eine explizierte Konvertierung vorhanden
(möglicherweise fehlt eine Umwandlung).

Ich hab den Code kopiert und hab nur statt gesamt, intGesamt geschrieben.
Mitglied: 114757
114757 Aug 16, 2015 updated at 11:41:12 (UTC)
Goto Top
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.
Member: K-ist-K
K-ist-K Aug 16, 2015 at 11:53:33 (UTC)
Goto Top
Ja super hat funktioniert.
Was macht das für einen Unterschied ob 16 oder 32, ist doch nur die max. Größe oder ?

Kann ich die Werte jeztzt auch über ein "Label" ausgeben oder muss ich es konvertieren ?
Label1.Text = Convert.ToString(intFaktor);
Mitglied: 114757
114757 Aug 16, 2015 updated at 13:54:56 (UTC)
Goto Top
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();
Member: K-ist-K
K-ist-K Aug 16, 2015 at 13:41:34 (UTC)
Goto Top
Funktioniert leider nicht.

Ich hätte das hier auch schon versucht,
aber das ging auch nicht.

Convert.ToString(intFaktor);
label4.Text = intFaktor;
Mitglied: 114757
114757 Aug 16, 2015 updated at 13:43:06 (UTC)
Goto Top
Zitat von @K-ist-K:

Funktioniert leider nicht.
Klar geht meine Variante 100% !!
Mitglied: 114757
114757 Aug 16, 2015 updated at 13:44:05 (UTC)
Goto Top
Zitat von @K-ist-K:
> Convert.ToString(intFaktor);
> label4.Text = intFaktor;
> 
Das kann nie und nimmer ....da du wieder vergisst die Umwandlung einer Variablen oder direkt dem Label zuzuweisen...
Member: K-ist-K
K-ist-K Aug 16, 2015 at 13:44:35 (UTC)
Goto Top
Bei mir nicht : (
Ich kann dir das auch per Teamviewer zeigen.

Ich würde ja ein Foto schicken,
aber das geht als Kommentar nicht oder ?
Mitglied: 114757
114757 Aug 16, 2015 updated at 14:25:46 (UTC)
Goto Top
https://msdn.microsoft.com/de-de/library/system.int32.tostring(v=vs.110) ...

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!
Den Bildercode kannst du in jedes Kommentar einfügen.
Formatting instructions in the posts

Fehlermeldung würde hier schon helfen ....
Member: Abyssox
Solution Abyssox Aug 16, 2015 updated at 14:53:58 (UTC)
Goto Top
Hi,

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
Mitglied: 114757
114757 Aug 16, 2015 updated at 14:48:19 (UTC)
Goto Top
Hab ich Ihm auch schon per PM geschrieben, aber er postet ja leider keine Fehlermeldung ...
Member: K-ist-K
K-ist-K Aug 16, 2015 at 14:53:52 (UTC)
Goto Top
@114757 & @cr4zyd1ng0 ihr habt mir beide wirklich sehr geholfen.

Das hier ist jetzt das Endergebnis was ich gebraucht hatte:

        private void timer1_Tick(object sender, EventArgs e)
        {
            string A = serialPort1.ReadExisting();
            if (A != "")  
            {

                label1.Text = A; 

                string strFaktor = A.Substring(0, 1);
                string strWert = A.Substring(1, 2);

                Int32 intFaktor = Convert.ToInt32(strFaktor);
                Int32 intWert = Convert.ToInt32(strWert);

                Int32 intGesamt = intFaktor * intWert;

                label4.Text = Convert.ToString(intFaktor);
                label7.Text = Convert.ToString(intWert);
                label9.Text = Convert.ToString(intGesamt);

Lg
Member: Abyssox
Solution Abyssox Aug 16, 2015 updated at 15:08:02 (UTC)
Goto Top
Na bitte gerne ;)

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
Member: K-ist-K
K-ist-K Aug 16, 2015 at 15:07:56 (UTC)
Goto Top
: )

Danke
Mitglied: 114757
114757 Aug 16, 2015 updated at 15:16:02 (UTC)
Goto Top
Und zur absoluten Sicherheit für den Fall das das Lesen des Serial-Ports abstürzt, noch ein TryCatch einbauen
try{
    string a = serialPort1.ReadExisting();
}catch (Exception ex){
   MessageBox.Show("Fehler! " + ex.Message);  
}
face-wink

Du siehst es gilt vieles zu beachten, für einen reibungslosen Betrieb.
Member: Abyssox
Abyssox Aug 16, 2015 updated at 15:37:21 (UTC)
Goto Top
Vollkommen richtig!

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);

}