小编101*_*001的帖子

C++重新声明循环计数变量不一致的行为?

我在Visual Studio 2010中做C++并发现了一些奇怪的行为.长话短说,我发现这不会编译:

for (int i = 0; i < 10; i++)
{
    int i = 11;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是正确的,因为变量i已经在for循环头中声明.

现在,如果我在重新声明i之前插入另一个for循环,那么突然编译器,intellisense等thiks代码是正确的 - 没有给出真正的警告(尝试警告级别3和4(/ W3和/ w4)) .所以,这样做实际上将编译并运行:

for (int i = 0; i < 10; i++)
{
    for(int j = 0; j < 5; j++)
    {
    }

    int i = 11;
}
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我觉得奇怪的是,在另一个for循环中使用其他相同的代码场景是合法的.任何善良的精神能告诉我我在这里俯瞰什么?

提前致谢!

编辑: 哇,谢谢大家的所有回复和演示 - 你太棒了!:)这个揭露错误的样本确实让我想到了,我只是假设MS现在已经注意到这样的事情并修复它......至少在VS2013中.

尝试按照建议更改优化设置,但它没有任何区别.

谢谢大家!

第一段代码

第二段代码

演示来源:@Mark Garcia

c++ scope for-loop visual-studio-2010

31
推荐指数
1
解决办法
1030
查看次数

Visual Studio 2010 - C# - “忽略声明语句中的空格”不起作用

我正在使用 Visual Studio 2010 并且有如下所示的语句:

a = 1;
ab = 12;
abc = 123;
etc...
Run Code Online (Sandbox Code Playgroud)

我非常想变成这样:

a   = 1;
ab  = 12;
abc = 123;
etc...
Run Code Online (Sandbox Code Playgroud)

没有 Visual Studio 然后在以分号结束语句或按 Ctrl-K + F(格式化选定行)时将它们转回第一个示例。

我已经选中了工具->选项->文本编辑器->C#->格式->间距->“忽略声明语句中的空格”框,但它没有帮助。当我创建一个新变量时,它只对真正的声明有帮助。也就是说,它适用于以下块:

int a   = 1;
int ab  = 12;
int abc = 123;
etc...
Run Code Online (Sandbox Code Playgroud)

但我真的(也)需要一个选项“忽略赋值语句中的空格”。我该怎么做?我尝试安装“对齐分配”(https://visualstudiogallery.msdn.microsoft.com/0cc34d69-c6f1-41e3-ac6e-5de071b3edc8),果然,它对齐了行,但随后 Visual Studio 自动取消对齐它们格式化文本文件或编辑行时。

c# text-formatting visual-studio-2010

5
推荐指数
2
解决办法
871
查看次数

C++:有符号或无符号数组索引?

我正在从x86将C++应用程序移植到x64.现在,有一个自定义数组类,其函数类似于GetRowCount(); 如果这些函数返回一个size_t(并且整个数组类将处理size_t进行索引),这意味着我可以在这样的数组中得到(2 ^ 64)-1个项目,但如果我将使用带符号的ptrdiff_t代替我会失去很多最大数组大小.我的问题基本上是使用哪些类型:数组的有符号或无符号类型?我一直在阅读其他主题,但他们纯粹专注于索引.

我看到的问题是由于让我们说代码看起来像这样:

[signed/unsigned type] result = customArray.GetRowCount() - a;
Run Code Online (Sandbox Code Playgroud)

在某些情况下,变量"a"可能是有符号的,在其他情况下是无符号的,并且假设它可能大于返回的行数.然后用"结果"变量做什么我不知道,但它可以用于某些进一步的算术运算.

因此,为了避免在使用自定义数组类的代码中混合使用有符号和无符号算术以及隐式转换,我是否应该在该数组类中使用ptrdiff_t,从而让GetRowCount()之类的函数返回ptrdiff_t?或者我应该使用intptr_t,它更合乎逻辑吗?

这里http://www.viva64.com/en/a/0050/示例显示应该使用ptrdiff_t ...

但是,如开头所述,我可以不再索引具有最多SIZE_MAX元素的数组,因为有符号类型的值范围的一半将用于负值.

我希望我有任何意义,并且非常感谢一些澄清和指导.谢谢大家!

c++ arrays indexing 64-bit

2
推荐指数
1
解决办法
2644
查看次数

C++在堆上分配大型数组会产生"内存不足异常"

我目前在使用数据声明或填充大型数组时遇到问题,因为我得到一个"内存不足"的对话框,源自CMemoryException.

我试图用一个对象的大约50000个元素创建一个数组或向量(试过两个),其中sizeof(MyObjectClass)返回大约37000个字节.

如果我尝试按元素填充向量或CArray元素,那么在获取Out Of Memory异常之前,我会在16000个元素附近填充.那应该接近600MB?

我在机器上有8GB RAM,根据Windows任务管理器只使用4GB.因此物理RAM的数量不应该带来问题.我在Visual Studio 2010中运行C++ MFC,32位.

如果我试着写

MyObjectClass* heaparray = new MyObjectClass[50000];
Run Code Online (Sandbox Code Playgroud)

然后我立即在那一行上得到了同样的内存不足错误.

有任何想法吗?先感谢您!

更新:我还尝试使用以下字段创建一个TestStruct:

struct TestStruct
{
  long long field1;
  GUID field2;
  GUID field3;
  GUID field4;
  TCHAR field5[256];
  TCHAR field6[4];
  TCHAR field7[258];
  TCHAR field8[1026];
  TCHAR field9[258];
  TCHAR field10[16386];
  TCHAR field11[258];
};

TestStruct* heapArr = new TestStruct[50000];
Run Code Online (Sandbox Code Playgroud)

仍然相同...执行最后一行代码时出现"Out of Memory"异常.在处理大数据时,堆不应该只是由RAM(或多或少)限制的可能性之一.然而......因为它已经在600MB的分配空间崩溃了,我不能同意这是非常大的数据......或者我应该?:/

c++ memory arrays

2
推荐指数
1
解决办法
4681
查看次数