【问题标题】:Modify all elements of an array at the same time同时修改数组的所有元素
【发布时间】:2016-10-14 15:52:57
【问题描述】:

有没有办法同时修改数组的所有元素? 我的意思是 for 循环只是循环遍历数组并一一完成所有操作。

注意: 这是 .gsc/.csc(这是一种自己的编程语言),但它遵循基本的 C 语法:

function setCOD7DecodeFx()
{
    alphabet = strTok("a b c d e f g h i j k l m n o p q r s t u v w x y z", " ");
    test = "text";
    is_done = false;

    //I want all of the letters of text to change at the same time
    while(!is_done)
    {
        //I want this to happen without having to do text[num]
        test[0] = alphabet[rand(0, alphabet.size - 1)];
        test[1] = alphabet[rand(0, alphabet.size - 1)]; //rand -> rand(min, max)
        test[2] = alphabet[rand(0, alphabet.size - 1)]; //alphabet.size -> counts all elements in an array
        test[3] = alphabet[rand(0, alphabet.size - 1)];
        wait 0.25;
    }
    wait 3;
    is_done = true;
    test = "text";
}

它可以与 foreach 语句一起使用吗?我知道'foreach' 在 C 中不存在,但它存在于 gsc 中。

foreach(element in array)

【问题讨论】:

  • 这应该是不言自明的。我希望我说得尽可能清楚。
  • “我的意思是 for 循环只是循环遍历数组并一个接一个地执行所有操作。” 是的,这是正确的。一些具有内置方法的语言似乎可以一次对所有数组条目进行操作,但在幕后它们仍然一次只更新一个。 C 不会费心试图向你隐藏细节。
  • 给定足够多的内核,您可以使用例如:OpenMP(或手动)并行化它,但是这四个字节的开销将是巨大的。另外:rand 不是线程安全的,因此您可能会得到四个相等的值。或不。这取决于。
  • 最接近使用 C 的明显同时赋值(假设单行执行)将是在初始化期间。 eg:char array[3] = {{0}};example here,或者使用memset()等函数。但正如其他评论所述,即使它们同时出现,内存位置也会一次修改一个。
  • 评论反对选民。这里提出的问题来自一个显然正在研究 C 的程序员。这似乎是一个真诚的、格式良好的问题,并配有格式化的代码来说明问题,如果你给它一个机会,它实际上很有趣。 我认为没有必要投反对票。如果 OP 有什么不同的做法,请将其放入评论中。

标签: c arrays


【解决方案1】:

要修改像test 这样的 数组(不超过int 个字符的大小),代码可以使用以下有许多限制(字节序、int 大小等)的代码。

#include<stdlib.h>

int main(void) {
    const unsigned base_letter = 'a';
    const unsigned offset_pow2 = 5;  // a-z and "{|}~" and code 127

    const unsigned char_mask = (1u << offset_pow2) - 1;
    unsigned mask = 
        char_mask << 24 | char_mask << 16 | char_mask << 8 | char_mask;
    unsigned offset = 
        base_letter << 24 | base_letter << 16 | base_letter << 8 | base_letter;
    union {
      char test[5];
      unsigned r;
    } u = { "text" };
    u.r = (rand() & mask) + offset;  // Set all characters at once
    printf("<%s>\n", u.test);
}

输出

<nury>

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2019-06-11
    • 2013-01-21
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多