我正在使用此代码动态创建一个二维数组:
char **FileTables;
int rows = 1000;
int i;
FileTables = (char**)malloc(rows * sizeof(char));
for (i = 0; i < rows; i++) {
FileTables[i] = (char*)malloc(256 * sizeof(char));
}
Run Code Online (Sandbox Code Playgroud)
问题是1000行,可能会有更多,分配所有内存需要几秒钟.这样做有更快/更好的方法吗?
编辑:除了明显更简单的代码之外,使用这些方法之一是否有优势?
char **FileTables;
int rows = 1000;
int i;
FileTables = malloc(rows * sizeof(char*));
FileTables[0] = malloc(rows * 256 * sizeof(char));
for (i = 0; i < rows; i++) {
FileTables[i] = FileTables[0] + i * 256;
}
Run Code Online (Sandbox Code Playgroud)
和..
char (*FileTables)[256];
int rows = 1000;
FileTables = malloc(rows * sizeof(*FileTables)); …Run Code Online (Sandbox Code Playgroud) 什么会有更好的性能,一个stl向量,或者每次我想要添加内容时都重新分配的动态数组?
使用vectors :: iterator会比在数组上使用for循环更快吗?
如果有人能解释原因,那就太好了.
我试图将编辑控件中的文本垂直居中,经过一些研究后我发现我必须处理 WM_NCCALCSIZE 消息。因此,我对编辑控件进行了子类化,但从未发送 WM_NCCALCSIZE 消息。
难道我做错了什么?
编辑:
所以我正在WM_NCCALCSIZE很好地处理消息,并且我有一个通过传递WS_EX_CLIENTEDGE到创建的 3d 边框CreateWindowEx。但是,如果我通过终止主题服务来禁用 Windows 主题,则处理消息的控件上的边框就会消失WM_NCCALCSIZE。另一个不处理WM_NCCALCSIZE消息的控件仍然像平常一样具有边框。
所以我假设我应该做一些事情来WM_NCCALCSIZE让我保持边界?如果是这样怎么办?如果没有办法恢复边界吗?
说我有3个字符串.再多1个字符串.
有没有一种算法可以让我找到前3个字符串中哪一个最匹配第4个字符串?
没有一个字符串会完全匹配,我只是想找到最接近的匹配.
如果算法已经存在于STL中,那就太好了.
提前致谢.
在我目前的项目中,我一直在使用宽字符(utf16).但是由于我用户的唯一输入将是一个url,无论如何都必须结束ascii,另外还有一个字符串,我正在考虑将整个程序切换为ascii.
我的问题是,在将字符串传递给Windows API函数之前,将字符串转换为utf16有什么好处吗?
在网上做了一些研究之后,如果你不在Windows上使用UTF-16,似乎有很多人推荐这个.
glScalef(0.5f, 0.5f, 0);
// do some things
glScalef(2.0f, 2.0f, 0);
Run Code Online (Sandbox Code Playgroud)
要么..
glPushMatrix();
glScalef(0.5f, 0.5f, 0);
// do some things
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)
哪个更好,性能更好?
使用windows api,有没有办法删除一个大文件(比方说1gb +),并以某种方式监控进度?我确定它可能但我不知道从哪里开始..
编辑:应该更具体,我想将文件移动到回收站,并显示类似于探索的进度条,虽然我可能想要控制台中的进度条或其他东西,所以我不想要一个精确的副本.
编辑2:Yeaah猜测它是即时的,应该在我提出问题之前进行测试.无论如何只是关闭这个问题?
我试图在对话框中的 ComboBox 控件上使用 GetFocus(),但由于某种原因它不起作用。
即使我使用 SetFocus() 函数设置焦点,它也不起作用,但看起来它具有键盘焦点。
SetFocus(hKeysComboBox);
if (GetFocus() == hKeysComboBox) // This is false
Run Code Online (Sandbox Code Playgroud)
也许是因为它在一个对话框中?我不知道,这看起来很简单。
在Windows上不使用Unicode有什么缺点?
通过Unicode,我的意思WCHAR是广泛的API函数.(CreateWindowW,MessageBoxW等)
不使用这个会遇到什么问题?
好吧我正在使用一个时间为50毫秒的计时器来动画一些移动的文本(技术上它在文本之间滚动).
问题是,如果你仔细观察,你可以看到文字闪烁,并且id不喜欢闪烁..
所以我对动画不是那么好但是我能做些什么来减少闪烁?也许更快的过去时间?或者我应该甚至使用计时器吗?
编辑:
所以我试图实现双缓冲,我显然做了一些事情.
这是没有双缓冲的代码,这个工作正常,但有点闪烁.
void PaintScrollingText(ScrollingText *Settings, WPARAM wParam)
{
HDC hdc;
PAINTSTRUCT ps;
HANDLE hOldFont;
RECT rect;
hdc = wParam ? (HDC)wParam : BeginPaint(Settings->hWnd, &ps);
hOldFont = SelectObject(hdc, Settings->hFont);
SetTextColor(hdc, Settings->crForeGnd);
SetBkColor(hdc, Settings->crBackGnd);
GetClientRect(Settings->hWnd, &rect);
rect.right -= Settings->txt1XOffset;
DrawText(hdc, Settings->szText1, -1, &rect, DT_RIGHT);
rect.right += Settings->txt1XOffset - Settings->txt2XOffset;
DrawText(hdc, Settings->szText2, -1, &rect, DT_RIGHT);
SelectObject(hdc, hOldFont);
if (!wParam) EndPaint(Settings->hWnd, &ps);
}Run Code Online (Sandbox Code Playgroud)
这是我的代码,带有双缓冲.
void PaintScrollingText(ScrollingText *Settings, WPARAM wParam) …Run Code Online (Sandbox Code Playgroud) 什么可能导致ShowCaret和SetCaretPos失败ERROR_ACCESS_DENIED?
我正在创建插入符号WM_CREATE并显示插入符号WM_COMMAND.我检查并CreateCaret正在成功执行.
它们应该在同一个线程中运行.
我在调用之前使用SetScrollInfo并更新了我的窗口内容.但我不认为这会导致失败..InvalidateRectShowCaretShowCaret
相关代码:
#define CHAR_WIDTH 7
#define CHAR_HEIGHT 12
case WM_CREATE:
CreateCaret(hWnd, NULL, CHAR_WIDTH, 2);
UpdateScrollbar(hWnd); // calls SetScrollInfo. initially nMin and nMax are both 0
return 0;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_OPENFILE:
if (DoOpenFile(hWnd))
{
InvalidateRect(hWnd, NULL, TRUE);
UpdateScrollbar(hWnd);
if (SetCaretPos(CHAR_WIDTH * 12, CHAR_HEIGHT - 1) == 0)
{
char ss[33];
sprintf_s(ss, "DEBUG 2: %d\n", GetLastError());
OutputDebugString(ss);
}
if …Run Code Online (Sandbox Code Playgroud) 有人可以解释为什么我从未WM_COMMAND在GetMessage循环中收到消息吗?
我已经检查过并且WndProc正在接收WM_COMMAND消息,所以我很困惑为什么这不起作用.
while (GetMessage(&msg, NULL, 0, 0) != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_COMMAND)
{
// This never happens:
MessageBox(NULL, "WM_COMMAND", "WM_COMMAND", MB_OK);
}
}
Run Code Online (Sandbox Code Playgroud)
操作系统:Windows 8