如何在c中初始化数组?

时间:2013-12-10 14:09:20

标签: c arrays

我有一个函数应该初始化一个长度为3的数组并返回它。请参阅下面的代码。它到目前为止工作,但只适用于某些颜色。当我尝试写紫罗兰时,我认出了代码中的一个错误。当我写紫罗兰时,我有一个尾随的橙色元素。为什么这样,我该如何解决?我有更多像这样定义的颜色数组,其中一些似乎“泄漏”颜色。我想如何初始化数组有些不对劲。希望有人可以对此有所了解。

#define LEDS 64

struct array{ unsigned char hex[LEDS * 3]; };

struct array init_array(int r, int g, int b) {
    int i;
    struct array z;
    //GRB data, 3 bits for each color
    for(i = 0; i < sizeof(struct array) / sizeof(char); i++) {
        if(i == 0) z.hex[i] = g | 128;
        else if(i==1) z.hex[i] = r | 128;
        else z.hex[i] = b | 128;
    }
    return z;
}
...
struct array orange;
struct array violet;
...
violet=init_array(173, 141, 171); 
orange=init_array(192, 145, 128); 

while(1) {
    for(i=0; i<=LEDS; i++) {
        transfer(fd, violet.hex, sizeof (violet.hex));
    }
    for(i=0; i<=LEDS; i++) {
        transfer(fd, orange.hex, sizeof (orange.hex));
    }
}

这是传递函数:

void transfer(int fd, char* tx, uint32_t len) {
    int ret; 
    uint8_t rx[sizeof (&tx)] = {0,}; // RX buffer

    struct spi_ioc_transfer data = {
        .tx_buf = (unsigned long) tx,
        .rx_buf = (unsigned long) rx,
        .len = len,
        .delay_usecs = delay,
        .speed_hz = speed,
        .bits_per_word = bits,
        .cs_change = 0,
    };

    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &data);
    if (ret < 1)
        pabort("can't send spi message");

    usleep(50);
}

5 个答案:

答案 0 :(得分:1)

在您的代码中,数组类型定义为

struct array {unsigned char hex[LED * 3];};

LED定义为64,因此您要初始化一个3 * 64 = 192个无符号字符的数组,每个字符为一个字节。你确定这是你想要的吗?

此外,从init_array代码中,您分别给出绿色和红色一个字节。请注意,z.hex [0]是无符号字符,因此是z.hex [1]。对于剩下的190个字节,你给b | 128为所有人。这绝对不是RGB的工作方式。

假设您需要3个64位无符号值来保存每个RGB值,而不是使用for循环一次,您应该进行三个循环,每个循环用于R,G或B.在每个循环中,基于RGB值,填充64位,即8个字节。所以你的LED应该被定义为每个颜色空间8个无符号字符。

答案 1 :(得分:1)

如果你的数组代表64个LED,颜色如下:

+-----------------------------------
| g | r | b | g | r | b | g | r | b  ... and so on
+-----------------------------------

您的代码实际上是这样初始化它们:

+-----------------------------------
| g | r | b | b | b | b | b | b | b   ... and so on
+-----------------------------------

您可能希望这样做,而不是像第一个例子中那样设置颜色

for(i = 0; i < sizeof(z.hex); i += 3) {
      z.hex[i    ] = g | 128;
      z.hex[i + 1] = r | 128;
      z.hex[i + 2] = b | 128;
}

(请注意|128始终设置每种颜色的最重要位,您需要验证这是您真正想要的那样)

如果这不相关,请更新您的帖子并说明您想要做什么,为什么LEDS被定义为64,以及每个LEDS * 3 = 192字节用于什么,发布传输代码()并解释它应该做什么。

答案 2 :(得分:0)

异常但几乎有效的初始化需要进行调整:int j = i % 3

struct array init_array(int r, int g, int b) {
  int i;
  struct array z;
  printf("%u  ", (unsigned) (sizeof(struct array) / sizeof(char)));
  //GRB data, 3 bits for each color
  for (i = 0; i < sizeof(struct array) / sizeof(char); i++) {
    int j = i % 3;
    if (j == 0)
      z.hex[i] = g | 128;
    else if (j == 1)
      z.hex[i] = r | 128;
    else
      z.hex[i] = b | 128;
  }
  return z;
}

答案 3 :(得分:0)

据我所知,在你的例子中,你想要使用相同的3 * 8位RGB颜色将所有64个LED更改为紫罗兰色,而不是橙色,紫罗兰色等等。

考虑这样一个结构:

 struct color {
  char green;
  char red;
  char blue;
 };

在堆栈上创建颜色结构(此处,不在init fkt的框架中!):

 struct color violett, orange;

初始化

init_array( *col, int r, int g, int b) {

 col->red = r | 128;
 col->green = g | 128;
 col->blue = b | 128;
}

...

init_array(&violet, 173, 141, 171); 
init_array(&orange, 192, 145, 128);

转到您的转帐fkt:

while(1) {
 for(i=0; i<=LEDS; i++) {
   transfer(fd, &violet, sizeof (struct color));
 }
 for(i=0; i<=LEDS; i++) {
   transfer(fd, &orange, sizeof (struct color));
 }
}

使用提供的传输fkt写入LED。 玩得开心: - )

答案 4 :(得分:-1)

你的代码有很多问题..

for(i = 0; i&lt; LEDS; i ++){

    z.hex[i] = g|128;

    z.hex[i + 1] = r|128;

    z.hex[i + 2] = b|128;

}

和其他人一样:返回价值,通过参考转移......

对不起,c剂量不包含引用,以struct array init_array(int r,int g,int b)为例:

  int init_array(array* z, int r, int g, int b){

int i;
//GRB data, 3 bits for each color
 for(i = 0; i < LEDS; i++) {

    z->hex[i] = g|128;

    z->hex[i + 1] = r|128;

    z->hex[i + 2] = b|128;

}
return z;

}

它使用一个点将z转换为init函数,而不是返回一个新数组。