我有一个函数给出两个整数并返回一个字符串.现在我有这个:
char* myfunc( int a, int b, int* len )
{
int retLen = ...
char* ret = malloc( retLen + 1 );
if ( len != NULL )
{
*len = retLen;
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
但是,C库中的大多数函数都倾向于执行更类似的操作:
int myfunc( char* ret, int a, int b )
{
...
return retLen;
}
Run Code Online (Sandbox Code Playgroud)
然后,您需要为要填充的函数分配内存.这使您可以更多地选择分配字符串的位置.
在这种情况下,尽管函数中需要一些数学来获得长度,并且没有理由拥有除所需大小之外的任何大小的缓冲区.缓冲区的大小没有上限(不管是否合理).
在返回给定输入时动态找到长度的字符串时,什么是良好的做法?
我在程序中定义了许多调试语句,我希望能够在没有这些语句的情况下复制源代码.
为了做到这一点,我首先看了GCC的-E命令行参数,它只运行预处理器,但这比我想要的要多得多,扩展包含的文件并添加#line语句.
例如:
#include <stdio.h>
#ifdef DEBUG
#define debug( s ) puts ( s );
#else
#define debug( s )
#endif
int main( int argc, char* argv[] )
{
debug( "Foo" )
puts( "Hello, World!" );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望将其处理为:
#include <stdio.h>
int main( int argc, char* argv[] )
{
puts( "Hello, World!" );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我可以用astyle这样的东西来整理它,并且不需要手动工作来获得我想要的东西.
GCC是否缺少指令,或者是否有能够执行此操作的工具?
有两种方法可以仅使用整数运算来查找整数平方根.例如这一个.它有趣的阅读和一个非常有趣的理论,特别是对于我这一代,这些技术不再那么有用.
主要的是它不能使用浮点运算,因此排除了牛顿方法及其推导.我知道找到根的另一种方法是二项式扩展,但这也需要浮点运算.
有什么技术/算法可以仅使用整数运算来计算整数n个根?
编辑:感谢目前为止的所有答案.他们似乎都更加智能的试验和改进.有没有更好的方法?
编辑2:好的,所以没有试用/改进和牛顿方法或二进制搜索似乎没有聪明的方法来做到这一点.任何人都可以在理论上提供两者的比较吗?我在两者之间运行了一些基准测试,发现它们非常相似.
很容易看出:
(i % 3 == 0) && (i % 5 == 0)
Run Code Online (Sandbox Code Playgroud)
可以简化为:
(i % 15 == 0)
Run Code Online (Sandbox Code Playgroud)
然而,考虑到GCC的输出,即使在高优化级别下也似乎没有这样做.
是否有任何编译器进行这些优化,或者这两个测试在语义上是否相同是否有充分理由?
编辑:回应那些说这是边缘情况的人,以下是类似的情况:
(i < 3) && (i < 5)
Run Code Online (Sandbox Code Playgroud)
任何小于3的数字必须始终小于5.第二次测试是多余的.
我还想添加以下内容以回应编译器无法知道环境是否受到影响的答案...看看这段代码:
void foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
Run Code Online (Sandbox Code Playgroud)
整个功能由GCC减少为"repz ret" -O2.这比我说的任何事都复杂得多.
我有一组函数可以处理模板化的类,但不依赖于类的模板化部分.
模板化函数并允许它推导出类型会起作用,但会编译成多个函数.
#include <iostream>
template<typename T>
struct MyStruct {
int a;
T b;
};
bool isLess(MyStruct& lhs, MyStruct& rhs) {
return lhs.a < rhs.a;
}
int main(int argc, char const *argv[])
{
MyStruct<int> x {123, 456};
MyStruct<int> y {789, 123};
std::cout << isLess(x, y) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
根据DCPU规范,SET指令失败的唯一时间是a值是文字.
那么下面的工作呢?
SET [PC],0x1000
Run Code Online (Sandbox Code Playgroud)
一个更有用的版本是设置偏移量PC,所以一个相当奇怪的无限循环将是:
SET [PC+0x2],0x89C3 ; = SUB PC,0x2
Run Code Online (Sandbox Code Playgroud) 在测试时NULL,我看到了很多使用的代码!var.有没有理由使用这种测试而不是更明确的测试var == NULL.if (var)对于非空项目,同样也是一个正确的测试?
属性我指的是C#样式属性,带有getter和setter.
我很想知道他们为什么不是C++语言的一部分.我假设在编写规范时必须讨论这样的特性,因此认真考虑不将其包含在语言中.
如果我有一个上下文菜单,是否可以将其加入另一个菜单?所以你得到:
Menu 1 Item 1
Menu 1 Item 2
Menu 1 Item N
---------
Menu 2 Item 1
Menu 2 Item 2
Menu 2 Item N
Run Code Online (Sandbox Code Playgroud)
我们来看一个类似记事本的程序.菜单中有重复,因为在编辑菜单和编辑控件上下文菜单(剪切,复制,粘贴,全选...)中都会出现一组标准工具.
我想要一个名为的菜单ClipboardTools,它将出现在编辑和控制上下文菜单中,而不需要多次创建项目.当然在这种情况下重复并不是那么糟糕,但我必须处理出现在3-4个不同菜单中的较大菜单,理想情况下不是子菜单.
我的编译器不允许使用以下定义,因为它std::string有一个非平凡的析构函数(teststr理所当然,当成员没有时,它不能有一个简单的dtor):
class teststr
{
private:
std::string _m;
public:
constexpr teststr(std::string value) : _m(value) {};
constexpr std::string m() const { return _m; }
void m(std::string value) { _m = value; }
};
Run Code Online (Sandbox Code Playgroud)
但是,teststr允许以下等效(据我所知)定义:
template<typename T>
class test
{
private:
T _m;
public:
constexpr test(T value) : _m(value) {};
constexpr T m() const { return _m; }
void m(T value) { _m = value; }
};
typedef test<std::string> teststr;
Run Code Online (Sandbox Code Playgroud)
模板允许这个定义的类型是什么?
c ×4
c++ ×3
gcc ×2
templates ×2
algorithm ×1
c# ×1
c++11 ×1
contextmenu ×1
dcpu-16 ×1
integer ×1
math ×1
oop ×1
optimization ×1
pointers ×1
properties ×1
square-root ×1
string ×1
winforms ×1