Announcement

Collapse
No announcement yet.

logisches und bitweises AND

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • logisches und bitweises AND

    Hi

    Ich übersetze grad ein Programm von C++ nach VB.NET.

    Es handelt sich um folgenden Code:

    Code:
    //C++
    while ( dwCurObject && (dwCurObject&1) == 0 )
    {
    	//BlaBla
    }
    
    
    'VB.NET
    While dwCurObject And (dwCurObject And 1) = 0
           'BlaBla
    End While
    Leider funktioniert es nicht, so wie es sollte.
    Im C++ Code wird ja && als logisches UND und & als ein
    bitweises UND verwendet. In VB.NET konnte ich nicht herausfinden,
    ob es ein bitweises UND überhaupt gibt (habe deshalb zweimal ein logisches
    UND genommen).

    Könnt ihr mir helfen?

    mfg
    Juhu
    lol? wow gamecard 4 president.

  • #2
    Logisch und bitwise ist in VB beides AND. Es wird anhand der Operanden (eben ob diese Booleans oder Zahlenwerte sind) unterschieden und dann eben entsprechend ein logisches oder bitwise AND ausgeführt.

    Ich vermute du hast aber die Operatorreihenfolge nicht berücksichtig und wolltest eigentlich den Ausdruck mit 0 vergleichen. Somit mußt du den Ausdruck klammern sonst zieht = vor dem ersten AND.

    Also

    While (dwCurObject And (dwCurObject And 1)) = 0
    'BlaBla
    End While

    Edit : Was für ein Typ ist eigentlich dwCurObject?

    Comment


    • #3
      Ein DWORD ist es
      Christian

      Comment


      • #4
        Genau es ist in C++ ein DWORD.
        In VB.NET hab ich verschiedene Variablentypen getestet. Im moment ist es
        UInt32

        Der C++ Code funktioniert 100% perfekt und hab ihn nahezu (soweit als halt
        möglich) 1:1 in VB.NET übersetzt. Aber die Schleife bricht frühzeitig ab.
        Das mit den Klammern versteh ich schon, aber in C++ ist es so:

        Code:
        while ( dwCurObject && (dwCurObject&1) == 0 )
        Vielleicht sollte ich noch erwähnen, dass dwCurObject eine Speicheradresse ist.
        Lese also Variablen aus dem RAM.

        Habe auch schon im C++ Thread geschrieben und wurde hierher verwiesen.

        Hoffe ihr könnt mir helfen!
        lol? wow gamecard 4 president.

        Comment


        • #5
          Wenn du direkte Speicheradressenmanipulation vornimmst bist du in einer managed Sprache falsch. Das geht garantiert mittelfristig in die Hose.

          Der GC(garbage Collector) darf theoretisch Objekte im Speicher verschieben wenn er es für nötig hält. Wenn du also die Speicheradresse eines Objekts in einer Integervariable speicherst kannst du nie sicher sein das wenn du wieder mit diesem Zahlenwert in den Speicher greifst da auch das erwartete wiederfindest. Für Interop Probleme wo sich entsprechendes vielleicht nicht verhindern läßt solltest du mal unter dem Stichwort Pinning in der MSDN nachlesen. Ich glaube aber nicht das das hier der Fall ist.

          Du solltest auf keinen Fall blind Code von C++ nach VB.NET übersetzen. Es sind nicht nur unterschiedliche Sprachen sondern aufgrund der unterschiedlichen Frameworks (Windows API <-> .NET Framework) auch unterschiedliche Programmierphilosophien. Du solltest dir also im größeren Kontext überlegen was der Code der dir in C++ vorliegt eigentlich macht und dir dann eine Sinnentsprechung in VB.NET überlegen.

          Comment


          • #6
            Dann könnte ich die Funktion halt einfach in eine (C++) Dll
            auslagern.
            Wäre das nicht die ultimative Lösung?

            Edit: Ich manipuliere den Speicher nicht. Ich lese ausschliesslich, dafür viel und möglichst schnell.
            lol? wow gamecard 4 president.

            Comment


            • #7
              Vielleicht solltest du dir mal C++/CLR ansehen ob das hilft. Wenn du denn Code in einer dll hats mußt du die veröffentlichte Funktionalität immer noch mit PInvoke (relativ langsam) rausholen in C++/CLR hast du aber gleichzeitig Zugriff auf den managed und unmanaged Speicher und kanst da, zumindest theoretisch, wesentlich performanter auf unmanaged Bestandteile zugreifen.

              Comment


              • #8
                Ok habs angesehen ^^

                Hab ein Testprogramm direkt mit Win Api gemacht. Aber bleib gerade hängen.
                Zu VB.NET findet man schnell alles was man braucht, aber bei c++ Problemen ist
                das echt mühsam an Infos zu kommen. Hab zb ein Button eingefügt, zu mehr
                hab ichs nicht geschafft, ich find einfach nicht heraus wie die Klassen von
                anderen Controls heissen.

                Dann hab ich noch ein normale Windows Forms Anwendung (.net) getestet.
                Man kann natürlich super Forms designen, aber ist auch irgendwie komisch und
                mühsam. Obwohl ich die selben Header einfüge, kennt er plötzlich Wörter wie
                HANDLE oder HWND nicht mehr. Oder wenn ich bei einem Button Click Event eine
                Funktion aufrufen will, kennt er die auch nie. Und aus dem Hauptprogramm
                kann ich die Controls nicht manipulieren.

                Ich komm mir vor als ob ich versuche mit einem 2 jährigen Kind mit Sprachfehler
                ein Gespräch über Naturwissenschaften zu führen.

                Und guter VB Code soll schneller sein als schlechter C++ Code.
                Ich mag ja C++ eigentlich, aber sobald man halt paar Fensterchen
                braucht und bisschen was komplexeres machen will, explodiert alles gleich.

                Und das ganze Programm, das ich in VB.net geschrieben habe funktioniert
                ja super. Nur dass ich halt ein Problem mit der While Schleife hab.
                Wenn ich C++ und VB.NET Programm gleichzeitig starte, dann liest das VB.NET
                proggi manchmal etwas anderes (oder gar nix) als das c++ proggi. Obwohl
                die Werte im RAM nicht ändern.
                Hast du das gemeint mit der managed Sprache?

                Ist echt nervig.
                Bis ich das ganze (recht komplexe) Programm in C++ umgeschrieben habe,
                dauert das recht lange.

                Kann man nicht einfach zwei Programme miteinander "verbinden"?
                Ich meine, dass ich einfach zum Ram lesen ein C++ proggi verwende, dass
                in der Sekunde paar mal einige Vars übergibt?
                Es wäre doch so einfach.
                lol? wow gamecard 4 president.

                Comment


                • #9
                  Code:
                  Hast du das gemeint mit der managed Sprache?
                  Möglicherweise. Das einzige das wir hier vom deinem Programm kennen ist eine Codezeile. Ist ein bißchen wenig um genauere Rückschlüsse zu ziehen.

                  Ich kann dir auch drumherum schwer folgen. Du hast am Anfang erzählt das du ein Programm von c++ nach VB.NET umgestellt hast und jetzt erzählst du es wär schwer dein VB.NET Programm nach c++ umzustellen

                  Am besten du erzählst noch ein wenig mehr über dein Programm insbesondere was den für eine Datenstruktur im Speicher liegt. Vielleicht triffst du nur falsche Annahmen darüber wie sich die Datenstruktur im Speicher darstellt und hast in Wirklichkeit gar kein Problem mit der gezeigten Schleife.

                  Comment

                  Working...
                  X