【问题标题】:Easy access to multiple struct arrays轻松访问多个结构数组
【发布时间】:2017-04-08 07:46:32
【问题描述】:

我有 2 个结构数组

myStruct leds_left[20];
myStruct leds_right[20];

我需要一种方法来组合这两个结构,以便我可以像这样使用它:

*(structPtr[10]) // points to element of leds_left[10]
*(structPtr[30]) // points to element of leds_right[10] 

我已经尝试了以下方法:

myStruct ** structPtr = (myStruct**) malloc((20 + 20) * sizeof(myStruct*));
structPtr[0] = &leds_right[15]; //just with one element for testing

*(structPtr[0]) = newValue;

我做错了什么?

【问题讨论】:

标签: c arrays struct arduino


【解决方案1】:

为了确保leds_leftleds_right 真正分配在连续的内存中,它们必须“结构化在一起”。这与 union 结合可以提供您想要的:

#include <stdio.h>

typedef struct { int i; /* ... */ } myStruct;

static union {
  struct {
    myStruct leds_left[20];
    myStruct leds_right[20];
  };
  myStruct leds_all[40];
} data;

int main()
{
  for (int i = 0; i < 20; ++i) {
    data.leds_left[i].i = 1 + i;
    data.leds_right[i].i = -(1 + i);
  }
  for (int i = 0; i < 40; ++i) {
    printf(" %d", data.leds_all[i].i);
  }
  printf("\n");
  return 0;
}

在 Windows 10(64 位)的 cygwin 中使用 gcc 编译和测试:

$ gcc -std=c11 -o test-struct-array test-struct-array.c 

$ ./test-struct-array.exe 
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20

$

注意!

打包和对齐可能会成为问题(取决于 myStruct 实际包含的组件)。

【讨论】:

  • 哇,这将是一个非常好的解决方案!不幸的是 myStruct 不是我自己定义的,而且它似乎没有默认构造函数。因此,myStruct leds_all[40]; 行显示错误: union member '::all' with non-trivial 'myStruct::myStruct()' 是否有另一种方法可以使用您的好解决方案,哪个支持 non-default-ctor 结构?
  • @shoutcool 1. C 中没有构造函数。(标签错误?) 2. 对于不完整的@987654332,您可能不会分配内存(static/externmalloc 都没有) @。如果您只有指向不完整的struct 的指针,则上述解决方案超出了您的可能性。在这种情况下,忘记你的“优化”——你无法控制分配是否允许这样做。
  • @shoutcool 在这种情况下,最好的办法是指向这些structs 的指针数组。 Everything can be solved with another level of indirection.
  • 好吧....结构不完整。
  • 我已经尝试过使用指针数组。在问题中查看我的代码示例。我的想法是遍历所有结构数组(leds_left,leds_right..)并在新数组中保存每个元素的指针。我的代码有什么问题?
【解决方案2】:

我刚刚找到了一个对我来说足够好的解决方案。因为组合数组的好方法是不可能的,所以我只写了一个函数,女巫检查索引,然后访问其中一个数组中的正确元素。

    void setLED(int number, CRGB color){
       if (number < leds_left_size){
          leds_left[number] = color;
       }else if (number >= leds_left_size && number < leds_left_size + leds_top_size){
          leds_top[number - leds_left_size] = color;
       }else if (number >= leds_left_size + leds_top_size && number < leds_top_size + leds_left_size + leds_right_size){
          leds_right[number - leds_left_size - leds_top_size] = color;
       }else{
          leds_bottom[number - leds_left_size - leds_top_size - leds_right_size] = color;
       }
    }

它并不能完全回答我的问题,但它可以作为一种解决方法

【讨论】:

  • 这让我有点吃惊:作业是不完整的structs 无法使用的其他东西。可能是,您的struct 并不完整。恐怕我们仍然没有看到/发现您的实际问题......
  • 如果您将CRGB color 分配给leds_left,我会假设leds_left[number] 是这种类型的数组。
  • 是的,你是对的:CRGB leds_left[leds_left_size]; 并且 CRGB 是一个结构。想看的话here是github上的代码
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多