C, VS, Struct

OP #4126309
Lesenswert?
• ▲
▼
Hallo allerseits,

ich versuche seit Stunden Daten von einem Array als Bitmap zu speichern. 
Jetzt bin ich drauf gekommen, dass der Header nicht stimmt. Ich habe den 
Header in 2 structs aufgeteilt. Dieses Padding hab ich schon 
ausgeschaltet (muss man erst mal drauf kommen).
In dem struct sind verschiedene Formate nacheinander abgespeichert. Mein 
Plan war (auch in vielen Beilpielen ist das so realisiert), dass dieses 
Struct dann einfach byte für byte in die Datei geschrieben wird. Nun ist 
es so: struct bmpheader.widthbmp = 640. Wenn ich bmpheader.widthbmp 
ausgebe, so erhalte ich 640. Allerdings wenn ich den Speicherbereich von 
bmpheader.widthbmp auslese kommt Murks raus und ich verstehe nicht 
warum. Warum ist das so und wie kann ich das Problem lösen?
1
typedef struct fileheader{
2
  char filetype1, filetype2;
3
  DWORD sizefile;
4
  DWORD reserved = 0;
5
  DWORD offsetdata = 54;
6
};
7
typedef struct bmpheader{
8
  DWORD sizeheader = 40;
9
  DWORD widthbmp;
10
  DWORD heigthbmp;
11
  WORD planes = 1;
12
  WORD colbits = 8;
13
  DWORD compression = 0;
14
  DWORD sizedata;
15
  DWORD pixpmx = 0;
16
  DWORD pixpmy = 0;
17
  DWORD coltbl1 = 0;
18
  DWORD coltbl2 = 0;
19
};
20

21
void bmpout(char *inputarr, struct ginterface_2d_1d *settings){
22

23
  /*Bitmapfileheader*/
24
  fileheader fheader;
25
  fheader.sizefile = (settings->resolutionx*settings->resolutiony)+sizeof(fileheader)+sizeof(bmpheader);
26
  fheader.filetype1 = 'B'; fheader.filetype2 = 'M';
27
  /*Bitmapinfoheader*/
28
  bmpheader bheader;
29
  bheader.colbits = 8;
30
  bheader.heigthbmp = settings->resolutiony;
31
  bheader.sizedata = settings->resolutionx*settings->resolutiony;
32
  bheader.widthbmp = 256;// (DWORD)settings->resolutionx;
33

34
  std::ofstream bmpdata("test.bmp", std::ios::out | std::ios::binary);
35
  bmpdata.write((char*)&fheader, sizeof(fheader));
36
  bmpdata.write((char*)&bheader, sizeof(bheader));
37

38
  char test[60] = { 0 };
39
  for (int i = 0; i != 14; ++i){
40
    test[i] = *((char*)&bheader + i);
41
    for (int ii = 7; ii >= 0; --ii){
42
      if ((1 << ii)&test[i])
43
        printf("1");
44
      else
45
        printf("0");
46
    }
47
    printf(" | %8x\n", test[i]);
48
  }
49
  printf("\n");
50

51
  int zähler = 0;  //#
52
  char b = 0x01;  //#
53
  for (int i = 0; i != settings->resolutiony; i++){
54
    for (int ii = 0; ii != settings->resolutionx; ii++) {
55
      bmpdata.write(&b, 1);  //#
56
      //bmpdata.write(&pic_diagram[ii][i], 1);
57
      zähler++;  //#
58
      continue;
59
    }
60
  }
61
  bmpdata.close();
62

63
  //#
64
  printf("Headersize: %d & %d\n", sizeof(fheader), sizeof(bheader));
65
  printf("dazasize: %d\n\n", zähler);
66
  printf("bmp headerdata:\n|");
67
  for (int i = 0; i != 10; i++){
68
    printf(" %ld |", *((long *)&bheader + i));
69
  }
70
  scanf("%c", &b);
71
  //printf("%s", ginterface.pic_diagramm);
72
}
OP #4126347
Lesenswert?
• ▲
▼
Michael Schikora schrieb:
> Dreh den Spieß mal um:
> Nehme ein x-beliebiges Malprogramm, erzeuge Dir 'ne Bitmap
> wie Du sie wünscht, und schau's Dir binär an.

Ja hab ich gemacht: Es liegt an dem Struct.

Beispiel:
1
struct test{
2
word a;
3
dword b;
4
dword c;
5
};
6

7
struct test newtest;
8
newtest.a = 10;
9
newtest.b = 20;
10
newtest.c = 600;
11

12
printf("%i", newtest.c);

Als Ausgabe erhalte ich 600. Würde passen. Und nun:
1
printf("%x,%x", *((char*)&newtest+2+4+2),*((char*)&newtest+2+4+3));

Da kommt als Ausgabe Murks. Aber eigentlich erwarte ich 600 in 
hexadezimal!!!
#4126401
Lesenswert?
• ▲
▼
OP #4126410
Lesenswert?
• ▲
▼
Arc Net schrieb:
> Wenn C und VS im Betreff steht, warum dann nicht die von MS
> bereitgestellten Strukturen und Funktionen benutzen?

Ich wills ja verstehen warums nicht funktioniert.


So, ich glaub mich trifft der Schlag: mit folgendem cast geht das 
printf: (unsigned char*). Ich dachte damit wird nur eingestellt um wie 
viele bytes der pointer bei ++ weiterspringt. Was macht der Compiler da 
schon wieder im Hintergrund für Sachen???

Das Problem ist nun, dass ofstream nur mit zeiger vom typ (char*) 
umgehen kann und nicht mit (unsigned char*). Was kann ich noch tun?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.