我正在尝试将文字渲染到屏幕上,但不断得到垃圾符号,我无法弄清楚我的方法有什么不同。
此代码适用于我的主程序:
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
答案 0 :(得分:6)
问题是你的char []位于堆栈上,并且在你离开函数后directx可能会访问它并且它变得无效。
在后一种情况下,char* newText = "Text will work from here"
,数组是一个存储在堆中程序存储器中的常量。
答案 1 :(得分:1)
在调用新文本()
之前,能否检查sprintf是否正常工作?我估计你可能在吹嘘。堆栈井喷可能不是由于分配,而是由于缓冲区用户会发生什么。
您可能必须考虑发送到Text()的缓冲区会发生什么。
然后冲洗并重复。