kostenloser Webspace werbefrei: lima-city


int in byte casten geht nicht? o.o

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    reimann

    Kostenloser Webspace von reimann

    reimann hat kostenlosen Webspace.

    Also hab mal wieder ein eigentlich sinnloses Problem, aber im Internet hab ich irgendwie keine richtige Lösung gefunden. Zumindest keine die ich verstehe. Deshalb würde ich hier gern mal fragen, wie man einen int in einen byte casten kann.
    Zur Berechnung brauch ich einen signed int wegen Minus, aber wenn es dann in einer Datei gespeichert werden soll, hat es einen Wert größer 0 und kleiner als 150, was ja in ein Byte passt und deshalb wollte ich Platz sparen, allerdings gibt mir der Compiler "C5767 (W) Conversion from pointer to smaller integer " aus.

    undo ist eine Arrayklasse, in der man alle Datentypen speichern kann, deshalb muss das sowieso gecastet werden.
    void* GetAt ( int nIndex ) ist halt die Methode um einen der gespeicherten Zeiger zu erhalten.
    f ist eine Klasse zum Speichern von Daten in einer Datei.

    Quelltext:
    f.WriteByte( (byte) undo.GetAt( i - 1 ) );

    void*  GetAt ( int nIndex )


    Beitrag zuletzt geändert: 20.5.2009 21:19:56 von reimann
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. e********l

    Naja, du sagst doch selbst das du nur den Zeiger von der Funktion bekommst und afaik kann man Zeiger nicht casten. Nur deren Werte.
  4. Autor dieses Themas

    reimann

    Kostenloser Webspace von reimann

    reimann hat kostenlosen Webspace.

    evil-devil schrieb:
    Naja, du sagst doch selbst das du nur den Zeiger von der Funktion bekommst und afaik kann man Zeiger nicht casten. Nur deren Werte.


    Jop das habe ich mittlerweile auch mitbekommen.
    Ich habe dann herausgefunden wie man die Werte von Zeigern ausließt. Dumm nur das der Compiler jetzt zwar sagt, dass es in Ordnung ist, nur das Programm stürzt trotzdem jedesmal ab, wenn dieser Wert, in eine neue Variable gepackt, gespeichert werden soll.

    Beitrag zuletzt geändert: 21.5.2009 19:04:16 von reimann
  5. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    Natürlich stürzt das Programm ab. Ich nehme an du gibst in der Funktion GetAt() die Adresse einer lokalen Variable der Funktion zurück? Nur leider existiert die Variable nicht mehr wenn die Funktion beendet wird und somit ist ein Pointer auch nichts mehr wert.

    Beitrag zuletzt geändert: 21.5.2009 20:25:05 von kochmarkus
  6. Autor dieses Themas

    reimann

    Kostenloser Webspace von reimann

    reimann hat kostenlosen Webspace.

    kochmarkus schrieb:
    Natürlich stürzt das Programm ab. Ich nehme an du gibst in der Funktion GetAt() die Adresse einer lokalen Variable der Funktion zurück? Nur leider existiert die Variable nicht mehr wenn die Funktion beendet wird und somit ist ein Pointer auch nichts mehr wert.


    Tut mir leid, aber das verstehe ich irgendwie nicht ganz. Welche Funktion denn?
    GetAt() gibt den pointer zu einem Objekt wieder, welcher vorher per Add( pointer ) dem Array hinzugefügt wurde. Wo soll da eine Variable ungültig werden? o.o

    €dit: Achso jetzt verstehe ich. Natürlich! Ich habe ja den Pointer per &int übergeben und das nicht mit new gemacht.
    Danke für den Tipp.:thumb:

    €dit2: Komisch funktioniert doch immernoch nicht. -_________-

    Beitrag zuletzt geändert: 21.5.2009 20:56:43 von reimann
  7. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    Zeig doch mal zumindest auszugsweise den Code der Funktion GetAt(), dann kann ich meine Glaskugel wieder einpacken... :angel:
  8. Autor dieses Themas

    reimann

    Kostenloser Webspace von reimann

    reimann hat kostenlosen Webspace.

    kochmarkus schrieb:
    Zeig doch mal zumindest auszugsweise den Code der Funktion GetAt(), dann kann ich meine Glaskugel wieder einpacken... :angel:


    Wenn ich das könnte hätte ichs schon gemacht. Aber das ist gleich bei der SDK mit dabei gewesen und ich habe den Array nur um die Funktion DeleteAt( int index ) und DeleteAll() erweitert.
    Aber ich schau mal nach in der SDK muss es ja irgendwo stehen.
    Im Übrigen geht es wieder um den Taschenrechner: CLasspad 300, den ich progge. Deshalb solche seltenen Funktionen.
    Sry aber ich konnte nur CPArray.h finden, aber da steht ja auch was drüber drin:
    /******************************************************************************
    	Copyright (C) 2004 CASIO COMPUTER CO.,LTD. All rights reserved.
    
    	Unauthorized redistribution of this source code, in whole or part,
    	without the express written permission of CASIO COMPUTER CO.,LTD
    	is strictly prohibited.
    ******************************************************************************/


    Sry hab jezze erst gelesen was da steht und deshalb alles andere wieder entfertn, aber ich schicks dir mal per PN.

    Mein Quelltext dazu sieht so aus(SIGNED ist eine Wrapperklasse (? oder sowas ähnliches) für signed int, damit es keine Probleme mit dem Speicher gibt, da int ja auf verschiedenen System unterschiedlich groß ist):
    Im Header steht( GameArray ist eine Unterklasse von CPArray mit meinen speziellen Erweiterungen.(siehe oben) ):
    GameArray undo;

    In der cpp-datei:
    void ShogiDocument::SetUndo( SIGNED *p1, ShogiFigure* f1, SIGNED *p2, ShogiFigure* f2 ) {
        undo.Add( p1 );
        undo.Add( f1 );
        undo.Add( p2 );
        undo.Add( f2 );
    }
    
    void ShogiDocument::Write( CPWriteFile &f ) {
    	CPMEMFileHeader header( SHOGI_MEMTYPE_HEADER, SHOGI_MEMTYPE_SAVED_STATE );
    	header.Write( f );
    	if( f.IsNotError() ) {
    	    f.WriteByte( 1 );
    	    f.WriteByte( player );
            f.WriteInt( turn );
            for( SIGNED i = 0; i < 81; i++ ) {
                ShogiFigure *figure = (ShogiFigure*) board.GetAt( i );
                figure->Write( f );
            }
            for( SIGNED i = 0; i < 16; i++ ) {
                f.WriteByte( hands[i] );
            }
            f.WriteInt( undo.GetSize() );
            for( SIGNED i = 0; i < undo.GetSize(); i = i + 2 ) {
                SIGNED *x = (SIGNED*) undo.GetAt( i - 1 );
                f.WriteInt( *x );
                ShogiFigure *figure = (ShogiFigure*) undo.GetAt( i );
                figure->Write( f );
            }
            f.WriteInt( redo.GetSize() );
            for( SIGNED i = 0; i < redo.GetSize(); i = i + 2 ) {
                SIGNED *x = (SIGNED*) redo.GetAt( i - 1 );
                f.WriteInt( *x );
                ShogiFigure *figure = (ShogiFigure*) redo.GetAt( i );
                figure->Write( f );
            }
            
    	}
    }


    Der Afuruf erfolgt so:
    // set undo state
                    SIGNED *p1 = new SIGNED();
                    *p1 = point1;
                    SIGNED *p2 = new SIGNED();
                    *p2 = point2;
                    GetShogiDocument()->SetUndo( p1, (ShogiFigure*) GetButtons()->GetAt( point1 ), p2, (ShogiFigure*) GetButtons()->GetAt( point2 ) );

    und Write() wird immer aufgerufen, wenn man speichern klickt oder das Programm beendet.

    Beitrag zuletzt geändert: 23.5.2009 9:08:46 von reimann
  9. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    Hm, also ich kann da jetzt keinen offensichtlichen Fehler finden. Hast du dein Programm den schonmal debuggt und bei dem Schritt bevor das Programm abstürzt alle Werte überprüft?
  10. Autor dieses Themas

    reimann

    Kostenloser Webspace von reimann

    reimann hat kostenlosen Webspace.

    Ich hab den Fehler gefunden.
    Er war wie immer sowas von bescheuert. Aber das debuggen hat keine Erkenntnisse gebracht, sondern einfache Logik und die brauch bei mir dummerweise ne gewisse Zeit zum grübeln.
    Wenn man sich
    for( SIGNED i = 0; i < undo.GetSize(); i = i + 2 ) {
                SIGNED *x = (SIGNED*) undo.GetAt( i - 1 );
                f.WriteInt( *x );
                ShogiFigure *figure = (ShogiFigure*) undo.GetAt( i );
                figure->Write( f );
            }

    ansieht sollte einem eigentlich auffallen, dass dadurch versucht wird, ein Objekt mit dem Index -1 auszulesen, da der Index aber bei CPArray IMMER bei 0 startet, gibt die Funktion nonsens zurück. Ich habe das Problem einfach behoben, indem ich
    for( SIGNED i = 0; i < undo.GetSize(); i = i + 2 ) {
                SIGNED *x = (SIGNED*) undo.GetAt( i );
                f.WriteInt( *x );
                ShogiFigure *figure = (ShogiFigure*) undo.GetAt( i + 1 );
                figure->Write( f );
            }

    daraus gemacht habe, was genau das Ergebnis liefert, was ich haben wollte.
    Freunde und Bekannte sagen meist ich hätte eine Begabung für sowas (bzw. denken sie alle die sich mit sowas "abstrusem" beschäftigen bräuchten eine Begabung), aber solche Fehler lassen mich daran stark zweifeln.:lol:
  11. c****s

    >> Naja, du sagst doch selbst das du nur den Zeiger von der Funktion bekommst und afaik kann man Zeiger nicht casten. Nur deren Werte.

    Pointer kann man klar casten. Das macht die ganze Pointerarithmetik von C ja erst möglich. Pointer sind auch nichts weiter als integer (also DWORD oder QWORD abhängig von der Architektur).
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!