小编Căt*_*rbu的帖子

为什么我不需要 3 级大括号来初始化 3 级数组?

我遇到了这个例子

struct sct
{
    int t[2];
};

struct str
{
    sct t[2];
};

int main()
{
    str t[2] = { {0, 2, 4, 6}, {1, 3, 5, 7} }; //Who does this work?

    cout << t[1].t[0].t[1] << t[0].t[1].t[0];     

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这编译并运行良好。它给出了输出34

我预计初始化的语法是:

str t[2] = {  { {0, 2},{4, 6} }, { {1, 3},{5, 7} }   };
Run Code Online (Sandbox Code Playgroud)

代替

 { {0, 2, 4, 6}, {1, 3, 5, 7} };
Run Code Online (Sandbox Code Playgroud)

但这给了:

In function 'int main()':
error: too many initializers for …
Run Code Online (Sandbox Code Playgroud)

c++ struct nested uniform-initialization

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

C 调用约定:谁在可变参数函数与普通函数中清理堆栈?

有一些调用约定(例如pascalstdcall),但就我而言,C 确实使用cdecl(C 声明)。这些约定中的每一个在调用者将参数加载到堆栈上的方式上都略有不同,分别是由哪个(调用者/被调用者)进行清理

谈到清理,这是我的问题。我不明白:有三种不同的东西吗?

  1. 堆栈清洁
  2. 将指针移回倒数第二个堆栈帧
  3. 堆栈恢复

或者我应该怎么看他们?

此外,这个问题的目标基本上是可变参数函数如何在像 Pascal 这样的调用约定中工作,或者stdcall被调用者应该在哪里清除/清理/恢复(我不知道哪个操作)堆栈 - 但他不知道有多少参数它会收到。

编辑

为什么将参数压入堆栈的顺序如此重要?您仍然拥有第一个参数(不是来自省略号的稳定参数),它为您提供有关 - 例如 - 变量参数数量的信息。并且还有“监护人”,它可以添加到省略号标点符号中,并且可以用作独立于调用约定的变量部分结束的标记。在这个链接中,如果调用者和被调用者在搞乱它们之前都保存了它们的状态,那么为什么调用者和被调用者都应该恢复这些寄存器的值?不应该只有其中一个(例如调用者)在调用函数之前将它们保存在堆栈中,仅此而已?另外,在同一个链接上

“因此,堆栈指针 ESP 可能会上下移动,但 EBP 寄存器保持固定。这很方便,因为这意味着我们始终可以将第一个参数称为 [EBP + 8],而不管在功能。”

推送的变量和局部变量在内存中是连续的。使用 EBP 推荐他们的优势在哪里?即使堆栈大小发生变化,它们之间也永远不会有一些动态偏移。

我读过的材料之一是这个站点(只是开始),以便更好地了解堆栈帧到底是什么。然后我继续 yt 并找到了这些堆栈概述调用堆栈教程,但他们不知何故错过了我需要的部分。当你调用函数时到底发生了什么(我不明白指令“调用地址”后跟下一个指令a push值到堆栈上,这意味着返回值)。谁来控制退货地址?呼叫者,召集者?被叫方?当被调用者返回时,程序继续执行一条指令,该指令是从寄存器中读取操作或什么?

c x86 cdecl variadic-functions calling-convention

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

应用程序的返回码是一个 int16_t?

在谈论启动新流程时,您可以使用int system(char* command). 如果传递非 NULL参数,则可以获得:

  • -1 如果子进程无法启动;
  • 否则子进程的返回码;

注意:在 Unix/Linux 中,返回码位于结果的高八位,而低八位包含终止原因码>{1}<,因此等于 1 的 retcode 将返回为 256;您可以通过将值右移八位来获得实际的返回码;还有一个名为 WEXITSTATUS() 的宏可以为您执行此操作。

搜索执行WEXITSTATUS()这是一个转变的8位到右侧。

#define WEXITSTATUS(x) (_W_INT(x) >> 8)

这就是为什么我倾向于认为返回码是 2 个字节的原因(也来自 >{1}<)。引用来自在线找到的 C 课程。

Ps 我想知道返回码和终止原因码之间的区别,它们不一样吗?

c c++ operating-system

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

Shift + Enter 与在控制台中输入

我正在尝试捕获通过stdin流输入的所有字符(EOF 除外)。我想输入一个多行文本:每行\n末尾。

int getline(char s[])
{
    printf("Call-getline()\n");

    int c;
    int idx=0;

    while((c=getchar()) != EOF)
    {
        s[idx++] = c;
    }

    printf("\n-EOF found--\n");

    s[idx] = '\0';

    return idx;
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何摆脱\n按 Enter 时得到的那个,我想知道shif+entervs 是否enter alone有什么不同。我阅读了它在 Microsoft Word 中的作用:新段落与换行符。

c enter shift

5
推荐指数
1
解决办法
942
查看次数

省略函数原型中的返回类型

来自 C++ 学院文档(在线课程):

return_type 描述了函数返回(传递)的结果类型(例如,我们期望正弦函数将返回一个 float 类型的值,因为 int 数据在这种情况下完全不可用);您可以使用任何 C++ 类型作为 return_type,包括一个名为 void 的非常特殊的类型;void 类型的函数根本不返回任何结果;可以说,这样的函数可能有效果,但肯定没有结果;如果省略 return_type,则编译器假定该函数返回 int 类型的值

关于这个例子 return_type function_name (parameters_list);


在这个例子中:

my_function(int x) {
    return 4;
}

int main()
{
...
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误: ISO C++ forbids declaration of 'my_function' with no type [-fpermissive]|


在这个例子中:

my_function(int);    //Prototype


int main()
{
...
}

int my_function(int x)
{
    return 4;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:expected constructor, destructor, or type conversion before ';' token


我没有在C++11 标准第 192 页找到-function declaration与我想知道的有关的东西(或者可能只是我不明白的事实)。 …

c++ function function-prototypes

4
推荐指数
1
解决办法
370
查看次数

为什么使用不匹配的参数调用重载函数仍然有效

我无法解释为什么第二个调用 ( B) 没有给出任何错误,因为有两个char元素,并且此调用没有确定的匹配项。

为什么它被称为第二个 ( 2.),而不是第一个 ( 1.) 版本?

我注意到有一些自动转换。我不明白的是为什么'a'被提升为 int 而'c'不是。

// 1.
int fun(int a, int b)
{
    return a + b;
}

// 2.
int fun(int a, char b)
{
    return b - a;
}

// 3 
int fun(float a, float b)
{
    return a * b;
}

int main() {

    //      A.          B.              C.
    cout << fun(1,0) << fun('a','c') << fun(2.f,2.f);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ overloading function

4
推荐指数
1
解决办法
108
查看次数

为什么有符号字符可以容纳比 127 更大的值?

int main()
{
    char MCU = 0b00000000;
    char al_av = 0b10100000;

    // Before bit operation
    cout << "MCU = " << int(MCU) << endl;

    MCU = MCU | al_av;

    // After the bit operation
    cout << "MCU = " << int(MCU) << endl;   // Expected 160, got -96

    char temp = 160;

    cout << temp;   // got the a with apostrophe

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我预计 的输出为char temp负数(或警告/错误),因为 160 超过了 [-127,127] 间隔,但结果是 ASCII 表中的那个(带有撇号的

关于cpp 参考 …

c++ char

4
推荐指数
1
解决办法
532
查看次数

为什么/何时 cout 缓冲区自动刷新?

我从这里了解到,如果我要输出字符而不刷新缓冲区(使用endlcin),则在程序结束之前它们不会出现在我的控制台上。

所以我尝试做一个无限循环:

for(;;)
{
    std::cout << "a" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

和不刷新缓冲区相同:

for(;;)
{
    std::cout << "a";
}
Run Code Online (Sandbox Code Playgroud)

它们都永远输出a,我可以观察到的唯一区别是后一个版本的代码在开始输出字母之前有一些延迟时间。第一个立即开始。

我期望第二个仅当break循环中有 a 时才输出字符,并且程序将被终止。

c++ buffer cout

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

在开始时调用带有 va_list 参数的函数需要 va_start() 吗?

具有以下标头的函数:

int max(int n, va_list vals)
Run Code Online (Sandbox Code Playgroud)

在函数内部调用:

int max_first(int n, ...)
Run Code Online (Sandbox Code Playgroud)

需要va_start(vals, n)在身体开始时调用吗?我试过没有,它有效,但我不明白哪种是正确的做法。

int max(int n, va_list vals)
{
    va_start(vals, n);
    // etc
}
Run Code Online (Sandbox Code Playgroud)

c c99 variadic-functions

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

使用 Python 将 Excel 转换为 JSON

我有一个excel文件,我想把它转换成一个JSON文件。所以excel是这样的:

-------------------------
| Col A | Col C | Col F |
--------+-------+--------
|   1   |   A   |   EE  |
|   2   |   B   |   FF  |
|   4   |   C   |   FF  |
|   5   |   D   |   HH  |
|   6   |   D   |   HH  |
|   7   |   A   |   EE  |
|   8   |   E   |   EE  |
--------------------------
Run Code Online (Sandbox Code Playgroud)

我希望JSON遵循以下格式:

{
"EE": {
    "A": {
      "Col A key": "1",
      "Col A key": …
Run Code Online (Sandbox Code Playgroud)

python excel json python-3.x

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