我的观点是,如果sizeof(int)==1 ,C实现不能满足某些stdio函数(尤其是fputc / fgetc )的规范,因为int需要能够保存任何可能的unsigned char或EOF值(-1 )。 这个推理是否正确? (显然如果CHAR_BIT是8, sizeof(int)不能是1,由于int的最小需求范围,所以我们隐含地只谈论CHAR_BIT>=16 ,例如DSP,其中典型的实现将是独立实现而不是托pipe实现,因此不需要提供stdio 。) 编辑 :在阅读答案和一些链接引用后,对托pipe实现有可能有效的一些想法sizeof(int)==1 : 首先,一些引用: 7.19.7.1(2-3): 如果stream指向的inputstream的文件尾指示符未被设置,并且存在下一个字符,则fgetc函数将该字符作为无符号字符转换为int,并将stream的相关文件位置指示符(如果定义)。 如果stream的文件结束指示符被设置,或者stream处于文件结尾,则stream的endof fi le指示符被设置,并且fgetc函数返回EOF。 否则,fgetc函数返回stream指向的inputstream中的下一个字符。 如果发生读取错误,则设置stream的错误指示符,并且fgetc函数返回EOF。 7.19.8.1(2): fread函数读入由ptr指向的数组,最多由stream指向的stream指定大小为size的nmemb元素。 对于每个对象,调用fgetc函数调用大小,并按照读取的顺序将结果存储在一个无符号字符数组中,该字符恰好覆盖该对象。 stream(如果定义)的文件位置指示符是由成功读取的字符数提前的。 思考: 读取int范围以外的unsigned char值可能会简单地在实现中具有未定义的实现定义的行为。 这是特别令人不安的,因为这意味着使用fwrite和fread来存储二进制结构(虽然它导致不可移植的文件,应该是一个操作,你可以在任何一个单一的实现可移植执行)似乎工作,但默默地失败。 基本上总是导致未定义的行为 。 我接受一个实现可能没有一个可用的文件系统,但是很难接受一个实现可能会有一个文件系统在您尝试使用它时立即自动调用鼻子恶魔,并且无法确定它是不可用的。 现在我意识到行为是实现定义的,而不是未定义的,这并不是非常令人不安,我认为这可能是一个有效的(虽然是不希望的)实现。 一个实现sizeof(int)==1可以简单地定义文件系统是空的和只读的。 那么应用程序就不可能读取任何自己写入的数据,只能从stdin上的input设备读取,这样才能实现正int值。 编辑(再次):从C99的理由,7.4: EOF传统上是-1,但可以是任何负数, 因此可以与任何有效的字符代码区分开来 。 这似乎表明, sizeof(int)可能不是1,或者至less这是委员会的意图。
我正在创build一个应用程序的问题。 我试图通过我的C#应用程序启动一个Windows服务。 当我点击我的开始button,它看起来像一切都经过,但是当我login到服务器,该服务仍然不显示它正在运行。 但是,第二次运行它,我得到一个exception,说服务的实例已经运行。 再次login到服务器时,服务似乎停止。 有没有人见过这个? 这是我的代码。 try { while (reader.Read()) { int timeoutMilliseconds = 1000; string serviceName = reader["ServiceName"].ToString(); string permission = reader["Permission"].ToString(); if (permission == "E") { lblServStartSuccess.Visible = true; ServiceController service = new ServiceController(serviceName); TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } else { lblServErrorStart.Visible = true; } } } catch (Exception […]
我想出了一些其他网站的这个程序,并想到尝试它,这里的程序: #include <stdio.h> int main() { int a=10; switch(a) { case '1': printf("one"); break; case '2': printf("two"); break; defau4t: printf("none"); } return 0; } 令人惊讶的是,这个编译没有错误或警告。 这怎么可能? 关键字“default”没有错误吗? 有谁能解释这种行为吗?
我知道这个问题已经被问了几次了,但到目前为止我还没有find一个好的解决scheme。 我有一个与其他控制面板。 我想要在面板上的所有控件上画一条线 我遇到了三种types的解决scheme(非他们的工作方式我想要的): 获取桌面DC和绘图在屏幕上。 如果它们与表单重叠,这将使用其他应用程序。 覆盖面板的“CreateParams”: = protected override CreateParams CreateParams { get { CreateParams cp; cp = base.CreateParams; cp.Style &= ~0x04000000; //WS_CLIPSIBLINGS cp.Style &= ~0x02000000; //WS_CLIPCHILDREN return cp; } } //注意我也尝试禁用WS_CLIPSIBLINGS 然后绘制一行OnPaint()。 但是…由于面板的OnPaint在其中的控件的OnPaint之前被调用,因此内部控件的绘制只是简单地绘制在行的顶部。 我见过有人build议使用消息filter来监听WM_PAINT消息,并使用一个计时器,但我不认为这个解决scheme是“好的做法”或者是有效的。 你会怎么做 ? 确定内部控件在X毫秒后完成绘图,并将计时器设置为X毫秒? 该屏幕快照显示closures了WS_CLIPSIBLINGS和WS_CLIPCHILDREN的面板。 蓝线画在小组的OnPaint上,只是被文本框和标签画上。 红线只是涂在顶部,因为它不是从面板的OnPaint(它实际上是一个button被点击的结果) 第三:创build一个透明的图层并在该图层上绘制。 我已经创build了一个透明的控制使用: protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; […]
首先,我已经阅读了关于协议和反变换的SO和博客的许多解释,并且非常感谢Eric Lippert在协变和逆变方面创作了这样一个系列。 然而,我有一个更具体的问题,我正试图让我的头稍微有点。 据我所知, 埃里克的解释是,协变和逆变都是描述转换的形容词。 协变变换是保持types顺序的变换,逆变换是逆转变换的变换。 我以这样的方式理解协变性,我认为大多数开发人员直观地理解。 //covariant operation Animal someAnimal = new Giraffe(); //assume returns Mammal, also covariant operation someAnimal = Mammal.GetSomeMammal(); 这里的返回操作是协变的,因为我们正在保持动物比哺乳动物或长颈鹿更大的尺寸。 在这一点上,大多数返回操作是协变的,逆变操作是没有意义的。 //if return operations were contravariant //the following would be illegal //as Mammal would need to be stored in something //equal to or less derived than Mammal //which would mean that […]
我必须编写一个Windows服务来处理某些机密数据(如PIN码,密码等)。 这些信息需要很短的时间:通常它们几乎立即被发送到智能卡读卡器。 让我们考虑这段代码: { std::string password = getPassword(); // Get the password from the user writePasswordToSmartCard(password); // Okay, here we don't need password anymore. // We set it all to '\0' so it doesn't stay in memory. std::fill(password.begin(), password.end(), '\0'); } 现在我关心的是编译器优化。 在这里编译器可能会检测到密码即将被删除,并且在这一点上改变它的值是无用的,只需要删除这个呼叫。 我不希望我的编译器关心未来未被引用的内存的价值。 我的担心是否合法? 我怎样才能确定这样一段代码不会被优化?
我创build的应该是一个非常简单的Win32 C ++应用程序,仅用于显示半透明的PNG。 该窗口不应该有任何铬,所有的不透明度应该在PNG本身进行控制。 我的问题是,当窗口下的内容改变时,窗口不会重新绘制,所以当应用程序最初启动时,PNG的透明区域与“窗口”下的内容“卡住”。 这里是我设置新窗口的那一行: hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 0, height/2 – 20, 40, 102, NULL, NULL, hInstance, 0); 对于RegisterClassEx的调用,我有这样的背景设置: wcex.hbrBackground = (HBRUSH)0; 这是我的WM_PAINT消息处理程序: case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); Gdiplus::Graphics graphics(hdc); graphics.DrawImage(*m_pBitmap, 0, 0); EndPaint(hWnd, &ps); break; } 有一件事要注意的是,应用程序总是停靠在屏幕的左侧,不移动。 但是,当用户打开,closures或移动窗口时,应用程序下面的内容可能会改变。 应用程序首次启动时,看起来很完美。 透明(和simi透明)的PNG部分显示完美。 但是,当应用程序下面的背景发生变化时,背景不会更新,只是应用程序首次启动时保持不变。 实际上,WM_PAINT(或WM_ERASEBKGND在后台更改时不会被调用)。 我已经玩了很长一段时间,已经接近100%的权利,但不是那样。 例如,我试图设置背景(HBRUSH)NULL_BRUSH,我试着处理WM_ERASEBKGND。 当它下面的内容改变时,可以做些什么来重新绘制窗口?
向别人讲解虚拟派发很容易:每个对象都有一个指向表的指针作为其数据的一部分。 class上有N个虚拟方法。 每当调用某个特定的方法时,我都会在对象到达时将其索引,并调用表中的第i个方法。 实现方法X()的每个类将在同一个ith索引中拥有方法X()的代码。 但是,然后我们得到接口。 而接口需要某种扭曲,因为两个实现相同接口的非inheritance类将具有不同索引的虚函数。 我已经search了互联网,并且我可以find关于如何实现接口调度的许多讨论。 有两大类:a)某种散列表查找对象以find正确的分派表b)当对象被转换到接口时,创build一个新的指针指向相同的数据,但指向不同的虚函数表。 但是尽pipe有很多关于如何工作的信息,但是我并没有发现.NET运行时引擎实际上如何实现它。 有没有人知道一个文档,描述了当对象types是一个接口时,在callvirt指令中发生的实际指针algorithm?
根据文档,我可以通过使用条件断点来打破特定的exceptiontypes。 不过,条件的语法对我来说并不是很清楚: condition bnum <expression> 看看expression式语法,我认为这是我需要的模式: {type} addr 但是,我不知道我应该通过addr参数。 我尝试了以下内容: (gdb) catch throw (gdb) condition 1 boost::bad_function_call * 但它不起作用(gdb中断所有exceptiontypes)。 谁能帮忙? 更新 我也试过@亚当的build议,但它会产生一个错误信息: (gdb) catch throw boost::bad_function_call Junk at end of arguments. 没有boost:: namespace: (gdb) catch throw bad_function_call Junk at end of arguments. 解决方法 破坏bad_function_call的构造函数。
我试图查询TfsTeamProjectCollection包含194个团队项目的主TfsTeamProjectCollection的单个团队项目。 我知道如何从WorkItem通过Id获取WorkItemStore 。 问题是,通过这样做,APIsearch集合中的所有项目,查询需要大约一分钟。 这太慢了,必须有办法直接从一个团队项目查询工作项目? 这里是我有的代码: private Uri collectionUri; private TfsTeamProjectCollection projectCollection; private WorkItemStore workItemStore; public Project GetTeamProject() { projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(collectionUri); workItemStore = projectCollection.GetService<WorkItemStore>(); Project teamProject = workItemStore.Projects[TFS_PROJECT_KEY]; return teamProject; } 现在我有了我感兴趣的团队项目,如何通过ID查询工作项目,或者只是获取项目中的所有工作项目?