Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phili

unregistriert

31

12.07.2006, 14:04

C-/C++-Quelltext

1
ifstream ifs("a", ios::binary); 

Uops :oops: :D :lol: 8) :oops:

Phili

unregistriert

32

14.07.2006, 14:06

Könnte man das so schreiben? Ich denk mal, es ist klar wie beschränkt das ganze ist(keine Fehlerabfrage...) aber würde es Theoretisch gehen?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class PH3DTextureBuffer
{
public:
    int AufloesungX;
    int AufloesungY;
    IDirect3DTexture9 *HardBuffer;
    int Name[100];
    char *SoftBuffer;
    void Laden(char *filename);
    void Erstellen(PH3DDevice D3DDev);
};
void PH3DTextureBuffer::Laden(char *filename)
{
    for(int i=0; i<100; i++)
    {
        Name[i]=filename[i];
        if(filename[i]=='\0')
            break;
    }
    ifstream ifs(filename);
    char Bytes[100];
    ifs.read((char*)&Bytes, 10);    
    DWORD Offset;
    LONG Hoehe;
    LONG Breite;
    ifs.read((char*)&Offset, 4);
    ifs.read((char*)&Bytes, 4);
    ifs.read((char*)&Breite, 4);
    ifs.read((char*)&Hoehe, 4);
    ifs.read((char*)&Bytes, 28+(Offset-54));
    AufloesungX=Breite;
    AufloesungY=Hoehe;
    SoftBuffer=new char[3*Hoehe*Breite];
    ifs.read((char*)SoftBuffer, 3*Hoehe*Breite);
}
void PH3DTextureBuffer::Erstellen(PH3DDevice D3DDev)
{
    D3DDev.D3DDev->CreateTexture(AufloesungX, AufloesungY, 0, 0, D3DFMT_R8G8B8, D3DPOOL_MANAGED,
        &HardBuffer, NULL);
    D3DLOCKED_RECT Rect;
    HardBuffer->LockRect(0, &Rect, NULL, 0);
    memcpy((void*)&Rect, (void*)&SoftBuffer, AufloesungX*AufloesungY*3);
    HardBuffer->UnlockRect(0);
}

Phili

unregistriert

33

14.07.2006, 17:27

Ist der Programmierstil so schlecht, das ihr euch weigert ihn durchzugucken :lol: :cry: ;)

Phili

unregistriert

34

14.07.2006, 20:37

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
struct PH3DBitmapHeader
{
    WORD bfType;
    DWORD bfSize;
    DWORD bfReserved; 
    DWORD bfOffbits;
};
struct PH3DBitmapInfo
{
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;  
    LONG biYPelsPerMeter; 
    DWORD biClrUsed;
    DWORD biClrImportant;
};

class PH3DTextureBuffer
{
public:
    int AufloesungX;
    int AufloesungY;
    IDirect3DTexture9 *HardBuffer;
    int Name[100];
    char *SoftBuffer;
    void Laden(char *filename);
    void Erstellen(PH3DDevice D3DDev);
};
void PH3DTextureBuffer::Laden(char *filename)
{
    for(int i=0; i<100; i++)
    {
        Name[i]=filename[i];
        if(filename[i]=='\0')
            break;
    }
    ifstream ifs(filename);
    PH3DBitmapHeader Header;
    PH3DBitmapInfo Info;
    ifs.read((char*)&Header, 14);
    ifs.read((char*)&Info, 40);
    AufloesungX=Info.biWidth;
    AufloesungY=Info.biHeight;
    SoftBuffer=new char[3*AufloesungX*AufloesungY];
    ifs.read((char*)&SoftBuffer[0], 3*AufloesungX*AufloesungY);
}
void PH3DTextureBuffer::Erstellen(PH3DDevice D3DDev)
{
    ofstream prot("Prot.txt");

    D3DDev.D3DDev->CreateTexture(AufloesungX, AufloesungY, 1, 0, D3DFMT_R8G8B8, D3DPOOL_DEFAULT,
        &HardBuffer, NULL);
    D3DLOCKED_RECT Rect;
    HardBuffer->LockRect(0, &Rect, NULL, 0);
    memcpy(&Rect, (void*)&SoftBuffer, AufloesungX*AufloesungY*3);
    HardBuffer->UnlockRect(0);
}


Ich bin mir ziemlich sicher, das der Fehler in der Erstellen-Funktion liegt(Debugging sagts auch). Ich weiß nur nicht wo... Ich schätz mal ich hab einfach irgendwas vergessen oder Falsche Parameter übergeben. Sorry übrigens für meinen 4.Post in Folge, aber es antwortet ja niemand... :cry:

Anonymous

unregistriert

35

14.07.2006, 20:43

Ich würd mehr mit unsigned arbeiten, ich hab noch nie mals einen negativen BitCount gesehen.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

36

14.07.2006, 21:48

Das ist vllt etwas OffTopic, aber ich hab doch nochmal ne kleine Frage zu unsigned. Wenn ich nun aus irgendwelchen Gründen auch immer doch in den negativen Wertebereich rutsche, was passiert dann genau? Wird sozusagen einfach von hinten (rückwärts) wieder gezählt? Und gibt es noch weitere Auswirkungen?

Abgesehen davon:
Wenn der Wert irgendwie negativ ist, also die Datei beschädigt, falsch geparsed oder was auch immer, dann bringt mir unsigned doch auch einen feuchten Dreck?

Anonymous

unregistriert

37

14.07.2006, 23:40

Das Gurke
Probier mal folgendes aus:

C-/C++-Quelltext

1
2
3
const unsigned long x =  0;
const unsigned long y = -1;
const unsigned long z = -2;

Mag sein das Dich das einen "feuchten Dreck" interessiert beim parsen, aber interessiert es Dich auch einen "feuchten Dreck" wenn die Runtime dadurch in mitleidenschaft gezogen wird? Mich nicht.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

38

15.07.2006, 01:34

Bist denn sicher, dass es sich um eine 24bit Bitmap handelt?

Also wie es auf jedenfall geht(Es handelt sich hierbei um einen Codeausschnitt, der 1 große Bitmap in 4 kleine aufteilt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
BITMAPINFOHEADER LoadBitmapFromFile(IrrlichtDevice* device, char* name, char** data)
{
    BITMAPFILEHEADER  FileHeader;     // BMP Datei Header 

    BITMAPINFOHEADER  InfoHeader;     // BMP Datei Info Header 


    memset(&InfoHeader, 0, sizeof(InfoHeader));
    if(!device || !name || !data)   return InfoHeader;

    io::IReadFile* file = device->getFileSystem()->createAndOpenFile(name);

    file->read(&FileHeader, sizeof(BITMAPFILEHEADER));
    file->read(&InfoHeader, sizeof(BITMAPINFOHEADER));

    *data = new char[InfoHeader.biSizeImage];
    file->read(*data, InfoHeader.biSizeImage);
    file->drop();

    return InfoHeader;
}

bool SaveBitmapToFile(IrrlichtDevice* device, char* name, BITMAPINFOHEADER InfoHeader, char* data)
{
    BITMAPFILEHEADER  FileHeader;     // BMP Datei Header 


    InfoHeader.biSizeImage  = InfoHeader.biWidth * InfoHeader.biHeight * InfoHeader.biBitCount / 8;
    FileHeader.bfOffBits    = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
    FileHeader.bfSize       = InfoHeader.biSizeImage + FileHeader.bfOffBits;
    FileHeader.bfType       = 19778;
    FileHeader.bfReserved1  = 0;
    FileHeader.bfReserved2  = 0;

    io::IWriteFile* file = device->getFileSystem()->createAndWriteFile(name);
    file->write(&FileHeader, sizeof(BITMAPFILEHEADER));
    file->write(&InfoHeader, sizeof(BITMAPINFOHEADER));

    file->write(data, InfoHeader.biSizeImage);
    file->drop();
    return true;
}


    //Textur in 4 texturen spliten

    {   
        char* daten, *tempdaten;
        BITMAPINFOHEADER InfoHeader = LoadBitmapFromFile(device, (char*)HMap.c_str(), &daten);
        InfoHeader.biHeight     = (long)(InfoHeader.biHeight * 0.5);
        InfoHeader.biWidth      = (long)(InfoHeader.biWidth  * 0.5);
        InfoHeader.biSizeImage  = InfoHeader.biWidth * InfoHeader.biHeight * InfoHeader.biBitCount / 8;

        dim.Height  = InfoHeader.biHeight;
        dim.Width   = InfoHeader.biWidth;

        tempdaten = new char[InfoHeader.biSizeImage];
        for(int counter = 0; counter < dim.Height; counter++)
            memcpy(tempdaten + (int)(counter * dim.Width * 3), daten + ((dim.Height * 2 - counter - 1) * dim.Width * 6), dim.Width * 3); 
    
        SaveBitmapToFile(device, "temp1-heightmap.bmp", InfoHeader, tempdaten);

        for(int counter = 0; counter < dim.Height; counter++)
            memcpy(tempdaten + (int)(counter * dim.Width * 3), daten + ((dim.Height * 2 - counter - 1)  * dim.Width * 6) + dim.Width * 3, dim.Width * 3); 
    
        SaveBitmapToFile(device, "temp2-heightmap.bmp", InfoHeader, tempdaten);

        for(int counter = 0; counter < dim.Height; counter++)
            memcpy(tempdaten + (int)(counter * dim.Width * 3), daten + ((dim.Height - counter - 1) * dim.Width * 6) + dim.Width * 3, dim.Width * 3); 
    
        SaveBitmapToFile(device, "temp3-heightmap.bmp", InfoHeader, tempdaten);

        for(int counter = 0; counter < dim.Height; counter++)
            memcpy(tempdaten + (int)(counter * dim.Width * 3), daten + ((dim.Height - counter - 1)  * dim.Width * 6), dim.Width * 3); 
    
        SaveBitmapToFile(device, "temp4-heightmap.bmp", InfoHeader, tempdaten);

        delete[] tempdaten;
        delete[] daten;
    }
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Phili

unregistriert

39

15.07.2006, 10:29

@nix da
Also ich weiß nicht ganz was du meinst, meinst du, das

C-/C++-Quelltext

1
 WORD biBitCount; 

DWORD sein sollte?
Also auf
http://www.uni-ulm.de/~s_cwanie/spec_pict/bmp.html
steht die Tabelle, die ich benutzt hab, bei der ist es WORD. Oder meinterst du was völlig anderes?
@Nox
Ja, ich bin mir sicher, das es ne 24bit Bitmap ist.

Anonymous

unregistriert

40

15.07.2006, 10:34

Nox
Geht das auch mit Bitmaps die 3x3 groß sind? :lol:

Phili
DWORD != WORD

Werbeanzeige