mikrocontroller.net

Forum: PC-Programmierung C-Code in VB.NET umwandeln


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: N. N. (drnicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich will eine in C vorhandene Funktion in VB.NET umwandeln

static byte calc_new_checksum(size_t nbytes)
{
    byte cksum=0;
  byte p =0;
  while(nbytes-- > 0)
    cksum += p;
  cksum = -cksum;
  return cksum;
}
Den Code habe ich nach zahllosen Versuchen automatisch inn VB.NET 
übersetzen lassen.
Wenn ich das probiere, dann bekomme ich Überlauffehler.
Wie kriege ich das hin.
Mein Probelm liegt wahrscheinlich schon darin, dass meine Quelldaten in 
einem Byte-Array liegen und nicht vorzeichenbehaftet sind.

: Verschoben durch Moderator
Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N. N. schrieb:
> Den Code habe ich nach zahllosen Versuchen automatisch inn VB.NET
> übersetzen lassen.
> Wenn ich das probiere, dann bekomme ich Überlauffehler.

Zeig' Deinen Vb.net-Code.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da kannst du auch gleich ein 0 zurück geben (oder zuweisen)

N. N. schrieb:
> Mein Probelm liegt wahrscheinlich schon darin, dass meine Quelldaten in
> einem Byte-Array liegen und nicht vorzeichenbehaftet sind.

Wo ist das denn?

Autor: Framulestigo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich's jetzt an den Augen?
Oder summiert der C-Code nicht einfach nur nullen n-mal auf?

Autor: N. N. (drnicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehr richtig bemerkt. Sorry, ich hatte den Originalcode schon wg. 
Fehlermeldungen des Übersetzers versucht zu vereinfachen.

static byte calc_new_checksum(const void* pBytes,size_t nbytes)
{
  assert(pBytes && nbytes > 0);
  byte cksum=0;
  const byte* p = reinterpret_cast<const byte*>(pBytes);
  while(nbytes-- > 0)
    cksum += *p++;
  cksum = -cksum;
  return cksum;
}

Autor: Nullator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...
return 0;

Autor: Nullator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// Sorry, war zu spät.

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N. N. schrieb:

> Ich will eine in C vorhandene Funktion in VB.NET umwandeln
>
> static byte calc_new_checksum(size_t nbytes)
> {
>     byte cksum=0;
>   byte p =0;
>   while(nbytes-- > 0)
>     cksum += p;
>   cksum = -cksum;
>   return cksum;
> }

Diese Funktion ergibt nicht wirklich irgendeinen Sinn. So, wie sie da 
steht, hätte man auch genausogut schreiben können:

> static byte calc_new_checksum(size_t nbytes)
> {
>   return 0;
> }

Und weil das so ist, würde ein korrekte Umsetzung (selbst eine doofe 
automatisierte) nach VB.net keine Problem mit einem Überlauf bekommen...

Autor: cppbert3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Addiere alle bytes in deinem array in einem byte (welches wohl 
ueberlaeuft) und liefert das Ergebnis negativ zurueck - portieren 
brauchst du da nicht viel

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N. N. schrieb:
> Sorry, ich hatte den Originalcode schon wg.
> Fehlermeldungen des Übersetzers versucht zu vereinfachen.

In C++ gibt es da nicht so viel, was man weglassen kann.

Addiere den Inhalt deines Datem-Arrays auf.
Danach bildest du den negative Wert davon.

Wie ist byte bei dir definiert (typedef)
(irgendwas mit signed char  ???)

Autor: N. N. (drnicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das stammt aus einem readme.txt:

"
All binary data records are checksummed and the single byte checksum is
appended following each record. The checksum is a simple XOR of every 
byte of
the data record for firmware versions before 3.00, and the negative of a
simple sum of every byte of the data record for firmware versions after 
3.00.

See calc_old_checksum and calc_new_checksum() functions

"
Wenn ich alle Bytes addiere, dann kann auf jeden Fall eine Summe >255 
rauskommen, oder ?
Ich bin mir weder sicher wie lang dieser Header ist, noch ob ich 
vielleicht doch die sog. "old_checksum" benötige

Autor: N. N. (drnicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier wird eine Menge #included:
#include <tchar.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdarg.h>
#include <minmax.h>

#include <assert.h>

#include <io.h>
#include <fcntl.h>
#include <time.h>

#include <sys/types.h>
#include <sys/stat.h>

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cppbert3 schrieb:

> Addiere alle bytes in deinem array in einem byte (welches wohl
> ueberlaeuft) und liefert das Ergebnis negativ zurueck - portieren
> brauchst du da nicht viel

Doch, natürlich. VB.net kennt nämlich leider keine Möglichkeit, die 
Überlaufprüfungen zu deaktivieren. In C# wäre das einfacher, da könnte 
man den Code fast 1:1 übernehmen und müßte ihn nur noch in ein

unchecked
{
 ...
}

verfrachten.

In VB kann man das leider nur dadurch lösen, dass man mit einem 
breiteren Datentypen operiert und sachgerecht maskiert.

Kein Ahnung, warum Winzigweich nicht auch VB.net so ein nettes 
Schlüsselwort gegönnt hat...

Autor: Nullator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N. N. schrieb:
> Wenn ich alle Bytes addiere, dann kann auf jeden Fall eine Summe >255
> rauskommen, oder ?

Das wird wohl nicht klappen (Überlauf).
Ich habe keine Ahnung von VB.NET, vermute aber mal, dass man in den 
Compileroptionen so etwas wie Checks auf Overflow/Underflow findet und 
entsprechend deaktivieren kann (wenn man es denn "genau so" wie im 
gezeigten Code machen will). Wenn du nicht den Überlauf "ausnutzen" 
willst, überlege dir mal, was du stattdessen tun könntest (Tipp: 
Nachsehen, ob der neue Wert noch in cksum passt; auf den Rest kommst 
selbst).

Autor: Nullator (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Gilt dann aber natürlich für das ganze Projekt.

Autor: Framulestigo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist zwar schon über 10 Jahre her mit VB, aber als Ansatz (!Ohne Dein 
"reinterpret_cast"):
Shared Function Chksum(ByRef array As Byte(), ByVal len As Integer) As Byte
        Dim i As Integer, result As Integer = 0

        For i = len - 1 To 0 Step -1
            result = -result + array(i)
            result = result And &HFF
        Next
        Return result
    End Function

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N. N. schrieb:
> Ich will eine in C vorhandene Funktion in VB.NET umwandeln

Jetzt mal ernsthaft? Wie kommt man auf so eine kranke Idee?

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Horst schrieb:
> N. N. schrieb:
>> Ich will eine in C vorhandene Funktion in VB.NET umwandeln
>
> Jetzt mal ernsthaft? Wie kommt man auf so eine kranke Idee?

Ich finde, schon die Tatsache, C einfach nicht zu mögen, wäre ein 
absolut hinreichender Grund...

Autor: N. N. (drnicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wird es wohl am ehesten sein. Ich habe nun mal wesentlich mehr 
Erfahrung mit VB als mit C. Da schien es mir mit VB.NET einfacher.

Es geht letztlich darum, eine alte Opern-Source-Software 
nachzuvollziehen und die inzwischen in der Firmware verwirklichten 
Features zu nutzen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.