【问题标题】:How do you increment a variable name in for loop in C? [closed]如何在 C 中的 for 循环中增加变量名? [关闭]
【发布时间】:2015-07-31 01:41:18
【问题描述】:

如何在 C 的循环中增加变量名?例如,我有一个变量 K1,我想在每次循环到 K2、K3、K4 等时将名称加一。我不能使用数组,因为我有大约 1000 个变量要循环。

更新:我应该澄清一下我正在对微控制器进行编程,并且板上的空间非常有限。我希望循环的变量名称是结构,每个 8 字节长。因此,要创建一个包含我之前创建的结构的数组,我必须写出一个包含 1000 个数组名称的数组吗?当然有一种方法可以增加名称吗? 稍后我会发布我的代码。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

typedef struct reg0 {
    int address;
    union {
        struct {
            unsigned int bitfield1 : 1;
            unsigned int bitfield2 : 4;
            unsigned int bitfield3 : 2;
            unsigned int bitfield4 : 1;
        };
        uint8 DATA;
    };
} Reg0;

//Beneath this I have 1000 similar Register structures, each unique


int main()
{
    //Beneath this I have 1000 similar initializations, each unique
    Reg0 R0 = {.address = 0x0,      {{.bitfield1=0x1,.bitfield1=0x6,.bitfield3=0x2,.bitfield4=0x1}}};

for(i=0;i<=1000;i++){
    //Here I'd like to print each address field of each structure to the screen
    printf("Address of Reg%d is: %?", i, Ri);
}

return 0;

}

【问题讨论】:

  • 我不明白为什么你不能使用数组...... 1000 项并不多。您可以轻松处理数百万美元。
  • 我不能使用数组,因为我有大约 1000 个变量要循环。 我会说你 不能 使用变量作为 您将有 1000 个变量要循环遍历 .... 在 C 中,您不能在运行时动态创建变量并更改它们的名称。这就是数组的用途
  • 如果你有 1000 个变量叫做 K1...K999,在学习数组之前不要再修改你的代码。

标签: c loops for-loop


【解决方案1】:

通常情况下,你不能。

程序被编译成二进制,不存在变量名。因此,您无法在运行时更改它

但是,使用 MACRO 您可以以某种方式实现这一点,但是,这既不是运行时也不是一个好的方法,至少是可移植和跨平台支持的。

TL;DR 答案 :: 使用数组。这就是数组的意义所在。


编辑:

您可以使用结构数组并使用索引来访问数组中的各个元素。这应该符合您的目的。

【讨论】:

  • 实际上,你不能用 C 宏来做到这一点。奇怪的是,C 预处理器可以进行数学运算(用于测试),但不能使用数学生成名称。它也不能循环,除非通过递归包含,这可能会破坏它。
  • @Yann 您可以使用某些编译器提供的特殊内置计数器宏。
  • 那么你就超出了 C 标准的范围(例如,使用 GNU C 扩展,这里称为__COUNTER__)。不过感谢您的提示。
【解决方案2】:

首先,你不知道。 C 不对名称进行运行时操作;事实上,这些名称本身在那时可能并不存在。其次,是什么让你无法使用数组?它们不仅没有包含数千个条目的问题,而且它们是处理此类事情的明智方式(可能可以使用其他结构,如链表)。

【讨论】:

    【解决方案3】:

    你不能通过变量名来做到这一点;名称适用于人类,在运行时不再存在。

    对其建模的正确方法是使用数组。所以替换这个:

    int K1, K2, K3, K4, ... K1000;
    

    与:

    int K[1000];
    

    然后使用循环索引访问数组:

    for(size_t i = 0; i < sizeof K / sizeof *K; ++i)
      K[i]++;
    

    如果您真的无法将变量展平为数组,则可以添加间接并拥有一个指针数组,但初始化会很糟糕:

    int K1, K2, K3, ... K1000;
    int *K[1000] = { &K1, &K2, &K3, ..., &K1000 };
    

    然后你可以再次使用循环:

    for(size_t i = 0; i < sizeof K / sizeof *K; ++i)
      (*K[i])++;
    

    注意:上面的 ... 只是答案中的符号,这不是 C 语法。你应该在那里输入更多的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 2015-04-15
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2011-02-24
      相关资源
      最近更新 更多