首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >考虑到有限的RAM空间,如何在C中声明和使用大小为[16][256]的二维int数组。

考虑到有限的RAM空间,如何在C中声明和使用大小为[16][256]的二维int数组。
EN

Stack Overflow用户
提问于 2015-08-22 10:47:16
回答 2查看 471关注 0票数 1

我使用的是avr-8位单片机.它的RAM大小为2K。我必须声明并使用大小为16的int变量。这台机器上的int是两个字节。这个数组将消耗2*16*256 = 8k。这个大小是不可接受的,因为我只有2K内存。

我必须使用这个二维数组来存储正在写入的闪存页的状态。此数组将接受1或0值。1表示写了闪存中的页,0表示没有写入闪存中的页。

我正在寻找如何存储此状态的解决方案。不确定位字段在这里是否有用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-22 11:31:55

如果只想使用数组存储布尔数据,则每个字段不需要整个16位。

要存储16*256位,只需要512字节。

以下示例中的makros可用于访问16xN缓冲区中的值:

代码语言:javascript
复制
#include <stdio.h>
#include <stdint.h>

#define BIT_ISSET(a, x, y)      ((a[x] &  (1<<y))!=0)
#define BIT_SET(a, x, y)         (a[x] |= (1<<y))
#define BIT_CLEAR(a, x, y)       (a[x] &= (1<<y)^0xffff)

int main()
{
    uint16_t values[256] = {0};

    // set some bits
    BIT_SET(values, 3, 0);
    BIT_SET(values, 3, 1);
    BIT_SET(values, 3, 2);
    BIT_SET(values, 3, 3);
    BIT_SET(values, 3, 15);

    // clear one of the previously set bits
    BIT_CLEAR(values, 3, 2);

    int i,j;
    for (i=0;i<256;i++) { // 256 rows
        for (j=0;j<16;j++) { // 16 columns
            printf("%i", BIT_ISSET(values, i, j));
        }
        printf("\n");
    }
    return 0;
}
票数 7
EN

Stack Overflow用户

发布于 2015-08-22 11:12:45

您可以使用位而不是数组。你只需要256*16位。所以256*16/8 = 384字节就足够了。您可以为此使用char数组并进行位操作以保存值:How do you set, clear, and toggle a single bit?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32155228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档