2010-10-18 17 views
0

J'essaye de rendre le texte à l'écran mais continue à recevoir des symboles de poubelle et je ne peux pas comprendre ce qui est si différent dans mon approche.Pourquoi mon char [] stocke-t-il des ordures?

Ce code fonctionne dans mon programme principal:

char vectorText[80]; 
sprintf(vectorText, "vector%i = [%f, %f, %f]", 1, vector[0]->x, vector[0]->y, vector[0]->z); 
char* newText = vectorText; 
Text* finalText = NULL; 
finalText = new Text(22, 0, 400, false, newText, 0.0f, 0.0f, 1024.0f, 200.0f); 
scene.AddText(finalText); 

Cependant, dès que je le place dans une fonction, il commence crachant des ordures. Je sais que c'est le vecteurcarTexte [] parce que quand je le contourne, je reçois du texte.

char vectorText[80] = "This prints garbage"; 
//sprintf(vectorText, "vector%i = [%f, %f, %f]", 1, vector[0]->x, vector[0]->y, vector[0]->z); 
//char* newText = vectorText; 
Text* finalText = NULL; 
finalText = new Text(22, 0, 400, false, vectorText, 0.0f, 0.0f, 1024.0f, 200.0f); 
scene.AddText(finalText); 

Le bas fonctionne, mais évidemment, il ne va pas me donner ce dont j'ai besoin.

//char vectorText[80]; 
//sprintf(vectorText, "vector%i = [%f, %f, %f]", 1, vector[0]->x, vector[0]->y, vector[0]->z); 
char* newText = "Text will work from here"; 
Text* finalText = NULL; 
finalText = new Text(22, 0, 400, false, newText, 0.0f, 0.0f, 1024.0f, 200.0f); 
scene.AddText(finalText); 

Toute aide serait bon, je suis tout à fait à une perte :(

Ceci est mon ensemble main.cpp, moins toutes les conneries hors de propos.

// Trim fat from windows 
#ifndef WIN32_LEAN_AND_MEAN 
#define WIN32_LEAN_AND_MEAN 
#endif // WIN32_LEAN_AND_MEAN 

#include <Windows.h> 
#include "directXManager.h" 
#include "Timer.h" 
#include "Renderer.h" 
#include "Camera.h" 
#include "Text.h" 
#include <time.h> 

// Message Pump prototype 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); 

void setupWindow(WNDCLASS &wc, HINSTANCE hinstance, HWND &wnd); 

void function(D3DXVECTOR3* vector[3], Renderer &scene); 

// Program entry point 
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) 
{ 
// Timer functionality 
Timer timer; 
timer.Init(); 

/* initialize random seed: */ 
srand (time(NULL)); 


// Step One: Register a window type 
WNDCLASS wc;  

// Step Two: Create a window of that type. 
HWND wnd = NULL; 

setupWindow(wc, hinstance, wnd); 


// Initialise Direct3D 
if (!DirectXManager::Instance().InitDirect3D(wnd, WINDOW_WIDTH, WINDOW_HEIGHT, true)) { return 0; } 

// Make a local copy of our IDirect3DDevice 
IDirect3DDevice9* device = NULL; 
device = DirectXManager::Instance().GetDevice(); 

// Start Timer 
timer.Reset(); 
float timeCurrent = timer.GetTime(); 
float timePrevious = timer.GetTime(); 
float deltaTime = 0.0f; 

// create camera 
Camera camera; 

// create renderer 
Renderer scene; 

if (device) { } // end if() 


// Step Four: Create a message pump. 
MSG msg; 
::ZeroMemory(&msg, sizeof(MSG)); 
while(msg.message != WM_QUIT) 
{ 
    // Handle time for current frame 
    timeCurrent = timer.GetTime(); 
    deltaTime = timeCurrent - timePrevious; 

    // Process all windows messages, any messages that are 
    // currently available will be processed now. 
    while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } // end while() 

    if (msg.message != WM_QUIT) 
    { 
     // create vectors 
     D3DXVECTOR3* vector[3]; 
     vector[0] = new D3DXVECTOR3(-3.57f, 6.43f, 8.30f); 
     vector[1] = new D3DXVECTOR3(5.67f, 3.23f, -8.72f); 
     vector[2] = new D3DXVECTOR3(0.0f, 0.0f, 0.0f); 

     function(vector, scene); 

     // render scene 
     scene.Render(deltaTime, DirectXManager::Instance().GetDevice(), camera); 

    } // end if() 

    // Update time values 
    timePrevious = timeCurrent; 
} // end while() 

// Cleanup 
DirectXManager::Instance().Release(); 

return 0; 
} // end WinMain 


// Message Pump body 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_DESTROY: 
{ 
    DirectXManager::Instance().Release(); 
    PostQuitMessage(0); 
    break; 
} 

    // Pressing of escape key - quit 
    case WM_KEYDOWN: 
    { 
     switch (wParam) 
     { 
    case VK_ESCAPE: PostQuitMessage(0); DirectXManager::Instance().Release();  break; 
    } 

    break; 
} 
    default: 
    break; 
    } 

    return DefWindowProc(hwnd, msg, wParam, lParam); 
} 


// this will setup all the values for the DX window 
void setupWindow(WNDCLASS &wc, HINSTANCE hinstance, HWND &wnd) 
{ 
wc.cbClsExtra = NULL; 
wc.cbWndExtra = NULL; 
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
wc.hCursor = NULL; 
wc.hIcon = LoadIcon(hinstance, "ApplicationIcon"); 
wc.hInstance = hinstance; 
wc.lpfnWndProc = WndProc; 
wc.lpszClassName = "TuteWindow"; 
wc.lpszMenuName = ""; 
wc.style = CS_CLASSDC; 


if (RegisterClass(&wc)) 
{ 
    // Step Two: Create a window of that type 
    wnd = CreateWindow("TuteWindow", WINDOW_TITLE, WS_SYSMENU, SCREEN_WIDTH/2 - (WINDOW_WIDTH/2), SCREEN_HEIGHT/2 - (WINDOW_HEIGHT/2), WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hinstance, 0); 
} else { 
    //return 0; 
} // end if() 

// Step Three: Show the window. 
if (wnd) 
{ 
    UpdateWindow(wnd); 
    ShowWindow(wnd, SW_SHOW); 
} // end if() 
} // end setupWindow() 



void function(D3DXVECTOR3* vector[3], Renderer &scene) { 

char vectorText[80]; 
sprintf(vectorText, "vector%i = [%f, %f, %f]", 1, vector[0]->x, vector[0]->y, vector[0]->z); 

char* newText = vectorText; 
Text* finalText = NULL; 
finalText = new Text(22, 0, 400, false, newText, 0.0f, 0.0f, 1024.0f, 200.0f); 
scene.AddText(finalText); 

} // end function 
+0

Veuillez mettre le code dans le bloc de code pour un formatage correct. –

+1

Quel est le texte? Quelle est la scène? Vérifiez les documents quel que soit le paquet que vous utilisez ... – Kricket

+1

Le code que les gens doivent voir est l'implémentation de la classe Text .... –

Répondre

1

Pouvez-vous vérifier si le sprint fonctionne correctement avant d'appeler le nouveau texte()

Je suppose que vous pourriez souffler la pile, mais l'erreur de la pile n'est peut-être pas due à l'affectation, mais plutôt à ce qui arrive à l'utilisateur du tampon.

Vous devrez peut-être envisager ce qui arrive au tampon que vous envoyez à Text().

puis rincer et répéter.

+0

80 octets ne coupent pas la pile .. et s'ils le font vous obtenez un défaut de segmentation. – ypnos

+0

char * vectorText = "Ceci imprime les ordures"; Fonctionne, mais pas avec sprintf :( –

+0

Qu'en est-il de ma deuxième question? –

6

Le problème est que votre char [] se trouve sur la pile et probablement que directx y accède après que vous ayez quitté la fonction et qu'elle soit devenue invalide.

Dans votre dernier cas, char* newText = "Text will work from here", le tableau est une constante qui est stockée dans la mémoire du programme dans le tas.