großes Array

Willkommen!

Wenn du im Nexave-Forum mitmachen möchtest, schreib an community@nexave.de. Wir haben die Registrierungsfunktion in unserem Diskussionsforum nämlich deaktiviert, weil sich praktisch nur noch Spammer und Werbebots registriert haben. Per E-Mail sind wir dir gern behilflich, einen Account anzulegen.
  • Hallo,
    bin noch kein PalmOS Profi.
    Meine Frage (für Tungsten E2 IDE=Eclipse C)
    Ich will für ein 16bit bmp vorrübergehend ein Array anlegen.


    unter c ist das ja kein problem -> UInt16 IMG[8129];


    doch da gibt es doch irgend einen Memorymanager
    -> IMG = MemPtrNew(8129);


    dann MemPtrFree(IMG) ;
    ->Error un-freed chunk
    der Speicher wird nicht freigegeben!


    wozu eigendlich der Memorymanager?
    danke mti

    • Offizieller Beitrag

    1. PODS ist C
    2. Du hast nur einen beschränkten dynamischen Speicher, aber 8kb sind kein Problem, nur würde ich sie nciht auf'm Stack anlegen (also UInt16 img[8129])
    3. Der Memory Manager funktioniert schon. Nur kann MemPtrNew nicht mehr als 64kB alloziieren. Es gibt eine Glue-Funktion (ist eine mitgelieferte Link-Library), die kann mehr.
    4. Am besten ist es Du machst FtrPtrNew(), dann den ganzen Quatsch mit DmWrite renikopieren und gnaz ncormal auslesen. FtrPtrFree oder so, gibt den Speicher wieder frei. Du darfst auf keinen Fall die Fehlerabfragen vergessen, Palm's sind Geräte mit beschränkter HW, da gehen Anfragen zur Speicherbelegung schneller mal schief, als es unter Desktopsystemen passiert.


    Gruß
    Henk

  • Sorry, aber wenn ich deinen Post riochtig verstehe, sieht dein Code so aus:


    UInt16 IMG[8129];


    IMG = MemPtrNew(8129);


    MemPtrFree(IMG) ;



    Warum definierst du das Array zuerst und lässt den Compiler ihm dabei Code zuweisen, um ihm dann (nochmals) Speicher zuzuweisen. Ich würde den Code so machen:


    UInt16* img;
    img=MemPtrNew.......


    Wenn du ein Array den Compiler aufbauen lässt, musst du es nicht freen. Ansonsten schon.

  • Hallo,
    danke für die Antworten.
    bin noch nicht 100% durchgestiegen.
    UInt16 IMG[8192] auf dem Stack geht bei mir nicht( wären 16,384 Kb)
    Bei dem angefügtem Code wird ein 128x64 bmp dargestellt.
    In der Laufzeit des Codes gibt es keine Fehler,
    nur wird der chunk irgendwie mit MemPtrFree(IMG) nicht freigegeben.
    beim Simulator kommt immer eine un-freed-chunk Fehlermeldung beim Programmverlassen.
    und nochetwas wenn ich einen Pointer mit MemPtrNew auf ein Array in einer Funktion hohle ist dieses Array dann Global? könnte ich den Zeiger weitergeben und irgendwoanders freen?
    danke für Hilfe


    void Bmp16(void)
    {


    BitmapType *bmpP;
    BitmapTypeV3 *bmpPV3;
    Err error;

    UInt16 i;
    UInt8 x=100,y=100;

    //UInt16 IMG1[8192];

    UInt16 *IMG;
    IMG = MemPtrNew(16384);
    ErrFatalDisplayIf( !IMG, "No Memory" );

    for(i=0;i<8192;i++){
    IMG[i]= 0x001F; // Blau
    }

    bmpP = BmpCreate(128,64, 16,NULL, &error);
    if (bmpP) {
    bmpPV3 = BmpCreateBitmapV3(bmpP,kDensityDouble,IMG,NULL);
    if (bmpPV3) {
    WinPushDrawState();
    WinSetCoordinateSystem(kCoordinatesNative);
    WinDrawBitmap((BitmapType*)bmpPV3,x,y);
    WinPopDrawState();
    }
    }
    i=MemPtrFree(IMG);
    ErrFatalDisplayIf( i, "No Relase Memory" );
    }

  • Ich bin selber net der Bitmap-Profi. Aber eventuell musst du das Bitmap freigeben!


    Generell rate ich dir, dein Problem auf dwer Palm OS Developer mailing list zu besprechen und nicht hier. es tut mir leid@all, aber dort sind 99% der angemeldeten User Entwickler!


    und nochetwas wenn ich einen Pointer mit MemPtrNew auf ein Array in einer Funktion hohle ist dieses Array dann Global? könnte ich den Zeiger weitergeben und irgendwoanders freen?


    Was meinst du damit? Ein Pointer auif ein lokales Array? No chance. Ein Pointer auf ein mit MemPtrNew definiertes Array-ok. generwell ist Speicher, der dem Compiler gehört, am Ende der Instanz(der Funktion, des Blocks,..) weg.Speicher der dem OS gehört zund den du angefordert hast, bleibt bestehen. Das gilft aber nix, wenn du erst einmal den Pointer verloren hast!

    • Offizieller Beitrag

    BmpCreate belegt auch den Speicher für diese Bitmap. Der muß dann zusammen mit der Bitmapstruktur durch BmpDelete freigegeben werden.


    Auch die Bmp3 muß per BmpDelete freigegeben werden.


    Außerdem solltest Du sicherstellen, das bei Deinem Pixelarray auch der Pitchwert stimmt. Am Besten belegst nciht Du den Speicher für die Pixeldaten, sondern läßt das das System machen:


    bmpP = BmpCreate(128,64, 16,NULL, &error);


    Dann holst Du Dir den Zeiger auf die Pixeldaten:


    UInt16 *IMG = (UInt16 *) BmpGetBits(bmpP);


    und schreibst da rein unter Beachtung des rowBytes Wertes aus BmpGetDimensions().


    Dann konvertierst Du in eine Type3 Bitmap:


    bmpPV3 = BmpCreateBitmapV3(bmpP, kDensityDouble, BmpGetBits(bmpP), NULL);


    Später räumst Du auf


    mit 2 x BmpDelete: 1. bmpPV3, 2. bmpP



    Dieser Weg hat den Vorteil, das Du


    1. Immer den richtigen Pitch (rowBytes) verwendest.
    2. Beliebig Große Bitmaps erzeugen kannst (größer als 64 kB) ab PalmOS 4.0 oder so.



    Gruß
    Henk

  • Generell rate ich dir, dein Problem auf dwer Palm OS Developer mailing list zu besprechen und nicht hier. es tut mir leid@all, aber dort sind 99% der angemeldeten User Entwickler!


    ich newbe wie geht das?