- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不知道这里发生了什么,虽然它很酷而且奇怪地令人毛骨悚然,但这并不是我的真实想法。
基本上;我正在尝试实现一个在黑色界面上缓慢键入文本的程序。我正在使用 SDL2 和 SDL2_TTF 来完成此任务,到目前为止一切顺利。
忽略 FPS 计数器,那只是 Nvidia。
老实说,我不知道发生了什么,我使用的字体是“Hack-Regular.ttf”。
进入代码:
#include<iostream>
#include<SDL.h>
#include<string>
#include<SDL_ttf.h>
void handleEvents(SDL_Event e, bool* quit){
while(SDL_PollEvent(&e) > 0){
if(e.type == SDL_QUIT){
*quit = true;
}
}
}
void render(SDL_Renderer* renderer, SDL_Texture* textToRender, SDL_Rect srcrect, SDL_Rect dstrect){
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, textToRender, &srcrect, &dstrect);
SDL_RenderPresent(renderer);
}
void printToConsole(std::string message, char* text){
for(int i = 0; i < message.length(); i++){
*text = *text + message.at(i);
SDL_Delay(30);
}
}
void start(char text){
printToConsole("Hey ;)", &text);
}
int main( int argc, char *argv[] ) {
SDL_Init(SDL_INIT_EVERYTHING);
TTF_Init();
SDL_Window* window = SDL_CreateWindow("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 600, 600, SDL_RENDERER_ACCELERATED);
SDL_Renderer* renderer = SDL_CreateRenderer(window, 0, 0);
char text = 'asdf'; //This is the text that has been rendered.
bool quit = false;
SDL_Event e;
TTF_Font* font = TTF_OpenFont("Hack-Regular.ttf", 28);
SDL_Color color = {255, 255, 255};
SDL_Surface* textSurface;
SDL_Texture* textTexture;
SDL_Rect srcrect;
SDL_Rect dstrect;
srcrect.x = 0;
srcrect.y = 0;
srcrect.w = 100;
srcrect.h = 32;
dstrect.x = 640/2;
dstrect.y = 480/2;
dstrect.w = 100;
dstrect.h = 32;
while(!quit){
handleEvents(e, &quit);
render(renderer, textTexture, srcrect, dstrect);
start(text);
textSurface = TTF_RenderText_Solid(font, &text, color);
textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
}
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
window = NULL;
renderer = NULL;
TTF_Quit();
SDL_Quit();
return 0;
}
如果难以阅读,我深表歉意,我觉得没有必要使用多个类。
需要注意的是,“f”是“asdf”的最后一个字母,我将文本定义为最初,不知道为什么从那里开始。
最佳答案
在下面的语句中,您定义了一个变量,它占用 1 个字节的内存,并存储整数值 102,也就是 ascii 格式的“f”:
char text = 'asdf'; //This is the text that has been rendered.
上面的说法有几个问题:
char
变量只能存储一个字符,一个字节的内存。您正在尝试分配 4。仅保留最后一个值。然后通过获取变量的地址并将其作为 char*
类型传递,将该值传递给渲染例程:
textSurface = TTF_RenderText_Solid(font, &text, color);
但是,在 C/C++ 中,char*
通常用于存储指向 'c-string' 的指针。 - 即具有最终空终止符的字符序列。在接受 char*
参数作为 C 字符串的 API 中,您需要传递一个指向末尾带有空终止符的字符序列的指针。
因为它期望传递的值是一个 c 字符串,它会盲目地从内存中读取直到它看到一个值为 0 的字节。因为它正在读取你为该变量预留的内存的末尾(这是只有一个字节),它将读取任意内存,直到它幸运地在某处找到一个零 - 这就是为什么它显示垃圾。
...
你如何解决这个问题?好吧,这取决于您将如何获得琴弦。
使用您提供的代码,没有真正的理由分配您自己的 C 字符串。如果你有 string
对象,你可以使用 c_str()
方法访问一个 char*
c-string 兼容缓冲区;只要您未修改 string
,返回的指针就是有效的,并且由于返回的指针属于 string
,因此您无需担心清理它.
// Use the string class's implicit conversion from a c-string literal to
// a `std::string` object.
std::string text = "hello world";
...
while(!quit){
handleEvents(e, &quit);
render(renderer, textTexture, srcrect, dstrect);
// Note the lack of a call to the `start` method here.
textSurface = TTF_RenderText_Solid(font, text.c_str(), color);
textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
}
如果你想有引用语义——也就是说,有一个你在 main 中声明的 text
变量,传递给你的程序的其他部分修改它,然后让你的 main 打印无论设置什么值,您都可以执行以下操作:
#include <stdlib.h>
#include <stdio.h>
#include <string>
using namespace std;
void start(string& text );
int main() {
// Create an empty 'string' object', invoking the default constructor;
// This gives us a valid empty string object.
string text;
...
while(true) {
...
// The `text` variable is passed by reference.
start(text);
textSurface = TTF_RenderText_Solid(font, text.c_str(), color);
...
}
}
// Takes a string object by reference, and modifies it to fill it
// with our desired text.
void start( string& text ) {
text += "Hello";
text += " ";
text += "World";
}
关于c++ - 界面上打印奇怪的文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33507475/
我是一家小型非营利组织的技术总监,我们正在制作一个新网站。我们提出了几个不同主页设计的模型,需要接收董事会成员的意见。是否有在线应用程序/程序/框架可以接收和组织用户评论?我正在寻找允许在查看页面时发
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我阅读了很多关于 java 接口(interface)的文章。我知道你可以实现多态性和其他伟大的东西(函数指针等)。我有理论知识,但有一点点或什至没有。我一直在使用很多已经制作好的界面,比如“Runn
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在尝试在 Windows 7 上编写一个 python 脚本来与我的 Wacom Bamboo Pen 数位板交互。 Wacom 建议使用 WinTab API,它工作正常,但不适用于我的应用程序
我正在研究一种远程访问有关 Linux 服务器统计信息的方法,即 conky会显示。 有没有办法与 conky 交互并获取它显示的统计信息?如果没有,您能否推荐一种获取此类统计数据的好方法? (C/C
将所有这些代码包装在 UI: do { } block 中的原因是什么?我在哪里可以获得关于它的明确说明? UI: do { backgroundButton.setImage(UIImage
我需要将 R 连接到某些 C# 应用程序。我安装了 rscproxy_1.3 和 R_Scilab_DCOM3.0-1B5 添加了对 STATCONNECTORCLNTLib、StatConnecto
我正在尝试遍历接口(interface)片段以通过 id 查找我的特定结构并更改属性。 type A struct { ID ID Steps []Step } type Ste
我有两种不同格式的相同界面,一种是键由低破折号分隔的 JSON 格式,另一种是 javascript camelCase 格式: JSON 格式: interface MyJsonInterface
操作系统:Linux。 我正在尝试寻找可能的方法来为我的嵌入式系统实现 Web 界面。 目前有一个外壳(基于文本)和一小组命令用于查询设备。 我是网络开发新手,我的问题是: 我必须使用什么网络服务器?
我正在尝试运行基于 Mechanical Turk Qualtrics 的调查,并且需要一些似乎可以通过 Mechanical Turk API 使用的功能,例如 custom Qualificati
我见过漂亮的 MetroTwit 界面 http://www.metrotwit.com/ ;我想知道使用了哪些 WPF 组件来尝试重现它。 最佳答案 MetroTwit 设计师在这里:) 所有的控件
我有一个小问题。我需要将 Hadoop Web 界面与我们的 Web 应用程序集成。我只需要一个 Hadoop 接口(interface),我们可以在其中运行一些 hadoop 命令,例如 1
假设我有这个 JavaScript 函数: function updateMainBuff(buff) { // do some stuff } 我的
我试图找出一个窗口是否属于当前的虚拟桌面。 我从 winapi 中找到了 VirtualDesktopManager 类,但即使根据 here 它应该位于“shobjidl.h” header 中,当
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 8年前关闭。 Improve this
我的 Tkinter GUI 界面有问题。文本不会在 shell 中打印,但如果将 Entry 放置在第一个 tk 窗口 get() 中,它就可以工作...帮助我吗? 这是我的代码: import o
我有一个在 MATLAB 中实现的随机微分方程组。只有 4 个变量与 Euler-Maruyama 集成,所以没有什么太花哨的......不过,技术细节对于这个问题并不重要。 您建议我如何构建一个 W
对于我创建的插件,我想添加一个网络界面,您可以从中更改设置并执行一些简单的数据操作。此数据操作应通过 sqlquerys 完成。我正在使用 sqlite 数据库,这就是问题开始的地方: 网站(serv
我是一名优秀的程序员,十分优秀!