Forum: PC-Programmierung Brauche Hilfe bei Übersetzung von C# nach VB.net


von C#VB (Gast)


Lesenswert?

Hallo Leute,

Habe ein Problem mit einer Übersetzung von C# nach VB.Net.
Den ganzen Code habe ich mit einem Online Translator übersetzt.
Nur bei einem Teil gibt es ein Problem.

Originaler Code:
1
  private void GetCRC(byte[] message, ref byte[] CRC)
2
        {
3
            //Function expects a modbus message of any length as well as a 2 byte CRC array in which to 
4
            //return the CRC values:
5
6
            ushort CRCFull = 0xFFFF;
7
            byte CRCHigh = 0xFF, CRCLow = 0xFF;
8
            char CRCLSB;
9
10
            for (int i = 0; i < (message.Length) - 2; i++)
11
            {
12
                CRCFull = (ushort)(CRCFull ^ message[i]);
13
14
                for (int j = 0; j < 8; j++)
15
                {
16
                    CRCLSB = (char)(CRCFull & 0x0001);
17
                    CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);
18
19
                    if (CRCLSB == 1)
20
                        CRCFull = (ushort)(CRCFull ^ 0xA001);
21
                }
22
            }
23
            CRC[1] = CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
24
            CRC[0] = CRCLow = (byte)(CRCFull & 0xFF);
25
        }

VB Code:
1
 
2
Private Sub GetCRC(ByVal message As Byte(), ByRef CRC As Byte())
3
        'Function expects a modbus message of any length as well as a 2 byte CRC array in which to 
4
        'return the CRC values:
5
6
        Dim CRCFull As UShort = &HFFFF
7
        Dim CRCHigh As Byte = &HFF, CRCLow As Byte = &HFF
8
        Dim CRCLSB As Char
9
10
        For i As Integer = 0 To (message.Length) - 3
11
            CRCFull = CUShort(CRCFull Xor message(i))
12
13
            For j As Integer = 0 To 7
14
                CRCLSB = ChrW(CRCFull And &H1)
15
                CRCFull = CUShort((CRCFull >> 1) And &H7FFF)
16
17
                If CRCLSB = 1 Then
18
                    CRCFull = CUShort(CRCFull Xor &HA001)
19
                End If
20
            Next
21
        Next
22
        CRC(1) = InlineAssignHelper(CRCHigh, CByte((CRCFull >> 8) And &HFF))
23
        CRC(0) = InlineAssignHelper(CRCLow, CByte(CRCFull And &HFF))
24
    End Sub

Das Problem liegt bei:
1
 
2
  If CRCLSB = 1 Then
3
                    CRCFull = CUShort(CRCFull Xor &HA001)
4
                End If

Der Compiler sagt:
Fehler  1  Der =-Operator ist für die Typen "Char" und "Integer" nicht 
definiert.

Kann mir da wer weiter helfen ??

von Borislav B. (boris_b)


Lesenswert?

Das ist doch ziemlich eindeutig. Die Fehlermeldung sagt dir doch exakt 
wo der Fehler liegt:

Du kannst dem Char keinen Integer zuweisen. Dazu ist ein Typecast 
erforderlich.

Davon ab willst du vermutlich gar keine Zuweisung machen, oder? In einem 
If kommt das nicht so gut ;-)

von C#VB (Gast)


Lesenswert?

Wenn ich es mit C# laufen lasse gibt es kein Problem.
Leider ist C# ein wenig zu steil für mich.

von Peter II (Gast)


Lesenswert?

C#VB schrieb:
> Wenn ich es mit C# laufen lasse gibt es kein Problem.
> Leider ist C# ein wenig zu steil für mich.

also wenn das der ganze Grund ist für VB dann steht dich lieber ein paar 
stunden hin und lerne C#.

VB ist im Vergleich zu andere Programmiersparen immer irgendwie 
"andere". du Bekommst du C# viel mehr Unterstützung als für VB.

von Udo S. (urschmitt)


Lesenswert?

C#VB schrieb:
> Wenn ich es mit C# laufen lasse gibt es kein Problem.
> Leider ist C# ein wenig zu steil für mich.

Na dann schreibs dir doch in VB. Wo ist das Problem? Warum nimmst du 
dann einen "zu steilen" C# Code und versuchst den zu übersetzen statt es 
in dem dir genehmen VB selbst zu implementieren?

von Borislav B. (boris_b)


Lesenswert?

C#VB schrieb:
> Wenn ich es mit C# laufen lasse gibt es kein Problem.

Im C# Code ist ja auch kein Fehler. Der Generator scheint einen 
eingebaut zu haben (siehe Gleichheitszeichen, wie oben geschrieben).

Peter II schrieb:
> also wenn das der ganze Grund ist für VB dann steht dich lieber ein paar
> stunden hin und lerne C#.

Amen.

von Sven W. (svenw)


Lesenswert?

Die Variable 'CRCLSB' ist ein Char. Der =-Operator ist an dieser Stelle 
kein Zuweisungsoperator. Vergleiche werden in VB tatsächlich mit einem 
'=' durchgeführt und nicht mit '==' wie bei C#.

Der Fehler "Der =-Operator ist für die Typen "Char" und "Integer" nicht 
definiert." sagt eigentlich nur, das es mit einem "Char" nicht geht. 
Also wenn es mit einem Char nicht geht, muss man ihn Konvertieren. Die 
MSDN schlägt an dieser Stelle die Funktion 'AscW' (Unicode) hin. 
Versuche es doch mal damit.

1
If AscW(CRCLSB) = 1 Then
2
    CRCFull = CUShort(CRCFull Xor &HA001)
3
End If

Mich würde noch die Funktion 'InlineAssignHelper(...)' interessieren, 
veröffentliche sie doch bitte mal.

MfG Sven

von Prog R. (daniel_v)


Lesenswert?

oder einfach:
1
If CRCLSB = "1" Then
2
    CRCFull = CUShort(CRCFull Xor &HA001)
3
End If

Ansonsten gibt es für Character auch eine Equals() Methode.

http://msdn.microsoft.com/en-us/library/2s1s1247(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2

von Yalu X. (yalu) (Moderator)


Lesenswert?

Daniel V. schrieb:
> If CRCLSB = "1" Then

Da vergleichst du aber ein Char mit einem String, was dir der Compiler
ebenfalls ankreidet. Korrektes VB.NET wäre
1
  If CRCLSB = "1"c Then

Allerdings tut das etwas anderes als im ursprüngliche C#-Code.

Folgende Alternativen könnten hingegen funktionieren:
1
  If CRCLSB = Chr(1) Then
1
  If CRCLSB = "\cA"c Then
1
  If CRCLSB = "\x01"c Then
1
  If CRCLSB = "\001"c Then

Ich kann aber kein VB.NET, deswegen ist das Geschriebene möglicherweise
kompletter Unsinn ;-)

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

C#VB schrieb:
> Wenn ich es mit C# laufen lasse gibt es kein Problem.
> Leider ist C# ein wenig zu steil für mich.

naja, in VB gibt es ja auch "Datentypen", "Zuweisungen", "Vergleiche" 
etc.

Wenn du doch so vertraut bist mit VB, dann sollte das doch unaufwändig 
möglich sein, direkt die Fehlermeldungen zu identifiziern und zu 
beheben??

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.