Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Pointer überlauf

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
30.08.2006, 18:57 Uhr
xXx
Devil


Hmm naja ... der Titel sag es eigentlich schon ... hier mal der verkürzte Codeausschnitt der das PRoblem veruhrsacht:

C++:
for(unsigned i = 0, y = 0; i < show_lines; ++i, ++y)
    {
         // Zeiger auf den Text des momentanen Items(i) holen.
        char* p    = items[i + pScroll->GetPos()].str;        

        // Solange der Pointer p existiert und *p =! '\0' ist durchlaufen...
        while ((p != NULL) && (*p != '\0'))        
        {  
            // Anzahl der Zeichen unseres Pointers p
            unsigned short length        = (unsigned short)strlen(p);    
            
            if(length < 1)
                break;

            // Wie viele dieser Zeichen passen auf die Breite?
            unsigned short charcount    = font->GetCharCount(
                   p
                   , (unsigned int)length
                   , width - 4 - px
                   );
    
            // Zeichnen...(mit breite - 4px - spielernamebreite in px)
            font->Draw(
                    GetX() + 2 + px
                    , 2 + GetY() + y * font->GetHeight()
                    , p
                    , DF_LEFT
                    , items[i + pScroll->GetPos()].color
                    , width - 4 - px
                    );            
                                      //  ...

            // Ist unser String kürzer bzw. genauso lang wie max. in unser Ctrl passt?
            if (length <= charcount)    
                break;                    // Nächster String ....

            // charcount Zeichen wurden also schon gezeichnet ...
            // wollen wir beim nächsten mal net mehr sondern
            // schieben unseren Pointer mal vor ;)
            for (unsigned n = 0; n < charcount; ++n)    
                ++p;                    // Vorschieben ...

            // Eine neue Zeile anlegen, damit die y Koordinaten des Strings stimmen...        
            ++y;                        
        }
}

Hmm das Problem ist wenn ich es so machen würde zeichnet er noch ein haufen zeichen kreuz und quer die da nix zu suchen haben Scheint irgendwei net an der richtigen stelle aufzuhören ... jemand ne Idee woran es liegt?


Bearbeitung von ao:
Quelltext umformatiert.

Dieser Post wurde am 01.09.2006 um 08:48 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.08.2006, 22:33 Uhr
xXx
Devil


keiner ne Idee oder braucht ihr noch was?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.08.2006, 22:47 Uhr
stephanw
localhorst


Der Code ist durch die Formatierung hier im Forum schlecht leserlich. Aber die ganze Zeiger-Zauberei macht das Lesen auch nicht einfacher.
Ist p denn null-terminiert ? Sonst sucht sich strlen zu Tode nach dem Ende.
Prinzipiell: sind die Casts alle nötig ? Warum strlen-Rückgabe auf unsigned short casten ?
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.08.2006, 23:36 Uhr
~Blubber2063
Gast


Naja, also wäre ganz gut die Größe deines Item feldes zu kennen, außerdem kennen wir deine Klassen auch nicht und nebenbei der Code sieht einfach grauenhaft formattiert aus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.09.2006, 09:05 Uhr
ao

(Operator)


Ich schnalle überhaupt nichts von dem Code. Das hier ist wirklich krass:

C++:
            font->Draw(
                    GetX() + 2 + px
                    , 2 + GetY() + y * font->GetHeight()
                    , p
                    , DF_LEFT
                    , items[i + pScroll->GetPos()].color
                    , width - 4 - px
                    );            


Von den 6 übergebenen Argumenten sind 4 on-the-fly berechnete Ausdrücke, und zwei davon sind echt kompliziert. Wer soll das nachvollziehen?

An deiner Stelle würde ich das aufdröseln, Zwischenergebnisse bilden und in Variablen speichern und dann erst an die Funktion weiterreichen. Dann könntest im Debugger kontrollieren, was für Daten an Draw übergeben werden; im Moment machst du das blind.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.09.2006, 13:48 Uhr
xXx
Devil


Hmm ... an der Funktion liegt es nicht Es liegt daran wie ich den pointer "nachvorne schiebe" Weil wenn ich mal einfach nur den string asugeben würde ... geht es ... aber zum erklären der von dir bemängelten stelle ao:


C++:
font->Draw(
    GetX() + 2 + px,  // GetX holt X Position des Ctrl ... + 2 für Rand ... + spielername(breite) in px...
    2 + GetY() + y * font->GetHeight(),  // Y Position ... +2 Rand ... y = Zeile ...
    p, // Der auszugebende Text
    DF_LEFT, // Ausrichtung
    items[i + pScroll->GetPos()].color, // farbe
    width - 4 - px // max. breite ... d.h. breite des ctrl - 4 für Rand und px für Spielername ...
);


stephanw:
Und ja es ist nullterminiert Der Wert stimmt auch ...

Hmm ... naja ... casten muss ich es eh weil Font::GetCharCount unsigned short retuniert... d.h. müsste ich sonnst beim überprüfen ob length <= charcount ist nach unsigned short casten ... und Font::GetCharCount verlangt nen unsigned int ... daher auch da wieder casten
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.09.2006, 22:55 Uhr
xXx
Devil


noch jemand nen vorschlag? Aja es liegt auch nicht daran das das items array nicht groß genug ist Wenn ich den text mit printf ausgeben lass(jedes mal wenn eine reihe fertig ist) dann ist der text ja auch da ... naja das problem liegt der warscheinlich daran das ich das p einfach immer mit p++ nach vorne schieb ... irgendwas amch ich da falsch Jemand ne Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.09.2006, 00:04 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Na ja, du schiebst mit ++p vor,nicht mir p++ ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.09.2006, 08:28 Uhr
Tommix



'Morgen,

Zitat von J-jayz-Z:
Na ja, du schiebst mit ++p vor,nicht mir p++ ...

Und?
Davon mal ab würde ich eher

C++:
p += charcount;


schreiben. Ansonsten würde ich hier mal einen Debugger bemühen und mir ansehen, ob in den Variablen das steht, was ich geplant hatte (siehe ao).

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.09.2006, 08:18 Uhr
ao

(Operator)



Zitat von Tommix:
Ansonsten würde ich hier mal einen Debugger bemühen

Das läuft auf eigene Initiative heraus. Das scheint bei einigen Leuten hier zuviel verlangt zu sein.

allmählich ernüchtert
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: