我最近读到C和C++中的带符号整数溢出会导致未定义的行为:
如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义.
我目前正试图了解这里未定义行为的原因.我认为这里发生了未定义的行为,因为当整数变得太大而无法适应底层类型时,整数开始操纵自身周围的内存.
所以我决定在Visual Studio 2015中编写一个小测试程序,用以下代码测试该理论:
#include <stdio.h>
#include <limits.h>
struct TestStruct
{
char pad1[50];
int testVal;
char pad2[50];
};
int main()
{
TestStruct test;
memset(&test, 0, sizeof(test));
for (test.testVal = 0; ; test.testVal++)
{
if (test.testVal == INT_MAX)
printf("Overflowing\r\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在这里使用了一个结构来防止Visual Studio在调试模式下的任何保护问题,比如堆栈变量的临时填充等等.无限循环应该导致几次溢出test.testVal,确实如此,除了溢出本身之外没有任何后果.
我在运行溢出测试时查看了内存转储,结果如下(test.testVal内存地址为0x001CFAFC):
0x001CFAE5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x001CFAFC 94 53 …Run Code Online (Sandbox Code Playgroud) 我正在使用这个预处理器宏来"字符串化"并从定义解析函数中轻松返回:
#define STRINGIFY_RETURN(x) case x: return #x ""
Run Code Online (Sandbox Code Playgroud)
它就像MBSC环境中的魅力一样,具有正常的字符串文字.例:
#define MY_DEFINE_1 1
#define MY_DEFINE_2 2
#define MY_DEFINE_3 3
const char* GetMyDefineNameA(unsigned int value)
{
switch(value)
{
STRINGIFY_RETURN(MY_DEFINE_1);
STRINGIFY_RETURN(MY_DEFINE_2);
STRINGIFY_RETURN(MY_DEFINE_3);
default: return "Unknown";
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不得不越来越多地切换到Unicode兼容性,所以我不得不重写这个函数来返回Unicode字符串,这需要L在字符串文字前加前缀.所以我尝试过:
#define STRINGIFY_RETURN_WIDE(x) case x: return #x L""
const wchar_t* GetMyDefineNameW(unsigned int value)
{
switch(value)
{
STRINGIFY_RETURN_WIDE(MY_DEFINE_1);
STRINGIFY_RETURN_WIDE(MY_DEFINE_2);
STRINGIFY_RETURN_WIDE(MY_DEFINE_3);
default: return L"Unknown";
}
}
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
错误C2308:连接不匹配的字符串
错误C2440:'return':无法从'const char [12]'转换为'const wchar_t*
我也尝试过:
#define STRINGIFY_RETURN_WIDE(x) case x: return L #x ""
#define STRINGIFY_RETURN_WIDE(x) case x: return …Run Code Online (Sandbox Code Playgroud) 我是TypeScript的新手,目前遇到一个奇怪的问题。当文档准备好时,我使用JQuery创建主类的实例。
var main: MainApp;
$(document).ready(function () {
main = new MainApp();
});
Run Code Online (Sandbox Code Playgroud)
简化的MainApp类:
class MainApp {
// Helper Objects
net: AppNetworking;
urlHelper: UrlHelper;
cat: Category;
// Construction
constructor() {
this.net = new AppNetworking();
this.urlHelper = new UrlHelper();
}
// Ajax Callback with Data needed to initialize the "cat" object
private AjaxCallback(categoryData){
this.cat = new Category(categoryData);
}
// Event Handler for an HTML-Element
// As it would be called anonymously in JS I decided to make it a static …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以为创建的子窗口指定WndProc CreateWindowEx.
我已经创建了一个Window类,主窗口,窗口过程和一个消息循环.该代码有效,我决定将其保留,以便明确我的问题.
到目前为止,这是我的Window Proc:
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// Creation of the Win32 Window
case WM_CREATE:
// Add an Edit Field
CreateWindowEx(
WS_EX_CLIENTEDGE,
"EDIT",
"",
WS_CHILD | WS_VISIBLE,
5, 5, 200, 24,
hwnd,
(HMENU)100,
g_Instance, // Comming from WinMain
NULL
);
return DefWindowProc(hwnd, uMsg, lParam, wParam);
case WM_KEYDOWN:
// Track key presses on the edit field
std::cout << "The key with the code " << wParam << " …Run Code Online (Sandbox Code Playgroud) 我正在尝试为TCP端口1433添加防火墙规则,使用NetFwTypeLib库的特定组.但是将端口添加到LocalPorts变量中作为整数转换为字符串或仅作为简单的"1433"字符串,返回值超出范围异常.删除端口,只使用所有端口工作正常.
这是我使用的代码:
bool CreateRule(string sName, string sPort, NET_FW_IP_PROTOCOL_ ProtocolType, string sIpAdress, string sGroup = "")
{
try
{
INetFwRule firewallRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
firewallRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
firewallRule.Description = "Used to allow Server access.";
firewallRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
firewallRule.Enabled = true;
firewallRule.Name = sName;
firewallRule.Grouping = sGroup;
firewallRule.LocalPorts = sPort; // "1433" causes out of range exception
firewallRule.RemoteAddresses = sIpAdress;
firewallRule.Protocol = (int)ProtocolType;
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(
Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
firewallPolicy.Rules.Add(firewallRule);
return true;
}
catch
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
设置firewallRule.LocalPorts成员会导致异常.有人知道出了什么问题吗?
我想把a转换CString成a char[].有人告诉我怎么做?
我的代码是这样的:
CString strCamIP1 = _T("");
char g_acCameraip[16][17];
strCamIP1 = theApp.GetProfileString(strSection, _T("IP1"), NULL);
g_acCameraip[0] = strCamIP1;
Run Code Online (Sandbox Code Playgroud) 我需要制作大型DIV结构并将它们附加到包装器上.但到目前为止我所看到的总是将一个 DIV元素附加到另一个元素中.
有一个空的DIV-Wrapper,用"大"DIV-Elements填充
<div class="PostWrapper">
// Content should be added to here
</div>
Run Code Online (Sandbox Code Playgroud)
我希望附加的DIV-Elements PostWrapper看起来像这样:
<div class="Post">
<div class="PostHead">
<span class="profilePicture">
<img src="../Profiles/Tom.jpg" />
</span>
<span class="userName">Tom</span>
<span class="postTime">10 minutes ago</span>
</div>
<div class="PostBody">
<p>Hey Tom, great work at the presentation last week. Well done!</p>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
所以这是一个DIV-Structure的例子,我想构建并存储在一个javascript变量中,并附加到我的包装器,如:
var postElement = $("div", {class: "Post"}).append("div", {class: "PostHead"}).append("div", {class: "PostBody"})......
Run Code Online (Sandbox Code Playgroud)
这不会像预期的那样工作.但是,如果没有过于复杂的代码,我无法想到一个简单的方法.
怎么可能呢?
我是C++的新手,通过在线教学自学.今天我正在玩指针和不同的结果,只需要确认一些东西.基本上我知道指针是如何工作的.下面的图片是控制台中的简单代码和输出.
根据我的理解,第二个值2是存储在指针p1指向的元素中的值,因为输出是使用dereference运算符()的p1.
第一个值0x22ff1c,我只需要确认.我假设它是元素存储器中地址的值,因为输出是针对p1的,当然使用引用运算符/符号(&)指向[1]的地址.
我很确定我是从网上研究过的,但只需要有人直接向我确认.
所以我的问题基本上是:0x22ff1c确实是第二个元素的地址,如果没有,那么那个"看起来很滑稽"的值是什么呢?
#include <iostream>
int main()
{
int a[5] = {1,2,3,4,5};
int *p1;
p1 = &a[1];
std::cout << "Value1: " << p1 << "\n" << "Value2: " << *p1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Value1: 0x22ff1c
Value2: 2
Run Code Online (Sandbox Code Playgroud) 我目前面临的问题是我的主Form.cs文件变得越来越大,我想把它分成几个部分文件.这些应该粘贴MainForm.cs在Visual Studio解决方案资源管理器中的主Form()节点下面.
我尝试创建新的类文件并将其声明为我的MainForm类的部分源文件.但是,新创建的分部类文件会更改它的图标,看起来像一个表单.相反,它应该坚持在解决方案资源管理器中的MainFormNode 下面.
要想象问题:
该MainForm.ContextActions.cs文件内容如下:
namespace Interface_Group_Editor
{
public partial class MainForm
{
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
内容类似于MainForm.Designer.cs文件.然而,.Designer.cs文件粘在MainForm.cs节点下面而.ContextActions.cs不是!
我只处理文件中绝对必要的表单事件,MainForm.cs并将我的业务逻辑放在我从表单访问的外部类中.但是,单独使用我的TreeView代码来维护和编辑表单大约需要500行代码,这些代码可以重新定位到新的部分源文件中.这将有助于项目结构的整体可见性!
有没有办法强制这种行为到解决方案资源管理器?
我试图在JavaScript中使用类似于Objects/Classes的东西.我发现这可以通过一个函数来完成.所以我的类代码是这样的:(使用jQuery)
function InfoBox(Box) { // My class
this.Box = Box; // html element
this.Text = 'Information here';
this.Image = 'foo.png';
setText = function () {
this.Box.children('.Text').html(this.Text);
}
}
Run Code Online (Sandbox Code Playgroud)
函数中的变量工作正常,但每当我调用方法/函数"setText"时
var iBoxUser = new InfoBox($('.iBoxUser'));
iBoxUser.Text = 'Welcome';
iBoxUser.setText(); // Error occurs here
Run Code Online (Sandbox Code Playgroud)
我收到错误:"未捕获TypeError:undefined不是函数"
似乎我在某种程度上做了错误的功能.或者功能甚至可以包含其他功能?