Index größer als Arraygröße -- trotzdem ergebnis?



  • Ich komm von C# und versuche gerade einen Code zu übersetzten. Jedoch sind meine C++ Kenntnisse nicht ganz so gut. Und jetzt bin ich eben irgendwie verwirrt. Und zwar habe ich folgendes Array:
    http://fessifi.de/~nikeee/holzshare/images/du1d5r.png
    So nun sieht man unten in der Überwachung es ist 17 groß (index 0 - 16).
    Wenn ich jetzt aber im direkt Fenster einen index von z.b 100 eingebe kommt trotzdem ein ergebnis raus... wieso?
    Und das komische ist, dass das anscheinend gewollt ist, da in diese code indexe bis zu 67 vorkommen. Doch was ist auf index 67? Denn bei sizeof(ColorScale) kommt 68 raus. Rufe ich also mit ColorScale[67] ein byte auf? oder was?
    ich bin verwirrt.



  • Weil C++ die Adresse vom ersten Element nimmt, da 100 drauf addiert und dann den Wert der an dieser Speicheradresse vorliegt auswertet. Eine Überprüfung gibt es dort nicht, denn die würde etwas kosten und in C++ muss man für nicht zahlen, dass man nicht ausdrücklich haben will.
    Wenn Du vernünftiges C++ schreiben würdest und einen std::vector oder std::array benutztest hättest du die Wahl zwischen dem [] operator, der keine Überprüfung vornimmt und der at Methode, die im Fall einer Überschreitung der Grenzen ein Ausnahme wirft.



  • Wenn der Index dann zu hoch wird, werfen sie (die at() Funktionen) eine std::out_of_range Exception mit der Funktion, die diese Warf; bei vector bspw. Vector::_M_range_check.



  • wie gesagt der code ist nicht von mir



  • c++neuling001 schrieb:

    wie gesagt der code ist nicht von mir

    Fühlst du dich jetzt schuldig? 😃



  • Schon leicht 😃
    Und die Antwort die ich bekommen habe ist so wie ich es mir dachte. Sprich wenn ich das richtig verstehe ist es Zufall was im Speicher außerhalb des Arrays steht?
    Doch wie kann das denn funkionieren, denn es kommen bei der Anzeige des Codes keine Zufalls farben heraus sondern alles passt genau (handelt sich um eine Audio Frequenz Anaylse).

    Das ist mir eben das Rätzel



  • c++neuling001 schrieb:

    Und die Antwort die ich bekommen habe ist so wie ich es mir dachte. Sprich wenn ich das richtig verstehe ist es Zufall was im Speicher außerhalb des Arrays steht?

    Nö. Es ist für dich allerdings unrelevant.

    c++neuling001 schrieb:

    Doch wie kann das denn funkionieren, denn es kommen bei der Anzeige des Codes keine Zufalls farben heraus sondern alles passt genau (handelt sich um eine Audio Frequenz Anaylse).

    Das ist mir eben das Rätzel

    Dann ist das Zufall.



  • Das ist trotzdem komplett unmöglich...
    hier ist der code wo das array benutzt wird:

    COLORREF ColorScale [] = 
    {
    	RGB(0, 0, 128), // dk blue
        RGB(0, 0, 255), // lt blue
        RGB(0, 255, 0), // lt green
        RGB(0, 255, 0),
        RGB(255, 255, 0), // lt yellow
        RGB(255, 255, 0),
        RGB(255, 255, 0),
        RGB(255, 255, 0),
        RGB(255, 128, 0), // orange
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 0, 0) // lt red
    };
    
    COLORREF MapColor (int s)
    {
    	s /= 16;
    	if (s > sizeof (ColorScale) - 1)
    		s = sizeof (ColorScale) - 1;
    	return ColorScale [s];
    }
    

    Und ich habe schon indexe von bis zu 1400 gemossen... trotzdem kommt ein wunderbares bild heraus.



  • [quote="c++neuling001"]

    COLORREF ColorScale [] = 
    {
    	RGB(0, 0, 128), // dk blue
        RGB(0, 0, 255), // lt blue
        RGB(0, 255, 0), // lt green
        RGB(0, 255, 0),
        RGB(255, 255, 0), // lt yellow
        RGB(255, 255, 0),
        RGB(255, 255, 0),
        RGB(255, 255, 0),
        RGB(255, 128, 0), // orange
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 128, 0),
        RGB(255, 0, 0) // lt red
    };
    

    COLORREF ColorScale [] definiert ein Array von n Elementen vom Typ COLORREF, wobei die Anzahl n durch die Zahl der angegebenen Initialisierungselemente bestimmt wird.


    Wenn du den MSVC Compiler benutzt, kannst du das Makro _countof benutzt, das liefert dir die Anzahl der Elemente eines Arrays, also

    _countof(Colorscale)==17
    

    Wenn du Indexe >16 oder <0 auf dein Array anwendest, greifst du auf Speicherbereich außerhalb des Arrays zu, im besten Fall erhälst du eine Fehlermeldung (Compilezeit oder Laufzeit), und bekommst ein Ergebnis, dass du sicher nicht erwartest.



  • das ist mir alles klar. (kann halbwegs c++)
    Nur eines versteh ich nicht. Wenn er diesen Code benutzt um die Farben der einzelnen Pixel zu errechnen und das "Zufall" wie kommt man dann auf so ein schönes ergebnis:
    http://fessifi.de/~nikeee/holzshare/images/hnyjti.png



  • ach ja hab grad nochmal geschaut ob ich den link noch finde. Der source ist von hier:
    http://www.relisoft.com/freeware/freq.html

    also falls ich mir so falsch ausdrücke könnt ihr ja vll. mal hier nachschauen. Ich rede von der Datei Views.cpp



  • brotbernd schrieb:

    Eine Überprüfung gibt es dort nicht, denn die würde etwas kosten und in C++ muss man für nicht zahlen, dass man nicht ausdrücklich haben will.

    Es musste nur 30 Jahre jeder Scheiß kopiert werden, bis jemand auf die Idee kam, Move-Semantik einzuführen.



  • Habs mir mal angeschaut, pro durchlauf (d.h. Darstellung eines Bildes) sind ca. 6 pixel falsch. Das fällt kaum auf vorallem weil diese Pixel einheitlich (bei mir ziemlich konsistent Farbwert 7077920) "falsch" sind.



  • c++neuling001 schrieb:

    Das ist trotzdem komplett unmöglich...
    hier ist der code wo das array benutzt wird:

    COLORREF MapColor (int s)
    {
    	s /= 16;
    	if (s > sizeof (ColorScale) - 1)
    		s = sizeof (ColorScale) - 1;
    	return ColorScale [s];
    }
    

    Und ich habe schon indexe von bis zu 1400 gemossen... trotzdem kommt ein wunderbares bild heraus.

    Wo genau hast du was gemessen? Wie du siehst wird s im Code am Ende geclipt, so dass es nie werte größer als sizeof (ColorScale) - 1 annehmen kann. Und das ist im Array.



  • lolalter schrieb:

    brotbernd schrieb:

    Eine Überprüfung gibt es dort nicht, denn die würde etwas kosten und in C++ muss man für nicht zahlen, dass man nicht ausdrücklich haben will.

    Es musste nur 30 Jahre jeder Scheiß kopiert werden, bis jemand auf die Idee kam, Move-Semantik einzuführen.

    Hat er von vor ein paar Jahren geredet? Nein. Von jetzt.



  • Hacker schrieb:

    lolalter schrieb:

    brotbernd schrieb:

    Eine Überprüfung gibt es dort nicht, denn die würde etwas kosten und in C++ muss man für nicht zahlen, dass man nicht ausdrücklich haben will.

    Es musste nur 30 Jahre jeder Scheiß kopiert werden, bis jemand auf die Idee kam, Move-Semantik einzuführen.

    Hat er von vor ein paar Jahren geredet? Nein. Von jetzt.

    Das war vom ersten Tag an die Philosophie und wer nichts kopieren wollte musste auch nichts kopieren. Vieles ist/war in der STL aber auf Kopieren aufgebaut.



  • Wo genau hast du was gemessen? Wie du siehst wird s im Code am Ende geclipt, so dass es nie werte größer als sizeof (ColorScale) - 1 annehmen kann. Und das ist im Array.

    Jein. sizeof (ColorScale) == sizeof(COLORREF)*AnzahlDerElemente == 4*17 == 68.
    Die Funktion wird mit Parametern 1400+ aufgerufen, begrenzt wird das ganze auf 67, is aber immernoch außerhalb des eigentlichen arrays.


Log in to reply