小编mel*_*ene的帖子

递归和静态变量

所以当我遇到这段C代码时,我正准备在印度参加入学考试

#include <stdio.h>
int main(void) {
    static int i = 4;
    if (--i) {
        main();
        printf("%d", i);
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为printf语句永远不会被执行,输出将是空白的.但我看到答案是0000,并且这是由于static关键字与int.

谁能解释为什么printf执行或者那个人错了?

c recursion

14
推荐指数
5
解决办法
3644
查看次数

为什么虚拟析构函数需要删除运算符

在使用g ++的独立上下文(没有标准库,例如在操作系统开发中)中,会出现以下现象:

class Base {
public:
   virtual ~Base() {}
};

class Derived : public Base {
public:
    ~Derived() {}
};

int main() {
    Derived d;
}
Run Code Online (Sandbox Code Playgroud)

链接时,它表示如下: undefined reference to operator delete(void*)

这显然意味着即使动态内存分配为零,g ++也会生成删除运算符的调用.如果析构函数不是虚拟的,则不会发生这种情况.

我怀疑这与课堂生成的vtable有关,但我不完全确定.为什么会这样?

如果由于缺少动态内存分配例程而不能声明删除操作符,是否有解决方法?

EDIT1:

为了成功地重现g ++ 5.1中的问题,我使用了:

g ++ -ffreestanding -nostdlib foo.cpp

c++ delete-operator virtual-destructor

13
推荐指数
1
解决办法
1473
查看次数

枚举超过最大数字类型的大小

我想完全理解C++编译器如何处理超过最大可能数的枚举,即包含-1UINT64_MAX同时,即

enum A {
    X = -1,
    Y = UINT64_MAX
};
Run Code Online (Sandbox Code Playgroud)

首先,我认为编译器不接受此代码.实际上它enum被替换时不编译enum class,但上面的例子编译.根据我们对底层类型的标准:

声明一个未固定的枚举类型,其基础类型不固定(在这种情况下,基础类型是一个实现定义的整数类型,可以表示所有枚举器值;此类型不大于int,除非枚举器的值不能适合int或unsigned int.如果enumerator-list为空,则基础类型就好像枚举具有值为0的单个枚举器一样.(https://en.cppreference.com/w/cpp/language/enum)

但这对我的例子意味着什么呢?

我写了一个小样本程序来找出会发生什么:

#include <iostream>
#include <cstdint>

enum A {
    X = -1,
    XX = -1,
    Y = UINT64_MAX
};

int main()
{

    std::cout << "X unsigned: " << (uint64_t)(X) << ", signed: " << (int64_t)(X) << std::endl;
    std::cout << "Y unsigned: " << (uint64_t)(Y) << ", signed: " << (int64_t)(Y) << std::endl;

    std::cout << "(X …
Run Code Online (Sandbox Code Playgroud)

c++ enums

12
推荐指数
1
解决办法
192
查看次数

如何将截获的密钥传递给autohotkey中的应用程序

我一直在激活Firefox然后按Ctrl+ L来聚焦位置栏并进行搜索或输入URL.

理想情况下,我可以在任何应用程序中点击Ctrl+ L和Firefox将激活,位置栏集中并准备输入.在步骤AutoHotkey脚本.

我试过这个,似乎没有用.从我所读到的,代字号是"传递":

^l::
IfWinExist ahk_class MozillaUIWindowClass
{
    WinActivate
    Send ~^l
}
Run Code Online (Sandbox Code Playgroud)

autohotkey keyboard-shortcuts ctrl

11
推荐指数
1
解决办法
3264
查看次数

字符集 - 不清楚

标准定义

  • 基本源字符集

  • 基本执行字符集及其广泛的char对应物

它还定义了"执行字符集"及其宽字符对应项,如下所示

$ 2.2/3-"执行字符集和执行宽字符集分别是基本执行字符集和基本执行宽字符集的超集.执行字符集成员的值是实现定义的,并且任何其他成员都是特定于语言环境的."

Q1.我不认为我完全理解这一点,特别是最后的陈述.有关这方面的任何指示?

进一步,

$ 3.9.1 - "声明为字符(char)的对象应足够大,以存储实现的基本字符集的任何成员."

Q2.在3.9.1中,短语"基本字符集"表示"基本执行字符集"?

c++ character-encoding

10
推荐指数
1
解决办法
3698
查看次数

我如何使用PID控制器?

我目前正在研究温度控制器.

我有一个Temperature_PID()函数返回操纵变量(它是P,I和D项的总和),但我该如何处理这个输出?

温度由PWM控制,因此0%占空比=加热器关闭和100%占空比=加热器开启.

到目前为止我试过了

Duty_Cycle += Temperature_PID();
if(Duty_Cycle > 100) Duty_Cycle = 100;
else if(Duty_Cycle < 0) Duty_Cycle = 0;
Run Code Online (Sandbox Code Playgroud)

这对我不起作用,因为I术语基本上使得这个系统非常不稳定.想象一下,整合一个区域,添加另一个小数据点,再次整合该区域,并对它们求和.一遍又一遍.这意味着每个数据点使得该控制方案呈指数级恶化.

我想尝试的另一件事是

Duty_Cycle = Expected_Duty_Cycle + Temperature_PID();
Run Code Online (Sandbox Code Playgroud)

其中Expected_Duty_Cycle是控制器达到稳定点并且Temperature_PID()为0时应设置的温度.但是,这也不起作用,因为Expected_Duty_Cycle将始终根据加热器的条件而变化,例如不同的天气.

所以我的问题是我究竟如何处理PID的输出?我不明白如何根据PID输出分配占空比.理想情况下,这将保持100%的占空比,直到温度几乎达到设定点并开始下降到较低的占空比.但是使用我的第一种方法(我的增益设置为零)它只会在已经超调之后开始降低占空比.

这是我的第一篇文章.希望我找到答案.谢谢stackoverflow.

编辑:这是我的PID功能.

double TempCtrl_PID(PID_Data *pid)
{
    Thermo_Data tc;
    double error, pTerm, iTerm, dTerm;

    Thermo_Read(CHIP_TC1, &tc);

    pid->last_pv = pid->pv;
    pid->pv = Thermo_Temperature(&tc);
    error = pid->sp - pid->pv;
    if(error/pid->sp < 0.1)
        pid->err_sum += error;

    pTerm = pid->kp * error;
    iTerm = pid->ki * pid->err_sum;
    dTerm = pid->kd * (pid->last_pv - pid->pv);

    return pTerm …
Run Code Online (Sandbox Code Playgroud)

c pid-controller

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

从命令行覆盖宏

我想从命令行覆盖一个宏.在我的源代码中,有一个这样的定义:

#define MY_FOO 1
Run Code Online (Sandbox Code Playgroud)

我想要的是在编译程序时设置此宏的值:

g++ -DMY_FOO=2 ...
Run Code Online (Sandbox Code Playgroud)

但是,宏源被源代码重新定义为旧值1.问题是我不拥有首先定义宏的源代码部分.如果它是我自己的代码,我可以简单地写

#ifndef MY_FOO
#define MY_FOO 1
#endif
Run Code Online (Sandbox Code Playgroud)

我的问题就不复存在了.那么是否可以使用g ++在命令行上指定一个宏,以便源代码无法重新定义它?

c++ macros g++ c-preprocessor

10
推荐指数
1
解决办法
3510
查看次数

linux 函数 openat 与 open,“at”是什么意思?

我知道如何使用这两个函数,但我不知道后缀“at”是什么意思。它代表“another”的缩写吗?

c linux

10
推荐指数
1
解决办法
4542
查看次数

插入到栈尾

static void insert_at_bottom(char x){

    if(st.isEmpty())
        st.push(x);

    else{
        /* All items are held in Function Call Stack until we
           reach end of the stack. When the stack becomes
           empty, the st.size() becomes 0, the
           above if part is executed and the item is inserted
           at the bottom */

        char a = st.peek();
        st.pop();
        insert_at_bottom(x);

        //push all the items held in Function Call Stack
        //once the item is inserted at the bottom
        st.push(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我对这一步有一个疑问:

if(st.isEmpty())
        st.push(x);
Run Code Online (Sandbox Code Playgroud)

之后我们不需要 return 语句吗st.push(x) …

java recursion return

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

Haskell无可辩驳的模式匹配

为了开始进入Haskell的道路,我选择了其中一位创作者Hudak的书.所以,我正在经历对Haskell的温和介绍.

我一直试图理解以下陈述:

从技术上讲,形式参数也是模式,但它们永远不会与值相匹配.

从我对C语言(或者简称为非函数语言)的较小但相对较大的适应性,我可以形成形式参数是函数定义中的参数.所以,假设在C中有如下函数:

int func_add(int a, int d) 
Run Code Online (Sandbox Code Playgroud)

然后传递一些像字符串这样的其他类型的值将是模式匹配失败,如果我是正确的.所以呼吁func_add作为func_add("trs", 5)是模式不匹配的情况.

如果一段代码通过传递不同类型的参数来调用函数,那么在Haskell中很可能会出现错误理解或解释的可能性.

那么,为什么说在Haskell形式参数是无可辩驳的模式匹配?

haskell functional-programming pattern-matching

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