AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

GetMem Problem

Ein Thema von blablab · begonnen am 8. Nov 2012 · letzter Beitrag vom 10. Nov 2012
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: GetMem Problem

  Alt 8. Nov 2012, 09:19
Was sagt GetLastError? Und warum die and not 31?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#2

AW: GetMem Problem

  Alt 8. Nov 2012, 09:48
(x + 31) and not 31 = auf 32-er-Schritte aufrunden (Info: geht natürlich nur mit 2er-Potenzen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: GetMem Problem

  Alt 8. Nov 2012, 09:59
GetLastError ist immer 0
(Wie vorher geschrieben hat deshalb die Fehlereingrenzung so lange gedauert)

"and not 31"
Das ist aus der function BytesPerScanline aus der unit Graphics geklaut.
Das "... + 31) and not 31" bewirkt, dass das Ergebnis immer ein Vielfaches von 32 ist. Zum Schluss wird es dann mit div 8 von Bit in Byte umgerechnet. Das bedeutet die benötigten Bytes einer Scanline werden immer zur nächsten 4Byte-Grenze aufgerundet. Das hab aber nicht ich so bestimmt, sondern Windows. Ich halt mich nur dran

Aber der Witz an der Sache ist ja, dass es immer einmal funktioniert und einmal nicht.
Es funktioniert immer bei dem Buffer, dessen Speicher zuerst reserviert wird. Ich kann GetDIBits tausend mal aufrufen mit hundert verschiedenen Puffern und es funktioniert immer genau bei dem Buffer, dessen Speicher zuerst reserviert wurde und bei allen anderen nicht. Die restlichen Parameter sind identisch. Und wenn die Parameter einmal funktionieren, dann müssten sie doch beim zweiten mal immer noch funktionieren...
(Windows könnte zwar meine übergebene Variable ssBmpInfo verändern, wenn ich aber immer nur eine Kopie von ssBmpInfo übergebe ändert sich auch nichts.)

Geändert von blablab ( 8. Nov 2012 um 10:17 Uhr)
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: GetMem Problem

  Alt 9. Nov 2012, 13:27
OK, ich habs jetzt verstanden.

Man sollte tatsächlich nie GetMem zusammen mit GetDIBits verwenden. Es geht nur mit VirtualAlloc, da sich die Daten in einem physikalisch zusammenhängenden Speicherblock befinden müssen, was bei GetMem nicht unbedingt gegeben ist. Das ist scheinbar eine undokumentierte Bedingung von GetDIBits.

Danke Microsoft für die vielen Stunden Rätselspaß...
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: GetMem Problem

  Alt 9. Nov 2012, 13:49
Ich finde das es recht nachvollziehbar ist, dass ein Bitmap ein Stück Speicher ohne Löcher braucht. Wertvoller fand ich jetzt die Info, dass GetMem fragmentierte Bereiche liefern kann! D.h. GetMem gibt aus Prozesssicht schon zusammenhängende Adressen, aber physikalisch können die wild verteilt sein, auch wenn es als ein Block reserviert wurde - verstehe ich das richtig?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: GetMem Problem

  Alt 10. Nov 2012, 10:07
Scheinbar ist das so und zwar nicht nur bei Delphis GetMem sondern bei so ziemlich allen Standard-Speicher-Allozier-Funktionen jeglicher Programmiersprachen.
Das Problem ist auch, dass der Speicher für GetDIBits mit einem Aufruf von VirtualAlloc reserviert werden muss und GetMem benutzt scheinbar mehrere Aufrufe. (Ob es VirtualAlloc ist weiß ich nicht.)

Das ein Bitmap ein unfragmentiertes Stück Speicher braucht mag sinnvoll sein. Aber wenn man solch ein unfragmentiertes Stück Speicher mit keiner Standard-Speicher-Allozier-Funktion jeglicher Programmiersprachen bekommt, dann wäre das doch wenigstens ein Mini-Kommentar in der Dokumentation wert, oder?
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz