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-ID: 280362

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

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

wiesi200
wiesi200 16.08.2015 um 07:37:53 Uhr
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
114757
Lösung 114757 16.08.2015 aktualisiert um 16:54:42 Uhr
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
K-ist-K
K-ist-K 16.08.2015 um 13:31:16 Uhr
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.
114757
114757 16.08.2015 aktualisiert um 13:41:12 Uhr
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.
K-ist-K
K-ist-K 16.08.2015 um 13:53:33 Uhr
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);
114757
114757 16.08.2015 aktualisiert um 15:54:56 Uhr
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();
K-ist-K
K-ist-K 16.08.2015 um 15:41:34 Uhr
Goto Top
Funktioniert leider nicht.

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

Convert.ToString(intFaktor);
label4.Text = intFaktor;
114757
114757 16.08.2015 aktualisiert um 15:43:06 Uhr
Goto Top
Zitat von @K-ist-K:

Funktioniert leider nicht.
Klar geht meine Variante 100% !!
114757
114757 16.08.2015 aktualisiert um 15:44:05 Uhr
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...
K-ist-K
K-ist-K 16.08.2015 um 15:44:35 Uhr
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 ?
114757
114757 16.08.2015 aktualisiert um 16:25:46 Uhr
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.
Formatierungen in den Beiträgen

Fehlermeldung würde hier schon helfen ....
Abyssox
Lösung Abyssox 16.08.2015 aktualisiert um 16:53:58 Uhr
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
114757
114757 16.08.2015 aktualisiert um 16:48:19 Uhr
Goto Top
Hab ich Ihm auch schon per PM geschrieben, aber er postet ja leider keine Fehlermeldung ...
K-ist-K
K-ist-K 16.08.2015 um 16:53:52 Uhr
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
Abyssox
Lösung Abyssox 16.08.2015 aktualisiert um 17:08:02 Uhr
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
K-ist-K
K-ist-K 16.08.2015 um 17:07:56 Uhr
Goto Top
: )

Danke
114757
114757 16.08.2015 aktualisiert um 17:16:02 Uhr
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.
Abyssox
Abyssox 16.08.2015 aktualisiert um 17:37:21 Uhr
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);

}