malloc-Problem



  • Hi Everyone

    Bezüglich meines "Bilder zeichnen"-Problems wurde mir in diesem Forum schon vermehrt geholfen. Da hab' ich mir gedacht, versuch' ich's doch einfach noch mal 😃

    Es geht darum, dass ich eine Bitmap-Grafik in einen Char Array, welches ich mit malloc kreiert habe, ablege und das ganze per CGI verschicke.

    Das geht alles ganz gut, bis zu einer Alloziiergrösse von 32768 Bytes. Wenn ich darüber gehe (z.B. mit einem Bitmap 600x200 Pixel, 4 Bit Color Depth), spielt meine drawPixel-Funktion völlig verrückt und die Koordinate (0, 0) befindet sich plötzlich im linken unteren Bildbereich oder sonstwo 😞

    Ist es möglich, dass malloc mit so grossen Werten plötzlich Unsinn fabriziert? Oder wo könnte sonst der Fehler liegen?

    Danke und Gruss
    Kessi

    PS: Es handelt sich um eine 16-Bit CPU, mit über 340k Speicher.



  • Was liefert sizeof size_t? Oder schau, als was size_t definiert ist. Da du eine 16-Bit Architektur hat, sollte ein int 16-Bit lang sein, was für 65536 Werte reicht.
    Etwas verwirrt bin ich davon, dass der Fehler bei 32768 (also 2^15) kommt. Eigentlich müsste size_t unsigned sein. Naja, ist für dich wohl eh egal, über diese Grenze kommst du mit malloc einfach nicht hinweg.



    1. Hier ist das C++ Forum. Wenn du mit C++ arbeitest, nimm new, statt malloc.
    2. Kann es sein, dass dein Speicher voll ist?
    3. Bei so geringen Ressourcen, solltest du dir überlegen, ob du bei 4 Bit Farbtiefe nicht besser 2 Pixel pro Byte speicherst. Damit halbierst du den Speicherbedarf (natürlich braucht es mehr Rechenzeit, weil du die Bytes zusammen und wieder auseinander shiften musst).

  • Mod

    vielleicht sind ja auch die ints nur 16bit breit und die berechnung des speicherbedarfs erfolgt ohne berücksichtigung des drohenden überlaufs ?



  • ich nehme an irgendein index o.ä. auf die bilddaten ist irrtümlicherweise 'signed'



  • Hm... mit "unsigned" könnte ich meinen Speicherbeplatz also verdoppeln... Allerdings übergebe ich der malloc-Funktion bereits einen "unsigned long". Klar, so wie ihr mir das erklärt habt, kann malloc höchstens einen int alloziieren, und der long ist also Unsinn (gibt auch einen Conversion Error). Aber warum ist der long dann plötzlich "signed", denn meine magische Grenze scheint sich ja, wie erwähnt, bei 32'768 zu befinden 😞 ?


Anmelden zum Antworten