如此屏幕截图所示,所选文件夹不在视图中.需要向下滚动才能查看所选文件夹.
同一对话框显示在不同计算机上可见的选定文
我在两台都有Windows 7的计算机上运行它.它在一台计算机上正常运行,但在第二台运行时没有.它看起来与Windows环境相反,而不是一些代码问题?任何人都可以提出任何建议
代码没有变化.我使用不同驱动器的较长路径,但结果相同.
private void TestDialog_Click ( object sender, EventArgs e )
{
//Last path store the selected path, to show the same directory as selected on next application launch.
//Properties.Settings.Default.LastPath
FolderBrowserDialog dlgFolder = new FolderBrowserDialog ();
dlgFolder.RootFolder = Environment.SpecialFolder.DesktopDirectory;
dlgFolder.SelectedPath = Properties.Settings.Default.LastPath;
if (dlgFolder.ShowDialog () == System.Windows.Forms.DialogResult.OK)
{
Properties.Settings.Default.LastPath = dlgFolder.SelectedPath;
Properties.Settings.Default.Save ();
}
}
Run Code Online (Sandbox Code Playgroud) 问题声明差异?有人问到它们之间有什么区别
int i;
for (i=0; i<100; i++) {
//some loop....
}
Run Code Online (Sandbox Code Playgroud)
和:
for (int i=0; i<100; i++) {
//some loop....
}
Run Code Online (Sandbox Code Playgroud)
答案很明确; 第二个是C99,范围i
仅限于循环.我没有C99,所以我无法测试,因此问一个问题:在下列情况下解决方案是什么:
int i = 32;
for (int i=i; i<100; i++) {
// some loop
}
Run Code Online (Sandbox Code Playgroud)
"新" i
会用"旧"初始化i
吗?或者旧的i
已经无法进入,因为i
已经宣布了一个新的?
问题编译器:了解从小程序生成的汇编代码,编译器使用两个局部变量而不调整堆栈指针.
不调整RSP以使用局部变量似乎不会中断安全,因此编译器似乎依赖于硬件在发生中断时自动切换到系统堆栈.否则,出现的第一个中断会将指令指针推入堆栈并覆盖本地变量.
该问题的代码是:
#include <stdio.h>
int main()
{
for(int i=0;i<10;i++){
int k=0;
}
}
Run Code Online (Sandbox Code Playgroud)
该编译器生成的汇编代码是:
00000000004004d6 <main>:
4004d6: 55 push rbp
4004d7: 48 89 e5 mov rbp,rsp
4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0
4004e1: eb 0b jmp 4004ee <main+0x18>
4004e3: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
4004ea: 83 45 f8 01 add DWORD PTR [rbp-0x8],0x1
4004ee: 83 7d f8 09 cmp DWORD PTR …
Run Code Online (Sandbox Code Playgroud) 想象一下这种情况.int32_t
是一个扩展的整数类型,它以二进制补码表示(作为int32_t
要表示的标准).这意味着INT32_MIN
是-2147483648
(0x80000000
).
同时int
是标准整数类型,它以一个补码表示(标准允许).这意味着INT_MIN
是-2147483647
.
现在纠正我,如果我错了,但我认为两种类型都有相同的宽度,这意味着,根据6.3.1.1.1(强调我的):
任何标准整数类型的等级应大于具有相同宽度的任何扩展整数类型的等级.
所以排名int32_t
低于int
.
现在6.3.1.8(通常的算术转换)说(强调我的):
<...>否则,将对两个操作数执行整数提升.然后将以下规则应用于提升的操作数:如果两个操作数具有相同的类型,则不需要进一步转换.否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型.
因此,如果正确理解它,在此代码块中:
int32_t x = INT32_MIN;
int y = 1;
x + y; // What happens here?
Run Code Online (Sandbox Code Playgroud)
在表达式中x + y
,x
必须被提升为int
,并且INT32_MIN
超出范围int
.
这是标准中的错误还是我遗漏了什么?
换句话说,x + y
根据标准的定义,此上下文中的表达式评估了什么?
我开发了一个显示jpeg图像的应用程序.它可以显示4个图像,每个图像在屏幕的每个象限中.它使用了4个窗口.窗口没有边框(框架)和标题栏.加载新图像时,将为新图像调整窗口大小,然后显示图像.
特别是当窗口变大时,通常会出现闪烁.在我看到切口时,似乎在显示新内容之前调整大小时会移动旧内容.
我咨询了很多资源并使用了所有技巧:
窗口只有样式CS_DBLCLKS
(没有CS_HREDRAW
或CS_VREDRAW
);
背景画笔为NULL;
WM_ERASEBKGND
返回1;
WM_NCPAINT
返回0;
WM_NCCALCSIZE
告诉我对齐未移动的一侧(你能告诉它丢弃客户区吗?);
WM_WINDOWPOSCHANGING
返回0;
SetWindowPos有标志SWP_NOCOPYBITS | SWP_DEFERERASE | SWP_NOREDRAW | SWP_NOSENDCHANGING
.
但是,在调整窗口大小时,会出现闪烁(或内容移动).我想要的是:
SetWindowPos到新的大小和位置;
InvalidateRect(hWnd,NULL,FALSE);
UpdateWindow(HWND);
没有任何绘画,背景擦除或内容移动,直到WM_PAINT
.
WM_PAINT
作用:
hDC= BeginPaint (hWnd, &ps);
hMemDC= CreateCompatibleDC (hDC);
hOldBitmap = SelectObject (hMemDC, hNewBitmap);
BitBlt (hDC,...,hMemDC,0,0,SRCCOPY);
SelectObject (hMemDC, hOldBitmap);
DeleteDC (hMemDC);
EndPaint (hWnd, &ps);
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我是否/我在哪里犯了一个错误导致窗口的旧内容被移动?
硬件等:HP Elitebook Core7 64位上的Windows 7,NVIDIA Quadro K1000m驱动程序9.18.13.3265(更新至341.44).
我已经在另一台Windows计算机上看到了该程序的行为(Windows 8/10).它似乎不是NVIDIA的显示驱动程序.
调整平铺到屏幕中心(右下角= w/2,h/2)到左上角或左上角(0,0)的窗口大小时,行为最明显.
我可能在WM_NCCALCSIZE消息的计算上遇到问题,告诉Windows不要做任何事情.有人可以为我的目的举例计算吗?另请参阅当用户调整对话框大小时,如何强制窗口不重绘对话框中的任何内容?
在文件范围,以下是类型声明还是未命名变量?
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
Run Code Online (Sandbox Code Playgroud)
如果是类型定义,那么有什么区别:
typedef struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
Run Code Online (Sandbox Code Playgroud)
?
(背景:请参阅我的答案将变量从全局变为本地 - C,我相信第一个引入了一个未命名的变量,然后由编译器对其进行优化.)
注意:该问题已被标记为可能重复的结构成员标识符放在什么范围内?但我相信我并不是在询问有关成员范围的问题,而是对申报实际创造的内容提出疑问.然而.回答C++中'struct'和'typedef struct'的区别?解释我的问题.
在With数组中,为什么a [5] == 5 [a]?它解释了[]
在操作者a[5]
被定义为*(a + 5)
和因为+
是可交换的,5[a]
意味着*(5 + a)
和那么两个表达式指代相同的存储器位置.精细.
但是,C在6.4.2.1中也定义了标识符不能以数字开头.在5[a]
数组中,标识符5
不是有效的标识符.为什么不5[a]
生成有关无效标识符的错误?
我已经查看了询问目录/文件名在 Windows 环境中是否区分大小写的问题/答案,以及那些讨论区分大小写搜索需求的问题/答案[通常在 Python 中,而不是在 C 中],所以我想我理解必不可少的事实,但没有一个帖子包含我的特定应用程序架构,以及我正在解决的问题。所以,让我简要解释一下我所说的应用程序架构。该应用程序的核心是使用 Adobe AIR 构建的。是的,这意味着大部分 U/I 都涉及 Flex 框架,但我需要帮助的文件处理问题不依赖于应用程序的 Flex U/I 部分。当我试图处理一个非常大的递归目录结构列表时,
我使用的函数套件是 FindFileFirst、FindFileNext 和 FindClose。如果我编写一个独立的测试程序,它会很好地列出目录、子目录和文件。目录和文件的大小写正确显示——就像它们在 Windows 资源管理器中正确显示一样,或者使用 dir 命令。
但是,如果我通过 Adobe ANE 界面启动完全相同的功能,我会收到完全相同的输出,但所有目录名称都将减少为小写。
现在,我应该澄清一下,当这段代码作为 Native Extension 执行时,它不是将数据传回 AIR,而是直接将结果输出到一个完全在 CRT 世界中打开和关闭的文件中,所以我们不是通过在两个不同的世界之间传递文本或字节数组来讨论任何类型的通信混乱。
不用在这个论坛上堆砌大量无关紧要的代码,我认为可以帮助任何能够帮助我的人是这些片段:
// This is where the output gets written.
FILE* textFile = _wfopen (L"Peek.txt", L"wt,ccs=UTF8");
WIN32_FIND_DATAW fdf;
HANDLE find = NULL;
wchar_t fullPath[2048];
// I am just showing the third argument as a literal to exemplify
// what, in reality is passed into the …
Run Code Online (Sandbox Code Playgroud) 我最近一直在写很多 C 代码,我遇到了一个类似于我在 Go 中遇到的问题,我有很多代码看起来像这样:
if (foo() != 0) {
return -1;
}
bar();
Run Code Online (Sandbox Code Playgroud)
这类似于if err != nil
我在 Golang 中看到的常量检查。我想我想出了一个有趣的模式来处理这些容易出错的序列。我受到函数式语言的启发,这些语言具有andThen
将可能成功也可能不成功的计算链接在一起的序列。我尝试实现一个简单的回调设置,但我意识到这在没有 lambda 的 C 中几乎是不可能的,即使有它们也会是回调地狱。然后我考虑使用跳转,我意识到可能有一个很好的方法来做到这一点。有趣的部分在下面。如果不使用这种模式,将会有大量的if (Buffer_strcpy(...) != 0)
检查或一团糟的回调地狱。
switch (setjmp(reference)) {
case -1:
// error branch
buffer->offset = offset;
Continuation_error(continuation, NULL);
case 0:
// action 0
Buffer_strcpy(buffer, "(", andThenContinuation);
case 1:
// action 1 (only called if action 0 succeeds)
Node_toString(binaryNode->left, buffer, andThenContinuation);
case 2:
Buffer_strcpy(buffer, " ", andThenContinuation);
case 3:
Node_toString(binaryNode->right, buffer, andThenContinuation);
case …
Run Code Online (Sandbox Code Playgroud) 我有一个任务是用 C 语言为 shell 编写代码。其中一个 shell 命令是“quit kill”,我必须在关闭主进程之前向所有子进程发送 TERM 信号。\n如果子进程在 5 秒内没有关闭,我必须发送 KILL 信号来终止它。\n现在我已经编写了代码,我想测试它,但我不知道如何测试,所以你们知道忽略 TERM 信号的进程吗?\n这是我为终止一个子进程而编写的代码:
\n\n kill(pid,SIGTERM);\n t = time(NULL);\n while(1){\n int state = waitpid(pid,&status,WNOHANG);\n if(state<0){\n perror("Error ");\n exit(0);\n }\n if(state == 0){\n if((time(NULL)-t)>5){\n printf("(5 sec passed) Sending SIGKILL\xe2\x80\xa6 Done.\\n");\n kill(pid,SIGKILL);\n break;\n }\n }\n else{\n printf("Done.\\n");\n break;\n }\n }\n
Run Code Online (Sandbox Code Playgroud)\n