我有一组位标志,用于我从C到C++移植的程序.
开始...
我程序中的标志以前定义为:
/* Define feature flags for this DCD file */
#define DCD_IS_CHARMM 0x01
#define DCD_HAS_4DIMS 0x02
#define DCD_HAS_EXTRA_BLOCK 0x04
Run Code Online (Sandbox Code Playgroud)
...现在我已经收集了常量的#defines(与类常量等相比)通常被认为是不好的形式.
这引发了关于如何最好地在c ++中存储位标志以及为什么c ++不支持将二进制文本分配给int的问题,就像它允许以这种方式分配十六进制数字(通过"0x").这篇问题总结在本文末尾.
我可以看到一个简单的解决方案是简单地创建单个常量:
namespace DCD {
const unsigned int IS_CHARMM = 1;
const unsigned int HAS_4DIMS = 2;
const unsigned int HAS_EXTRA_BLOCK = 4;
};
Run Code Online (Sandbox Code Playgroud)
我们称这个想法为1.
我的另一个想法是使用整数枚举:
namespace DCD {
enum e_Feature_Flags {
IS_CHARMM = 1,
HAS_4DIMS = 2,
HAS_EXTRA_BLOCK = 8
};
};
Run Code Online (Sandbox Code Playgroud)
但令我困扰的一件事是,当涉及更高的价值时,它似乎不那么直观......似乎......
namespace DCD {
enum e_Feature_Flags {
IS_CHARMM = 1,
HAS_4DIMS = 2, …Run Code Online (Sandbox Code Playgroud) 编辑:
目标: 通过从公共变量的功率计算中重新使用预先计算/缓存的功率,
生成一种无处不在的方法,以获得优于内置功能的自定义功率函数pow(double, uint).
已经做了什么:
我已经得到了这样一个比内置快大约40%的函数,但是这是一个强力的手动派生函数 - 我想要一种自动生成这样的电源功能块的方法任意uint权力.
的已知,
要获得最佳定制,pow(double, uint)您需要一些知识.对于这个问题,知识(澄清)是:
N_MAX).r2中r4,和r6).r2无论其他预先计算的功率如何,都可以假设方形总是被计算出来.解决方案要求
需要单独的程序来编写case查找表或预处理器逻辑以生成这样的表的最佳解决方案是可接受的,然而,不会接受使用手动生成的(即强力导出的)查找表的非最佳解决方案. (正如我已经那样,并且在我的例子中表明......想法是远离这个).
可能的解决途径
作为一个建议,你知道N_MAX和一组预先计算的权力B(B={2,4,6}对于我的例子).你可以在一个单独的程序中或在预处理器中生成一个所有正方形的表格Sq(Bi, x<= N_MAX . You can use this to form a basis setA , which you then search somehow to determine the least number of terms that can be summed to produce an arbitrary …
我最近写了一篇文章:
C++程序中的奇怪错误:删除打印输出中断程序
...我试图解决一个看似令人困惑的问题,其中删除一个cout语句会破坏我的程序.
事实证明,我的问题是我忘了返回我后来用于逻辑的真/假成功标志.
但显然SOMETHING正在被归还,如果我把那个cout留在那里,事情总是如此,但是当我把它拿出来时,看起来似乎"神奇地"变得虚假.
我的问题是:
当函数中没有执行返回命令时,什么决定了c ++函数返回什么?它有什么逻辑吗?
显然忘记你的回归类型是个坏主意.在这种情况下,这主要是由于我的程序的性质 - 一个快速的黑客工作.我后来决定,实现一个算法来确定函数调用的成功/失败是不值得的 - 但是意外地遗留了依赖于返回的代码.
令人困惑的是,在编译可执行文件时,g ++没有给出任何警告或错误:
g++ main.cc -g -o it_util
Run Code Online (Sandbox Code Playgroud)
我的版本是:g ++(GCC)4.1.2 20080704(Red Hat 4.1.2-44)
再一次,为了拯救他人未来的挫败感,如果他们犯了同样的愚蠢错误,并且遇到了同样看似不稳定的行为,那么任何人都可以指望没有返回的函数从哪里得到它的返回值?
谢谢!!
我已经掌握了Bash复合条件的基础知识,并且已经阅读了几种不同的方法来检查文件是否存在通配符文件,但是这个方法让我望而却步,所以我想我会请求帮助......
我需要:1)检查一些文件匹配模式的存在和2)检查文本在不同的文件存在.
我知道有很多方法可以做到这一点,但我并没有真正的知识来优先考虑它们(如果你有这方面的知识,我也有兴趣阅读它).
首先想到的是使用#1的#和#2的grep
所以像
if [ `grep -q "OUTPUT FILE AT STEP 1000" ../log/minimize.log` ] \
&& [ `find -name "jobscript_minim\*cmd\*o\*"` ]; then
echo "Both passed! (1)"
fi
Run Code Online (Sandbox Code Playgroud)
虽然好奇但是失败了:
if `grep -q "OUTPUT FILE AT STEP 1000" ../log/minimize.log` ;then
echo "Text passed!"
fi
if `find -name "jobscript_minim\*cmd\*o\*"` ;then
echo "File passed!"
fi
Run Code Online (Sandbox Code Playgroud)
都通过......
我已经做了一些阅读,并且看到人们在if语句中讨论了匹配通配符的多个文件名的问题.什么是最好的解决方案?(在回答我的问题时,我假设你在这个过程中对这个问题采取了一个解决方案)
任何想法/解决方案/建议?
我想将字符文字与字符串的第一个元素进行比较,以检查文件中的注释.为什么要用炭?我想把它变成一个函数,它接受注释的字符var.我不想允许字符串,因为我想将其限制为单个字符的长度.
考虑到这一点,我认为简单的方法是解决字符并将其传递给std :: string的比较函数.然而,这给了我意想不到的结果.
我的代码如下:
#include <string>
#include <iostream>
int main ( int argc, char *argv[] )
{
std::string my_string = "bob";
char my_char1 = 'a';
char my_char2 = 'b';
std::cout << "STRING : " << my_string.substr(0,1) << std::endl
<< "CHAR : " << my_char1 << std::endl;
if (my_string.substr(0,1).compare(&my_char1)==0)
std::cout << "WOW!" << std::endl;
else
std::cout << "NOPE..." << std::endl;
std::cout << "STRING : " << my_string.substr(0,1) << std::endl
<< "CHAR : " << my_char2 << std::endl;
if (my_string.substr(0,1).compare(&my_char2)==0)
std::cout …Run Code Online (Sandbox Code Playgroud) 我理解拥有静态成员函数的一个好处是不必初始化类来使用它们.在我看来,他们的另一个好处可能是没有直接访问类的非静态内容.
例如,一个常见的做法是,如果您知道函数将具有不可更改的参数,则只需标记这些常量.例如:
bool My_Class::do_stuff(const int not_to_be_changed_1,
std::vector<int> const * const not_to_be_changed_2)
{
//I can't change my int var, my vector pointer, or the ints inside it.
}
Run Code Online (Sandbox Code Playgroud)
因此,使用静态成员函数来限制访问是有效的.例如,假设您有一个功能
void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
那么在这里我们不会访问该类的任何成员变量.所以,如果我将功能更改为:
static void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在得到一个错误,如果我无意中试图访问我的一个私有var等等(除非我自己传递一个我的类的实例,这将是有目的的^ _ …
我正在研究一组相对较大的串行代码C代码库,然后由我的协作者在CUDA中进行并行化.
对于这个项目,我的代码基本归结为
#include "Initialize.cpp"
#include "PerformMoves.cpp"
#include "CollectResults.cpp"
main()
{
//DECLARE General Vars
Initialize();
for (unsigned int step=0; step < maxStep; step++)
{
PerformMoves();
}
CollectResults();
}
Run Code Online (Sandbox Code Playgroud)
现在我在Initialize和PerformMoves中执行的步骤将根据我正在构建的模拟类型而有很大不同.速度是最高性能,因为我的代码是蒙特卡罗模拟,将执行数百万次移动,每次移动涉及可能数千次计算.因此,我想避免任何不必要的条件.
因此,我基本上想要不同的"即插即用"C模块,例如
InitializeSimType1.cpp InitializeSimType2.cpp InitializeSimType3.cpp
PerformMovesType1.cpp PerformMovesType2.cpp PerformMovesType3.cpp
....
每个优化用于某种类型的模拟程序,没有大条件的"绒毛"来处理各种情况.
目前我有两种不同类型的模拟,只需将它们放在两个不同的文件夹中,编译如下:
g ++ Main.cc Initialize.cpp PerformMoves.cpp CollectResults.cpp -o MC_Prog
我想转向某种条件编译方案,其中我有一些排序配置文件,我指定选项,它抓取正确的cpp文件并编译它们.
我认为makefile +配置文件是我最好的选择,但除了基本目标和非常线性的编译之外,我对复杂makefile的世界都很新手.
有什么好方法可以创建一个列表驱动的编译系统,这将允许具有非常基本的C知识的用户轻松地使用他们想要的模块构建目标.我的最终用户不会拥有大量的makefile知识(或者一般的编程知识),因此最终的复杂系统是不可能的.我希望他们基本上有一个透明的配置文件驱动系统,允许他们选择一个Initialize模块,一个PerformMoves模块和一个CollectResults模块.一旦他们用他们的选择修改了这个配置文件,我希望他们能够进行单命令编译.
换句话说,我希望能够创建一个指导用户的自述文件:
我知道这是一个相当抽象和复杂的问题,但我知道有一些Makefile/c专家可以为我提供一些很好的指导.
只是为了澄清这不是一个功课问题,因为我已经看到类似的指责与其他一些有点hackish的问题:
也就是说,我在C中有这样的攻击:
#include <stdio.h>
const int __FLOAT_WORD_ORDER = 0;
const int __LITTLE_END = 0;
// Finds log-base 2 of 32-bit integer
int log2hack(int v)
{
union { unsigned int u[2]; double d; } t; // temp
t.u[0]=0;
t.u[1]=0;
t.d=0.0;
t.u[__FLOAT_WORD_ORDER==__LITTLE_END] = 0x43300000;
t.u[__FLOAT_WORD_ORDER!=__LITTLE_END] = v;
t.d -= 4503599627370496.0;
return (t.u[__FLOAT_WORD_ORDER==__LITTLE_END] >> 20) - 0x3FF;
}
int main ()
{
int i = 25; //Log2n(25) = 4
int j = 33; //Log2n(33) = 5
printf("Log2n(25)=%i!\n",
log2hack(25));
printf("Log2n(33)=%i!\n",
log2hack(33));
return 0;
} …Run Code Online (Sandbox Code Playgroud) 我有一个性能敏感的CUDA代码,我正在使用它
#ifdef DEBUG_<NAME_OF_SECTION>
...
#else
...
#endif
Run Code Online (Sandbox Code Playgroud)
...封装速度瘫痪的调试代码的条件,它从GPU中获取额外的信息.
在emacs(Centos 6.0)中一切顺利,直到#else.
这个deceldents(由1个选项卡)预处理器的else子句中的文本是有条件的,并且继续在之后删除所有内容.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意:
)预处理器条件中的复制似乎是由C模式正确处理的.但);重复打破了事情,迫使你把);条件移到外面......哦,亲爱的,多么不一致.在我们获得正确的elisp代码来修复这种不一致之前,我一直保持这个问题.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
关于当前答案的注释:
Jens提供了不准确的信息,声称嵌套的)内部条件是"不可能的".这不仅是可能的,而是Emacs的C-Mode积极做到这一点.请注意本问题末尾的示例c程序的正确缩进,以证明这一点.因此,理所当然的);是,缩进也是可行的,尽管由于Jens概述的原因应该谨慎行事.
无论如何,我想确保人们看到该陈述是不正确的,所以他们不认为这个问题是无法回答的.当他修改他的不准确的陈述以反映它是可能的时,我将删除这个评论和我对Jens的帖子的下注,以C模式实现)他的大纲,但不推荐.
目前我正在手动向前移动一个选项卡,但它浪费了很多时间(代码很长).
知道我可以添加到我的〜/ .emacs文件来修复这个???
提前致谢!
编辑1 我应该提到它似乎窒息的条款是一个函数结束,例如
MyFunc<<<Blk,Thr>>>(Stuff1,
#ifdef DEBUG_FUNC1
Stuff2,
dev_Debug);
#else
Stuff2); //Deindents here.
#endif
//Everything here on out is deindented.
Run Code Online (Sandbox Code Playgroud)
这种代码结构可能是特定的失败......
编辑2
这是一个简单的C代码版本...代码按预期工作,但不是最后一个#else条款的deindent ...
#include <stdio.h>
//#define DEBUG
void printer
(int A,
#ifdef DEBUG
int B,
int C)
#else
int B) …Run Code Online (Sandbox Code Playgroud) 目前在我的科学计算代码中,我有以下内容:
//Include M_PI constant
#define _USE_MATH_DEFINES
//Needed for square root function.
#include <math.h>
Run Code Online (Sandbox Code Playgroud)
这工作......至少在Linux上...我没有在所有平台上为C编译器测试它.但是,在调查一些较旧的Fortran代码时,我最近遇到了这种看似聪明的方法,即在另一个代码中定义pi(不是我自己的代码):
<angle in deg.>*8.0d0 * datan(1.0d0) / 360.0d0
Run Code Online (Sandbox Code Playgroud)
当然这在C中完全可行,对吧?所以我可以定义我的转换函数:
inline double DegToRad(const double A)
{
return A * atan(1.0) / 45.0;
}
Run Code Online (Sandbox Code Playgroud)
哪种方法更便携?是否有任何数字(例如舍入)考虑因素值得使用一种方法而不是另一种方法?
我确实认为M_PI常量使代码更具可读性.当然,我可以愉快地使用上述方法分配我自己的PI常量.
什么被认为是针对多个平台(Windows,Linux等)的C/C++代码的最佳实践?
c++ ×5
c ×3
math ×3
optimization ×2
angle ×1
bash ×1
binary ×1
char ×1
class ×1
compilation ×1
conditional ×1
constants ×1
editor ×1
elisp ×1
emacs ×1
file ×1
flags ×1
function ×1
grep ×1
inline ×1
java ×1
literals ×1
makefile ×1
memory ×1
modularity ×1
portability ×1
pow ×1
project ×1
return ×1
return-value ×1
scope ×1
shell ×1
static ×1
string ×1
types ×1