为什么我的char []存储垃圾?

时间:2010-10-18 09:35:12

标签: c++ directx

我正在尝试将文字渲染到屏幕上,但不断得到垃圾符号,我无法弄清楚我的方法有什么不同。

此代码适用于我的主程序:

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);

但是,只要我把它放在一个函数中,它就会开始吐出垃圾。我知道它是char vectorText [],因为当我绕过它然后我得到文本。

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);

底部有效,但很明显它不会给我我需要的东西。

//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);

任何帮助都会很好,我完全不知所措:(

这是我的整个main.cpp,减去所有不相关的废话。

// 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

2 个答案:

答案 0 :(得分:6)

问题是你的char []位于堆栈上,并且在你离开函数后directx可能会访问它并且它变得无效。

在后一种情况下,char* newText = "Text will work from here",数组是一个存储在堆中程序存储器中的常量。

答案 1 :(得分:1)

在调用新文本()

之前,能否检查sprintf是否正常工作?

我估计你可能在吹嘘。堆栈井喷可能不是由于分配,而是由于缓冲区用户会发生什么。

您可能必须考虑发送到Text()的缓冲区会发生什么。

然后冲洗并重复。