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

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

11

22.08.2007, 23:21

Zitat von »"David_pb"«


Weiß ich, ist aber trotzdem kein Teil der STL!


Wo gehört std::basic_string dann dazu?

mfg Philipp

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

23.08.2007, 09:06

Zur Standard C++ Library in die String library. Dazu gehören: Char Traits, String Klassen und Null-Terminierte Sequenz Utilities.
@D13_Dreinig

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

13

23.08.2007, 09:23

Vllt hab ich mich blöd ausgedrückt -.-

Mir ist schon klar, dass char* veraltet ist. Aber DirectX will nunmal LPCSTR ham wenn man eine Textur mit CreateTextureFromFileEx lädt.

Mein Problem ist das man mit MFC natürlich ne tolle Klasse Cstring hat, die ich auch verwende. Das steht ja auch in meinem Post und Verwende ich auch für mein Eingabefeld als typ CString.

wenn ich also die textur ändern will und das proggie die einstellungen übernehmen soll, kommt ein runtimerror von assert:

Zitat

Debug Assertion Failed!

Program: D:\Eigene Dateien\Programmieren\C++\MeshConv\Debug\MeshConv.exe
File: f:\rtm\vctools\vc7libs\ship\atlmfc\include\cstringt.h

Expression: strFormat.LoadStringA(nFormatID)

For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

(Press retry to debug application)


hier der komplette quellcode von der Nachrichtenbehandlungsroutine wenn man die Textur übernehmen will (von Assistent erzeugt)

Quellcode

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
void CMeshConvDlg::OnUebern() 
{
    //Veränderungen Wirksam machen
    UpdateData(TRUE);

    WORD i = m_SubSetChoice.GetCurSel();

    //Materialien Übertragen
    d3d->SubSet_I[i].material.Ambient.a  = (FLOAT)m_ambient_a / 255.0f;
    d3d->SubSet_I[i].material.Ambient.r  = (FLOAT)m_ambient_r / 255.0f;
    d3d->SubSet_I[i].material.Ambient.g  = (FLOAT)m_ambient_g / 255.0f;
    d3d->SubSet_I[i].material.Ambient.b  = (FLOAT)m_ambient_b / 255.0f;
    d3d->SubSet_I[i].material.Diffuse.a  = (FLOAT)m_diffuse_a / 255.0f;
    d3d->SubSet_I[i].material.Diffuse.r  = (FLOAT)m_diffuse_r / 255.0f;
    d3d->SubSet_I[i].material.Diffuse.g  = (FLOAT)m_diffuse_g / 255.0f;
    d3d->SubSet_I[i].material.Diffuse.b  = (FLOAT)m_diffuse_b / 255.0f;
    d3d->SubSet_I[i].material.Specular.a = (FLOAT)m_specular_a / 255.0f;
    d3d->SubSet_I[i].material.Specular.r = (FLOAT)m_specular_r / 255.0f;
    d3d->SubSet_I[i].material.Specular.g = (FLOAT)m_specular_g / 255.0f;
    d3d->SubSet_I[i].material.Specular.b = (FLOAT)m_specular_b / 255.0f;
    d3d->SubSet_I[i].material.Emissive.a = (FLOAT)m_emissive_a / 255.0f;
    d3d->SubSet_I[i].material.Emissive.r = (FLOAT)m_emissive_r / 255.0f;
    d3d->SubSet_I[i].material.Emissive.g = (FLOAT)m_emissive_g / 255.0f;
    d3d->SubSet_I[i].material.Emissive.b = (FLOAT)m_emissive_b / 255.0f;

    //Textur updaten
    
    if( d3d->SubSet_I[i].file != m_Texture)
    {
                //m_Texture is die Member Variable von Typ CString
        if(!d3d->ChangeTexture(i,(LPCSTR)m_Texture))
        {
            AfxMessageBox("Konnte Textur nicht umstellen!");
        }
    }
}


hier die Implementation von ChangeTexture:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BOOL direct3d::ChangeTexture(WORD Subset,const char* DateiName)
{
    //Wenn noch Textur da ist, freigeben, hab ich ma festgelegt heißt 
        //keine Textur
    if( SubSet_I[Subset].file != "notex")
    {
        Textures[Subset]->Release();
    }
    //Neue Laden, vermute hieran liegts, weil ja LPSTR erwartet wird und nicht cString
    if(FAILED(D3DXCreateTextureFromFileEx(lpDevice,DateiName,D3DX_DEFAULT,D3DX_DEFAULT,
        D3DX_DEFAULT,0,D3DFMT_UNKNOWN,D3DPOOL_MANAGED,D3DX_FILTER_TRIANGLE,D3DX_FILTER_TRIANGLE,
        0xff000000,NULL,NULL,&Textures[Subset])))
    {
        return FALSE;
    }
    SubSet_I[Subset].file.Format('%s',DateiName);
    return TRUE;

}


SubSet_I ist eine Struct vom typ MeshSubSets_Import
und wie folgt definiert:

Quellcode

1
2
3
4
5
6
7
8
9
10
struct MeshSubSets_Import
{
    LPDIRECT3DVERTEXBUFFER9 lpVB; //Vertexbufferdaten
    LPDIRECT3DINDEXBUFFER9 lpIB; //IndexBufferdaten für SubSet
    D3DMATERIAL9 material; //material des SubSets
    CString file; //Datei wo Textur liegt -> KEIN Problem
    BOOL cullbackfaces; //ob Rückseite gecullt werden soll
    BOOL alphablending; //ob alphablending für dieses Subset verwendet werden soll
    BOOL alphatesting; //ob alphatesting für dieses Subset verwendet werden soll
};


ich hoffe damit könnt ihr was anfangen[/img]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

23.08.2007, 10:21

Hat m_Texture überhaupt nen korrekten Wert? Versuch dochmal GetBuffer().
@D13_Dreinig

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

15

23.08.2007, 11:02

GetBuffer hab ich auch probiert. Kommt genau derselbe Fehler zum vorschein. Auch wenn wenn man zeichen für zeichen die CString-Zeichen nach einem Char-Array kopiert und dann den Zeiger vom Char-Array übergibt anstatt m_Texture, kommt der fehler. etwa so:


C-/C++-Quelltext

1
2
3
4
5
char buf[255] = {0};
for (WORD j=0;j<m_Texture.Length();j++)
  Buf[j] := m_Texture[j];
Buf[m_Texture.Length()] = 0; //NUll-zeichen

/*... wie vorher*/

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

23.08.2007, 11:34

Dann wirf den Debugger an und schau nach wo genau der Fehler tatsächlich auftritt! Irgendein assert scheint ihn zu produzieren, da kannst du auch sehen was Sache ist!
@D13_Dreinig

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

17

19.10.2007, 09:12

Hi

sry das das so lange gedauert hat aba das problem ist zu trivial (wenn man zu Blöd ist klassen zu verwenden -.-)

ich hatte mir eine membervariable für das Textfeld vom Typ CString gemacht, das hätte ich bleiben lassen sollen. ich hole mir den Wert lieber mit GetDlgItemText, da gekomme ich einen Null-Terminierten String, den ich bedenkenlos übergeben kann.

nochma tschulle das jetz ma ne antwort kam aba ich bin leider so einer, der mehrere sachen gleizeitig angeht und somit manchmal das eine oder andere aus den augen verliert.

Werbeanzeige