JCB: 4 (vier) ist kleiner -1 (minus eins)?!?!

Hallo!

Diesmal gehts um was ganz besonderes ;). Vorweg: ich arbeite mit VB.Net. Es geht um folgenden Code-Schnipsel:

Dim mStr As String = "testtest1"
Dim idx As Integer = mStr.IndexOf("test1")
If idx > 0 Then ' idx hat beim debuggen den korrekten Wert von 4.
   mStr = mStr     ' Aber ist 4 nicht mehr größer als 0 (NULL)????
End If

Wenn ich den Code debugge, findet er in mStr "test1" an Stelle 4 (idx=4). Alles vollkommen 100% korrekt. Die If-Bedingung, dass 4>0 ist, ist aber dabei falsch?!? Öh, warum is das so??? Is vielleicht irgendwo n Stern explodiert, so dass manche mathematischen Grundsätze übern Jordan sind ;)??? Spaß beiseite: hatte schon mal ein ähnliches Problem? Oder weiß vielleicht jemand, wo man draufhauen muß, damits wieder in Ordnung ist ;)?

Gruß,
Jan

PS: Der Code wurde auch schon auf anderen Rechnern (erstellt in neuen Projekten) mit gleichem Ergebnis getestet.

  1. Hallo!

    Dim mStr As String = "testtest1"
    Dim idx As Integer = mStr.IndexOf("test1")
    If idx > 0 Then ' idx hat beim debuggen den korrekten Wert von 4.
       mStr = mStr     ' Aber ist 4 nicht mehr größer als 0 (NULL)????

    ^ Das ist ein schlechter Beweis ...

    End If

    ... (mstr = mstr) aber Du wirst schon ein Tracing gemacht haben?!

    Beste Grüße
    Viennamade

    1. ... (mstr = mstr) aber Du wirst schon ein Tracing gemacht haben?!

      Moin!

      Eigentlich spielt es keine Rolle, welcher Code ausgeführt werden soll, wenn die If-Bed. wahr ist. Ich kann da auch messagebox.show("test") oder sonst was hinschreiben. Das Ergebnis ist immer das gleiche. Ich mußte nur irgendwas da hinschreiben, damit ich dort einen entsprechendenHaltpunkt setzen konnte. mStr=mStr ergibt natürlich keine großen Sinn ;).

      Gruß,
      Jan

      1. Hi,

        Ich kann da auch messagebox.show("test") oder sonst was hinschreiben. Das Ergebnis ist immer das gleiche.

        Bist du dir da _wirklich_100%_sicher_? Ich glaube dir nicht ... möchtest du wetten? Dein Einsatz!

        Grüße,

        Jochen

        1. Ich kann da auch messagebox.show("test") oder sonst was hinschreiben. Das Ergebnis ist immer das gleiche.

          Bist du dir da _wirklich_100%_sicher_? Ich glaube dir nicht ... möchtest du wetten? Dein Einsatz!

          ja, da bin ich mir 100% sicher, dass das ergebnis immer das gleiche ist. da die if-bed. immer unwahr ist, spielt es keine rolle, welcher code bei wahrer aussage ausgeführt werden soll. mein einsatz: kasten pilz ;).

          Gruß,
          Jan

          1. Hi,

            ja, da bin ich mir 100% sicher, dass das ergebnis immer das gleiche ist. da die if-bed. immer unwahr ist, spielt es keine rolle, welcher code bei wahrer aussage ausgeführt werden soll.

            also, ich kann in dem Code-Schnipselchen kein Problem erkennen, und anderen geht es offenbar ebenso. Vielleicht könntest Du mal ein verbindliches, minimales und vollständiges(!) Beispiel nennen, anhand dessen das Problem zweifelsfrei erkannt werden kann.

            mein einsatz: kasten pilz ;).

            Oh, ich habe noch nie einen kastenförmigen Pilz gesehen. Hättest Du mal ein Foto davon? ;-)

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hallo,

              mein einsatz: kasten pilz ;).
              Oh, ich habe noch nie einen kastenförmigen Pilz gesehen. Hättest Du mal ein Foto davon? ;-)

              *g*
              An einem Heißgetränke-Automaten hatte die Firma mal, schön mit Beschriftungsgerät, folgendes angeboten:
              4 ...
              5 Zitronentee
              6 Pilssuppe

              Einige, die Getränk 6 wählten, waren enttäuscht.

              viele Grüße ;-))

              Axel

              1. Hi,

                An einem Heißgetränke-Automaten hatte die Firma mal, schön mit Beschriftungsgerät, folgendes angeboten:

                *g* auch nicht schlecht :-)

                5 Zitronentee

                Wäre das Punkt 4 gewesen, hätte es mich an die vier Schlagworte der Französischen Revolution gem. meinem damaligen Gemeinschaftskundelehrer erinnert: Liberté, Egalité, Fraternité, Zitronenté. Aber als Punkt 5 erinnert es mich natürlich kein Stück daran ;-)

                6 Pilssuppe

                Gnagnagna ... Okay, ich kann mich nicht bremsen[1]:

                Warum steht ein Pilz im Wald?

                Weil die Tannen zapfen.

                Cheatah :-)

                [1] Nicht, dass ich es ernsthaft versucht hätte *g*

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. Hallo,

                  Warum steht ein Pilz im Wald?

                  Weil die Tannen zapfen.

                  Aha, und wo servieren die Tannen?

                  Auf dem Wildbrett?

                  viele Grüße ;-))

                  Axel

              2. An einem Heißgetränke-Automaten hatte die Firma mal, schön mit Beschriftungsgerät, folgendes angeboten:
                4 ...
                5 Zitronentee
                6 Pilssuppe

                Einige, die Getränk 6 wählten, waren enttäuscht.

                das schöne an diesem automaten ist, dass die reste vom vorgänger immer im eigenem becher laden. ich sag nur lecker: tee mit pliz aroma ;).

                Gruß,
                Jan

            2. Lieber Cheatah ;),

              also, ich kann in dem Code-Schnipselchen kein Problem erkennen, und anderen geht es offenbar ebenso. Vielleicht könntest Du mal ein verbindliches, minimales und vollständiges(!) Beispiel nennen, anhand dessen das Problem zweifelsfrei erkannt werden kann.

              das ist ja gerade das problem. ich kann da auch kein fehler erkennen und auch eigentlich mit sicherheit sagen: da ist kein fehler drin. zumindest nicht im code. das problem liegt auf einer anderen ebene. denn egal was ich als bedingung hinschreibe (z.B. if 1=1 then ...), die bedingung ist immer unwahr.

              Oh, ich habe noch nie einen kastenförmigen Pilz gesehen. Hättest Du mal ein Foto davon? ;-)

              pfeife ;P. wobei nen eckigen pilz zu züchten wär nicht das problem ;).

              Greetz,
              Jan

          2. Hallo Jan,

            mein einsatz: kasten pilz ;).

            ok, einverstanden. Wie kaspern wir das aus? Du kommst aus .... Duelmen? Das ist nicht gerade bei mir ums Eck. Außerdem habe ich kein VB.Net um dir ggf. das Gegenteil zu beweisen.

            was macht dein VB.Net bei:
            Dim mStr As String = "testtest1"
            Dim idx As Integer = mStr.IndexOf("test1")
            If idx > 0 Then
               messagebox.show("test")
            End If

            und wenn du daraus ein:

            idx=1
            If idx > 0 Then
               messagebox.show("test")
            End If

            machst? btw. Muss es nicht "If idx >= 0 Then" heisen? Denn IndexOf("test1") kann doch auch 0 liefern wenn der String an erster Stelle beginnt. Oder beginnen Strings in VB.Net mit dem Index 1?

            Grüße,

            Jochen

            1. Hallo!

              Oder beginnen Strings in VB.Net mit dem Index 1?

              Also bevor das .Net nach VB stand, begannen Indizes mit 1, bzw. konnte man das mit 'Option Base' festlegen.
              In VB.Net sollten Indizes mit 0 beginnen, bei IndexOf ist das definitiv der Fall: http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemstringclassindexoftopic1.asp

              Beste Grüße
              Viennamade

            2. Hallo Jan,

              mein einsatz: kasten pilz ;).

              ok, einverstanden. Wie kaspern wir das aus? Du kommst aus .... Duelmen? Das ist nicht gerade bei mir ums Eck. Außerdem habe ich kein VB.Net um dir ggf. das Gegenteil zu beweisen.

              was macht dein VB.Net bei:
              Dim mStr As String = "testtest1"
              Dim idx As Integer = mStr.IndexOf("test1")
              If idx > 0 Then
                 messagebox.show("test")
              End If

              und wenn du daraus ein:

              idx=1
              If idx > 0 Then
                 messagebox.show("test")
              End If

              machst? btw. Muss es nicht "If idx >= 0 Then" heisen? Denn IndexOf("test1") kann doch auch 0 liefern wenn der String an erster Stelle beginnt. Oder beginnen Strings in VB.Net mit dem Index 1?

              öhm, eigentlich ist es auch völlig egal was indexOf liefert ;). ich kann da auch folgendes hinschreiben, und auch nur das.

              If 1=1 then
                ... 'dieser code wird nicht ausgeführt
              end if

              es liegt also scheinbar nur an dem vergleich.

              Gruß,
              Jan

              1. Moin Jan,

                If 1=1 then
                  ... 'dieser code wird nicht ausgeführt
                end if

                dann ist entweder a) dein VB.net kaputt, oder b) du postest aus einem Paralleluniversum in dem andere Gesetze gelten. a) ist wahrscheinlicher.

                Grüße,

                Jochen

                1. dann ist entweder a) dein VB.net kaputt, oder b) du postest aus einem Paralleluniversum in dem andere Gesetze gelten. a) ist wahrscheinlicher.

                  Moin Jochen :)!

                  jupp a) _wäre_ wahrscheinlicher, _WENN_ das ergebnis auf nem anderen rechner nicht das gleiche wäre. Und, was ich bisher noch nicht gesagt hab: 3 zeilen später mach ich im prinzip das gleiche. ich suche den string nach dem gleichen teilstring ab und da ist das ergebnis von idx >= 0 wahr.

                  Gruß zurück :)

                  1. Mönsch Jan ...

                    3 zeilen später mach ich im prinzip das gleiche. ich suche den string nach dem gleichen teilstring ab und da ist das ergebnis von idx >= 0 wahr.

                    ist doch klar:
                    Mach halt vor der fehlerhaften Zeile 3 Zeilen mit NOPs. Dadurch rutscht der fehlerhafte Vergleich 3 Zeilen tiefer und wird dadurch zu einem funktionierenden Vergleich. Du musst nur darauf achten, dass für die weiteren Zeilen mit einem if folgende Bedingung wahr ist:
                    Zeilennummer % 3 = 0 Das musst du durch einfügen weiterer NOPs ggf. sicherstellen.

                    Logisch? ;)

                    Grüße,

                    Jochen

                  2. Hallo Jan,

                    jupp a) _wäre_ wahrscheinlicher, _WENN_ das ergebnis auf nem anderen rechner nicht das gleiche wäre. Und, was ich bisher noch nicht gesagt hab: 3 zeilen später mach ich im prinzip das gleiche. ich suche den string nach dem gleichen teilstring ab und da ist das ergebnis von idx >= 0 wahr.

                    poste doch mal etwas mehr Code - was kommt vor den betreffenden Zeilen, was danach?

                    Kann es nicht doch damit zusammenhängen, daß Dir da eine String-Variable etwas vermurkst (dürfte natürlich bei If 1 = 1 nicht sein)?

                    Probiere das mal aus:

                    a = 1
                    b = "1"
                    if a < b then msgbox "Hallo" 'Kenne die .net-Syntax nicht

                    Diese Bedingung müßte wahr sein.

                    Irgendwie habe ich den Eindruck, daß ich bei VB6 bleiben sollte ...

                    Viele Grüße

                    Jörg

                    1. poste doch mal etwas mehr Code - was kommt vor den betreffenden Zeilen, was danach?

                      Kann es nicht doch damit zusammenhängen, daß Dir da eine String-Variable etwas vermurkst (dürfte natürlich bei If 1 = 1 nicht sein)?

                      Probiere das mal aus:

                      a = 1
                      b = "1"
                      if a < b then msgbox "Hallo" 'Kenne die .net-Syntax nicht

                      Diese Bedingung müßte wahr sein.

                      Irgendwie habe ich den Eindruck, daß ich bei VB6 bleiben sollte ...

                      So, nach langem hin und her: hier die Lösung!

                      Man solls ja nicht glauben, aber der Compiler von VB.Net ist in gewisserweise neunmalklug. Warum? Weil er scheinbar bei einer If-Bedingung die letzte Zeile von dem Code überprüft, der ausgeführt werden würde, wenn die Bedingung wahr ist. Was passiert also bei der Überprüfung in meinem Fall:

                      Nochmal der Code:

                      Dim mStr As String = "testtest1"
                      if 1 = 1 Then
                         mStr = mStr
                      End If

                      mStr = mStr - wird nicht ausgeführt, da es die letzte Zeile des "If-Codes" ist _UND_ es zu keiner Veränderung der Variable mStr oder im Speicher kommt.

                      Anders siehts in den beiden folgenden Fällen aus:

                      1.
                      Dim mStr As String = "testtest1"
                      if 1 = 1 Then
                         mStr = mStr 'Nur diese Zeile wird ausgeführt
                         mStr = mStr
                      End If

                      2.
                      Dim mStr As String = "testtest1"
                      if 1 = 1 Then
                         mStr = mStr 'Beide Zeilen Code werden ausgeführt
                         mStr = ""
                      End If

                      Man sollte sich schon fast bei M$ beschweren, dass der Compiler nicht das tut, was man ihm vorgibt zu tun!

                      Also, damit ist bewiesen, dass ich aus keinem Paralleluniversum komm ;).

                      So, aber trotzdem besten Dank an alle für die ganzen Antworten!

                      Gruß,
                      Jan

                      1. Hi,

                        So, nach langem hin und her: hier die Lösung!
                        mStr = mStr - wird nicht ausgeführt, da es die letzte Zeile des "If-Codes" ist _UND_ es zu keiner Veränderung der Variable mStr oder im Speicher kommt.

                        https://forum.selfhtml.org/?t=87202&m=517862 ;-)

                        Man sollte sich schon fast bei M$ beschweren, dass der Compiler nicht das tut, was man ihm vorgibt zu tun!

                        Das nennt sich "optimieren" - warum sollte etwas ausgeführt werden, was keine Auswirkungen hat?

                        cu,
                        Andreas

                        --
                        MudGuard? Siehe http://www.Mud-Guard.de/
                        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                        1. Moin!

                          Das nennt sich "optimieren" - warum sollte etwas ausgeführt werden, was keine Auswirkungen hat?

                          Wenn man diese Optimierung irgendwo ausschalten kann ist das ja noch in Ordnung. Aber wenn nicht, dann find ich das etwas unverschämt, nicht das zu tun was _ich_ will. Denn ich hab mir ja was dabei gedacht. Und sei es noch so abstrus. Und wenn man diesen Gedanken einmal weiterführt, weiß man warum die Robots im Film I,Robot bösartig werden - weil ihr Compiler nicht das tut was man ihm sagt ;). Vorrausgesetzt die laufen mit M$ OS *gg*.

                          In diesem Sinne....

                          Gruß,
                          Jan

                      2. Hallo!

                        Man solls ja nicht glauben, aber der Compiler von VB.Net ist in gewisserweise neunmalklug. Warum? Weil er scheinbar bei einer If-Bedingung die letzte Zeile von dem Code überprüft, der ausgeführt werden würde, wenn die Bedingung wahr ist.

                        Jo warum hast den das Posting 13 Minuten nach Threadbeginn nicht berücksichtig? https://forum.selfhtml.org/?t=87202&m=517862

                        Beste Grüße
                        Viennamade

                        1. Jo warum hast den das Posting 13 Minuten nach Threadbeginn nicht berücksichtig? https://forum.selfhtml.org/?t=87202&m=517862

                          Sorry, ja. Hätt ich mal machen sollen. Habs irgendwie verschwitzt ;).

                          Gruß,
                          Jan

                      3. Hi Jan,

                        Ich kann da auch messagebox.show("test") oder sonst was hinschreiben. Das Ergebnis ist immer das gleiche.

                        Bist du dir da _wirklich_100%_sicher_? Ich glaube dir nicht ... möchtest du wetten? Dein Einsatz!

                        Dein Einsatz war ein Pils(z) .... wann kommst du mit dem Kasten bei mir vorbei?

                        Grüße, und ein schönes Wochenende

                        Jochen

                        1. Dein Einsatz war ein Pils(z) .... wann kommst du mit dem Kasten bei mir vorbei?

                          Da hastn ;).
                                   __________
                                  / O  O  O  /|
                                 / O  O  O  / |
                                /_O__O__O_ /  |
                               | Selfhtml  |  /
                               |  Pilsener | /
                               |___________|/

  2. Unter Umständen kann gelten 4=0. Dies ist zum Beispiel im Restklassenring modulo 4 der Fall.

    1. Tach,

      Unter Umständen kann gelten 4=0. Dies ist zum Beispiel im Restklassenring modulo 4 der Fall.

      Der Restklassenring modulo 4 hat kein Element mit dem Namen 4. Es ist jedoch richtig, dass 4 mod 4 = 0 mod 4 gilt.

      mfg
      Woodfighter

      1. Der Restklassenring modulo 4 hat kein Element mit dem Namen 4. Es ist jedoch richtig, dass 4 mod 4 = 0 mod 4 gilt.

        Jo, das ist richtig. Nur ich mach ja keine Modulo-Division ;). Das is ja gerade das "coole" dran ;).

        Gruß,
        Jan