【问题标题】:Fill an array with an array?用数组填充数组?
【发布时间】:2014-11-27 10:58:53
【问题描述】:

我正在做一些电子产品:我有 12 个 RGB LED 成一个圆圈(我称之为跟轮)。我将按照预定义的“级别”“脉冲”每种 LED 颜色:见下文,例如,LEVEL02 意味着 LED 的颜色将每 10 个周期脉冲两次……代码将循环通过所有 12 个 LED一次一个。 1 个周期 = 12 个 LED...10 个周期 = 一个色阶循环

基本上我想做的是说pixel[1] = colour1pixel[5] = colour9等...其中pixel是我的数组heelwheelcolour是一组常量char数组@ 987654327@、clRRG 等...好的,更多详细信息:

// Color Level Definitions

#define LEVEL00 "0000000000" 
#define LEVEL01 "1000000000" 
#define LEVEL02 "1000010000"

等等...直到 LEVEL10

char heelwheel[12][3]; //wheel pixel: LED, Colour (Red, Green, Blue)

// Colour Definitions: defining mix of colour levels for 12 standard colours 
//(12 coincidentally == the number of LEDs: no particular reason)

const char *clRED[3] = {LEVEL10, LEVEL00, LEVEL00} ; // full red
const char *clRRB[3] = {LEVEL06, LEVEL00, LEVEL04} ; // mostly red, bit of blue
const char *clRAB[3] = {LEVEL05, LEVEL00, LEVEL05} ; // purple

等... 12 种颜色

所以我想要做的是通过指定 12 种颜色中的 1 种来设置 12 个“像素”中的每一个...例如

heelwheel[0] = clRED ;
heelwheel[1] = clRRB ;

我希望很清楚我想要做什么......我的理论是我已经将heelwheel 定义为一个二维数组:我不想单独设置二维中的三个值,我只想说these three values = the three values contained in the three-value colour arrays

gcc error = "incompatible types when assigning to type char *[3] from type const char **"... 

我试图了解 C 中有关数组的大量资源,但有些东西是“坚持”的,但我是 C 的初学者,所以我很快就进入了令人头疼的领域。

【问题讨论】:

  • 而不是:heelwheel[0] = clRED;使用 memcpy( &heelwheel[0], clRED, sizeof(clRED) );
  • 谢谢,我试试看!这可能会回答我的问题,而“放松”的答案在实用性/标准实践方面可能更有意义

标签: c gcc raspberry-pi


【解决方案1】:

不要为此使用类似字符串的数据类型,因为字符串在 C 中表示为数组,而数组是不可赋值的。

将颜色编码为整数,典型的选择是uint32_t 用于完整的 24 位 RGB,有 8 位备用。

那么你就有了:

uint32_t heelwheel[12];

颜色定义如下:

/* these assume red in the msbs, blue in the lsbs. */
const uint32_t red = 0xff0000;
const uint32_t purple = 0xff00ff;
const uint32_t yellow = 0xffff00;
/* and so on */

而且可以直接赋值,没问题:

heelwheel[0] = red;
heelwheel[1] = purple;

【讨论】:

  • 感谢展开...所以数组不能包含数组?我会接受你的建议,看看我会怎么做......就像我说的,它是用于电子产品的,所以我需要“脉冲”东西......我真的不能使用超过 10 个级别,否则我会得到“闪烁”......虽然我得到了你的方法:也许如果我使用单个 30 位二进制数......我只需要分别循环通过 10 位的三个“段”来“脉冲”适当的颜色引脚.. .
【解决方案2】:

数组不能包含数组?

一个数组可以包含一个数组(事实上,当你定义char heelwheel[12][3]时,你会得到一个由3个字符组成的12个数组的数组),只是不可能通过larray = rarray将一个数组分配给一个数组,因为C 标准在 左值、数组和函数指示符部分中说:

除非它是sizeof 运算符的操作数,否则_Alignof 运算符,或一元 & 运算符,或者是用于 初始化一个数组,一个类型为“type”的表达式是 转换为类型为“pointer to type”的表达式 到数组对象的初始元素并且不是左值。

但是你可以通过定义实现你想要的

const char **heelwheel[12]; //wheel pixel: LED, Colour (Red, Green, Blue)

与您的const char *clRED[3] 等兼容,因为clRED 等具有类型''指向 const char 的指针数组'',它被转换为类型''指向指向 const char 的指针'',而后者又可以是由诸如

之类的表达式分配
heelwheel[0] = clRED;
heelwheel[1] = clRRB;

在这些分配之后 e. G。 heelwheel[1][2]LEVEL04

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多