小编Pet*_*erK的帖子

班次计数为负数或太大错误 - 正确的解决方案?

我有以下函数用于读取big-endian四字(在抽象基本文件I/O类中):

unsigned long long File::readBigEndQuadWord(){
  unsigned long long qT = 0;
  qT |= readb() << 56;
  qT |= readb() << 48;
  qT |= readb() << 40;
  qT |= readb() << 32;
  qT |= readb() << 24;
  qT |= readb() << 16;
  qT |= readb() << 8;
  qT |= readb() << 0;
  return qT;
}
Run Code Online (Sandbox Code Playgroud)

readb()函数读取BYTE.以下是使用的typedef:

typedef unsigned char   BYTE;
typedef unsigned short  WORD;
typedef unsigned long   DWORD;
Run Code Online (Sandbox Code Playgroud)

问题是我通过shift操作在前四行获得了4个编译器警告:

警告C4293:'<<':移位计数为负数或过大,未定义的行为

我理解为什么会发生这种警告,但我似乎无法弄清楚如何正确摆脱它.我可以这样做:

qT |= (unsigned long long)readb() << 56; …

c++ math bit-shift

20
推荐指数
1
解决办法
1万
查看次数

发布模式静态库比调试模式版本大得多

今天我发现我正在处理的编译静态库在Release模式下比在Debug中大得多.我发现它非常令人惊讶,因为大部分时间恰好相反(据我所知).

调试模式下的大小略大于3 MB(这是一个相当大的项目),但在发布时它最多可达到6.5 MB.有人能告诉我这可能是什么原因吗?我正在使用静态库项目的常规Visual Studio(2008)设置,在构建配置设置中几乎没有更改.在发布时,我正在使用/ O2并且"赞成大小或速度"被设置为"不会"./ O2("最大化速度")是否会导致最终的.lib比包含所有调试信息的调试版本大得多?

编辑: 附加信息:
调试:
- 整个程序优化:否
- 启用功能级别链接:否

发布:
- 整个程序优化:启用链接时代码生成
- 启用功能级别链接:是

c++ static-libraries release-mode debug-mode

19
推荐指数
1
解决办法
5541
查看次数

如何在不破坏代码的情况下正确修复"struct/union中的零大小数组"警告(C4200)?

我正在将一些代码集成到我的库中.这是一个针对速度进行了优化的复杂数据结构,因此我不打算过多地修改它.整合过程顺利,实际上几乎完成(它编译).有一件事还在困扰着我.我多次收到C4200警告:

warning C4200: nonstandard extension used : zero-sized array in struct/union
Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
Run Code Online (Sandbox Code Playgroud)

代码有效,但是这个警告给了我毛骨悚然(特别是带有copy-ctor的部分).出现警告是因为结构声明如下:

#pragma pack( push )
#pragma pack( 1 )
// String
struct MY_TREEDATSTR
{
    BYTE btLen;
    DWORD dwModOff;
    BYTE btPat[0];
};

typedef MY_TREEDATSTR TREEDATSTR;
typedef MY_TREEDATSTR *PTREEDATSTR;

#pragma pack( pop )
Run Code Online (Sandbox Code Playgroud)

Note the btPat[0]. Is there a way how to easily and correctly get rid of this warning without breaking the code and/or having …

c++ struct warnings memory-management

19
推荐指数
2
解决办法
2万
查看次数

"旧"C功能可能比新C++功能更好的情况?

最近,我有跟我的老板谁鼓励我在用C++流和坚持"好老"的讨论(很长一段时间C语言开发)printf和朋友.现在我可以理解他为什么这么说并相信我没有听从他的建议.

但是,这仍然是窃听我-有没有用C事情是在某些情况下仍较好比相同/相似的事情新C++实现?更好的意思是例如性能,稳定性甚至代码可读性/可维护性.如果是这样,有人可以给我一些例子吗?我主要讨论像printf/streams这样的类似差异,而不是关于继承或OOP等功能.我问这一切的原因是我认为自己是一个C++开发人员,因此我总是尝试编写C++方式.

c c++

16
推荐指数
2
解决办法
673
查看次数

用于识别文本文件中的编程语言的代码

我应该编写代码,当给出一个文本文件(源代码)作为输入时,将输出哪种编程语言.这是问题的最基本定义.更多限制如下:

  • 我必须用C++编写.
  • 应该识别各种语言 - html,php,perl,ruby,C,C++,Java,C#......
  • 误报(错误识别)的数量应该低 - 输出"未知"而不是错误结果.(它将在概率列表中,例如未知:100%,见下文)
  • 输出应该是代码知道的每种语言的概率列表,因此如果它知道C,Java和Perl,则输出应该是例如:C:70%,Java:50%,Perl:30%(注意有不需要概率总和高达100%)
  • 它应该具有良好的准确度/速度比(速度更受青睐)

如果能够以一种方式编写代码,即添加用于识别的新语言相当容易并且仅涉及为该特定语言添加"设置/数据",那将是非常好的.我可以使用任何可用的东西 - 启发式,神经网络,黑魔法.任何东西.我甚至被允许使用现有的解决方案,但是:解决方案必须是免费的,开源的并允许商业用途.它必须以易于集成的源代码或静态库的形式出现 - 没有DLL.但是,我更喜欢编写自己的代码或只使用其他解决方案的片段,我厌倦了整合其他代码.最后一点:也许你们中的一些人会建议FANN(快速人工神经网络库) - 这是我唯一不能使用的东西,因为这是我们使用ALREADY的东西,我们想要替换它.

现在的问题是:你将如何处理这样的任务,你会做什么?有任何建议如何实现这个或使用什么?

编辑:根据评论和答案,我必须强调一些我忘记的事情:速度是非常关键的,因为这将获得数千个文件,并且应该快速回答,所以查看一千个文件应该为所有这些文件生成答案最多几秒钟(文件的大小当然很小,每个几KB).所以试图编译每一个都是不可能的.问题是,我真的想要每种语言的概率 - 所以我宁愿知道该文件可能是C或C++,但它是bash脚本的可能性非常低.由于代码混淆,评论等我认为寻找100%准确的代码是一个坏主意,事实上并不是这个目标.

c++ algorithm text-processing language-recognition

16
推荐指数
2
解决办法
2718
查看次数

如何在一次通过中近似计算数组中不同值的计数

我有几个巨大的数组(数百万++成员).所有这些都是数字数组,它们没有排序(我不能这样做).有些是uint8_t,有些uint16_t/32/64.我想估计这些数组中不同值的计数.条件如下:

  1. 速度非常重要,我需要在一次通过数组时执行此操作,我必须按顺序执行它(不能来回跳转)(我在C++中这样做,如果这很重要)
  2. 我不需要精确的计数.我想知道的是,如果它是一个uint32_t数组,如果有10或20个不同的数字,或者有数千或数百万.
  3. 我可以使用相当多的内存,但使用的越少越好
  4. 数组数据类型越小,我需要越准确
  5. 我不介意STL,但如果我能做到没有它那将是伟大的(虽然没有BOOST,对不起)
  6. 如果方法可以很容易地并行化,那将很酷(但它不是强制条件)

完美输出的例子:

ArrayA [uint32_t, 3M members]: ~128 distinct values
ArrayB [uint32_t, 9M members]: 100000+ distinct values
ArrayC [uint8_t, 50K members]: 2-5 distinct values
ArrayD [uint8_t, 700K members]: 64+ distinct values
Run Code Online (Sandbox Code Playgroud)

我知道有些限制可能看起来不合逻辑,但就是这样.作为旁注,我也想要最常用的X(3或10)和最少使用的值,但这样做要容易得多,我可以自己做.但是,如果有人也有这样的想法,请随时分享!

编辑:关于STL的一些澄清.如果您有使用它的解决方案,请发布它.不使用STL对我们来说只是一个奖励,我们不太喜欢它.但是,如果它是一个很好的解决方案,它将被使用!

c++ arrays algorithm search

14
推荐指数
2
解决办法
911
查看次数

我应该编写什么来深入了解高级C++?

我正在寻找项目建议,这些建议会迫使我用先进的C++功能"弄脏自己".我说的是那些能充分利用语言能力的项目(STL甚至是提升(还没有使用它)).

为什么?因为我想学习,我想找到新的挑战.在工作中,事情开始变得无聊,真的.我习惯于经常遇到新事物,新想法和新功能.在大多数情况下,这不是遗留公司代码的情况,正如您可以想象的那样.而且,在这里查看一些问题和答案,深入研究模板的深度,共享指针以及所有我碰巧发现自己迷失的东西,不知道答案甚至更糟 - 甚至不了解正在发生的事情.

这就是为什么我正在寻找可以自己编写代码的东西,最好只使用C++(也许是+ boost) - 命令行实用程序,请不要使用图形.我真的不想加入任何开源社区.我知道,查看其他人的代码很有帮助.但这就是我在工作中做了很多事情......不,谢谢.项目可以是任何有意义或无意义的东西,有用的实用程序或只是没有实际用途的东西.唯一的要求是,它会迫使我真正测试我的C++技能.或者至少用C++的基本知识进行编码应该是非常困难甚至是不可能的 - 我是那种对代码工作永不满意的人,所以我相信这会迫使我学习.但请记住,我是一个工作的人,我的时间有限,所以答案就像"编写自己的操作系统"

c++ boost

10
推荐指数
2
解决办法
676
查看次数

一个大签到几个小签到?

昨天当我查看最新版本的内部工具时,我看到了大约30多个新版本.这让我很好奇,因为我认为有人最终修复了那些烦人的错误,并添加了我等待了这么长时间的功能......猜猜怎么着?这一切都没有发生,有人只是认为更新一些标题并对两个或三个函数进行微调是很好的.一切都在单独的提交中.大.

这引起了我们团队的讨论 - 如果这被认为是好的,还是我们应该禁止这种"滥用"?可以说这真的可以适合一两个提交,但30似乎很多.应如何处理 - 最佳做法是什么?

language-agnostic version-control

9
推荐指数
1
解决办法
184
查看次数

如何编写灵活的模块化程序,模块之间具有良好的交互可能性?

我在这里搜索了类似主题的答案但是找不到令人满意的答案.既然我知道这是一个相当大的话题,我会尝试更具体.

我想写一个处理文件的程序.处理是非常重要的,所以最好的方法是将不同的阶段分成独立的模块,然后根据需要使用(因为有时我只对模块A的输出感兴趣,有时我需要输出其他五个模块,等等).问题是,我需要模块合作,因为一个模块的输出可能是另一个模块的输入.我需要它快速.此外,我想避免多次执行某些处理(如果模块A创建了一些数据,然后需要由模块B和C处理,我不想运行模块A两次来创建模块B,C的输入) .

模块需要共享的信息主要是二进制数据块和/或处理文件的偏移量.主程序的任务非常简单 - 只需解析参数,运行所需的模块(也许可以给出一些输出,或者这应该是模块的任务?).

我不需要在运行时加载模块.使用带有.h文件的库并且每次有新模块或某个模块更新时重新编译程序都是完美的.模块的概念主要是因为代码可读性,维护和能够让更多的人在不同的模块上工作,而不需要有一些预定义的接口或其他任何东西(另一方面,关于如何编写的一些"指南")可能需要模块,我知道).我们可以假设文件处理是只读操作,原始文件不会更改.

有人能指出我如何在C++中做到这一点吗?任何建议都很好(链接,教程,pdf书籍......).

c++ architecture modular

8
推荐指数
1
解决办法
7576
查看次数

如何发现java反序列化问题?

我希望能够发现java代码中的反序列化问题.我应该寻找什么?例如,如何判断某些java代码是否试图利用" java calendar bug "?请注意,我不是一个java程序员,但我理解序列化和OOP背后的概念.我正在尝试实施一些安全检查(类似于编译器警告工具).

编辑:基于评论我想稍微改变一下这个问题:我认为所有的代码都是"不可信的",有没有办法如何评估潜在的危险?我的意思是,我可以告诉代码A在反序列化错误方面比B更危险吗?我应该寻找什么?

java serialization exploit

7
推荐指数
1
解决办法
2093
查看次数