Bitmap erzeugen mit C++

Hallo,

Ich hab jetzt mal ein ganz anderes Problem: Ich habe in dem Programm ein Array:
Code:
short pascal[2050][1024];
Der Compiler gibt weder eine Fehlermeldung noch eine Warnung aus, trotzdem stürzt das Programm ab.
Das mit outfile.put(255); habe ich folgendermaßen gelöst:
Code:
unsigned char end=255;
outfile.put(end);
Gruß, the_undertaker
 
Hallo,

Was bedeuten new char[256] und delete [] data;?
Der Operator new reserviert Speicher für ein Objekt auf dem Heap und gibt einen Zeiger auf diesen Speicherbereich zurück. Der Operator delete gibt diesen Speicherbereich wieder frei. Gleiches gilt für das Paar new [] und delete [], wobei diese Speicher für ein Array von Objekten reservieren bzw. freigeben. Lies dich am besten im C++-Buch deiner Wahl in das Kapitel über Speicherverwaltung ein, ohne Kenntnisse hierüber kommt man nämlich nicht weit.

Habe ich das richtig verstanden, dass outfile.write(data, 256) die ersten 256 Zeichen vom Array data ausgibt?
data ist genau genommen kein Array, sondern ein Zeiger. outfile.write(data, 256) liest einen Block von 256 Bytes aus dem Speicher und schreibt diese in die Ausgabedatei. Wo dieser Block anfängt, gibt der übergebene Zeiger data an.

Warum schreibst du int main(void) statt int main()?
Gute Frage ;) Im Prinzip sollte es bei C++ egal sein, ob man mit void explizit angibt, dass die Parameterliste leer ist, oder eben nicht. Bei reinem C wäre ich mir da allerdings nicht so sicher.

Nochwas: Kann ich auch outfile.write("BM", 2); schreiben?
Klar, spricht nichts dagegen.
oufile.put(255) funktioniert bei mir nicht.
Bei mir klappt es schon. Von daher hab ich keine Ahnung, was da bei dir schief läuft.

Ich hab jetzt mal ein ganz anderes Problem: Ich habe in dem Programm ein Array:
Code:
short pascal[2050][1024];
Der Compiler gibt weder eine Fehlermeldung noch eine Warnung aus, trotzdem stürzt das Programm ab.
Das liegt daran, dass hier versucht wird, knapp 4 MiB Stackspeicher zu reservieren. Ein derart großer Stack wäre ungewöhnlich, darum kommt es bei der Ausführung des Programms zu einer Ausnahme und dadurch zum Absturz. Größere Datenmengen gehören auch nicht auf den Stack, sondern auf den Heap. Dazu brauchst du die Operatoren new [] und delete [] (siehe oben).

Grüße,
Matthias
 
Hallo,

erstmal vielen Dank für die Antworten.
Mit new kann ich ja Speicher reservieren, wie kann ich aber jetzt diesen Speicher nutzen?(Das geht irgendwie mit &, aber wie? Ich hab mal folgendes versucht:
C++:
short *p = new short[2050*1024];
short pascal[2050][1024];
&p=pascal;
da meldet er aber folgendes:
Code:
error C2440: '=':short [2050][1024]' kann nicht in 'short **__w64 ' konvertiert werden
Die Fehlermeldung bezieht sich auf die 3. Zeile).
Tut mir ja leid, dass ich euch mit sowas auf die Nerven gehe, aber dafür wird jede gute Antwort gut bewertet.

Gruß, the_undertaker
 
Du hast in Zeile 1 bereits den Speicher belegt. Du kannst auf den Speicher direkt mit p[Index von 0 bis 2050*1024-1] zugreifen.

Dein 3. Schritt sieht nach einer Referenz aus, das geht meine ich mit verschiedenen Typen aber nicht so einfach. Man kann es vermutlich umcasten, mit sowas würde ich aber besser gar nicht erst anfangen.
 
C++:
short *p = new short[2050*1024]
short pascal[2050][1024];
p=pascal;
meinst du ungefähr sowas?
 
Zuletzt bearbeitet:
Nein, ohne das zweite Array:

Code:
short* p = new short[2050*1024];

p[20] = 0x71cf;

Ein zweidimensionales Array lässt sich da nicht einfach draufmappen. Du musst in dem Fall mit Multiplikation den eindimensionalen Index anpacken:

Code:
short* p = new short[2050*1024];

// X 50, Y 20
p[50 + 20 * 1024] = 0x71cf;
 
Hallo,

grundsätzlich hast du hier zwei Alternativen:
C++:
// Möglichkeit 1:
short (*pascal)[1024] = new short[2050][1024];
// ...
delete[] pascal;

// Möglichkeit 2:
short **pascal = new short *[2050];
for (int i = 0; i < 2050; ++i) pascal[i] = new short[1024];
// ...
for (int i = 0; i < 2050; ++i) delete[] pascal[i];
delete[] pascal;
Möglichkeit 1 hat den Nachteil, dass die zweite Dimension des Arrays bereits zur Kompilierzeit bekannt sein muss. Bei Möglichkeit 2 muss man sich dafür um das Anlegen (und Freigeben!) der zweiten Dimension selber kümmern. In beiden Fällen kann man aber wie gewohnt über pascal[x][y] auf die Elemente des Arrays zugreifen.

Grüße,
Matthias
 
Hallo,

vielen Dank für die sehr hilfreichen Antworten! Jetzt funktioniert alles, ich muss nur nochmal den Aufbau einer Bitmap genauer studieren (es ist nicht ganz das bei rausgekommen, was ich mir gedacht hatte).

Gruß, the_undertaker
 
Hallo,

ich hab jetzt doch nochmal eine Problem:
C++:
void ausgabe(unsigned zahl)
{
    unsigned s1, s256, s65536, s16777216;
    s1=zahl%256;
    zahl/=256;
    s256=zahl%256;
    zahl/=256;
    s65536=zahl%256;
    zahl/=256;
    s16777216=zahl%256;
    outfile.put(s1);
    outfile.put(s256);
    outfile.put(s65536);
    outfile.put(s16777216);
}

In meinem Programm habe ich jetzt diese Funktion, damit ich das Programm ein bisschen verallgemeinern kann für verschieden große Bitmaps. #include <fstream> und using namespace std; hab ich drin, aber trotzdem erscheint die Fehlermeldung:
Code:
error 2065: 'outfile': nichtdeklarierter Bezeichner
und dann viermal:
Code:
error 2228: Links von ".put" muss sich eine Klasse/Struktur/Union befinden.
Vielleicht könnt ihr mir da ja helfen.

Gruß, the_undertaker
 
Zurück