搜索
bottom↓
回复: 42

请教一个数组定义的问题

[复制链接]

出0入0汤圆

发表于 2019-2-9 16:18:26 | 显示全部楼层 |阅读模式
想定义有一个数组,名称相同,但里面的元素不同,想利用单片机某脚读入高低电平不同,来相应定义这个名称相同内容不同的数组,来达到用同一个函数在不同场合调用不同的数组元素的目的。实际就是两个数组,但为了后面程序调用方便,而起了相同的名字。
如:

if(PIND.4==1)
   {flash uchar A[]={1,2,3} ;   }
else if(PIND.4==0)
   {flash uchar A[]={4,5,6}    }
我将这段代码放在主函数里,结果编译通不过,后面的程序引用这个数组时,说这个数组A未定义,请问应该怎样处理?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2019-2-9 16:26:43 来自手机 | 显示全部楼层
局部变量的生命周期只存在大括号里面

出130入129汤圆

发表于 2019-2-9 16:31:46 | 显示全部楼层
没见过这么用,你每个判断条件里面,给每个数组元素赋值得了。

出0入0汤圆

发表于 2019-2-9 16:42:28 来自手机 | 显示全部楼层
简单的说就是先声明后使用,你在条件判断中声明数组就绝对不行了,不如一开始把A做成二维的,然后在判断中使用指针。

出0入42汤圆

发表于 2019-2-9 16:58:54 | 显示全部楼层
没见过这么用的!

出0入0汤圆

 楼主| 发表于 2019-2-9 17:03:33 | 显示全部楼层
那到底怎么才能解决这个问题啊?请高手详细指点一下,先谢谢了。

出0入0汤圆

发表于 2019-2-9 17:22:29 | 显示全部楼层
全局变量 二维数组

出130入129汤圆

发表于 2019-2-9 17:22:29 | 显示全部楼层
rjx 发表于 2019-2-9 17:03
那到底怎么才能解决这个问题啊?请高手详细指点一下,先谢谢了。


即使可以这么定义,数组A在括号外面怎么用?
变量的作用域你不考虑的?
在外面定义数组不就可以了,根据不同条件来赋值。

出0入4汤圆

发表于 2019-2-9 18:59:03 来自手机 | 显示全部楼层
全局变量

出0入57汤圆

发表于 2019-2-9 20:01:14 来自手机 | 显示全部楼层
flash uchar A[]={1,2,3};

if(PIND.4==1)
   {A[0]=1 ;
A[1]=2;

}
else if(PIND.4==0)
   {
A[0]=4;
……
}

出0入8汤圆

发表于 2019-2-10 00:34:24 来自手机 | 显示全部楼层
你定义一个指针不就可以了

出200入2554汤圆

发表于 2019-2-10 01:27:30 来自手机 | 显示全部楼层
你属于位于 flash 区,动态改内容就算了。还是找个指针稳妥下,根据电平指向不同 flash 位置,然后用指针当数组名

出0入0汤圆

发表于 2019-2-10 01:45:02 | 显示全部楼层
一是用指针,二是函数封装好传递参数

出0入0汤圆

发表于 2019-2-10 11:42:19 来自手机 | 显示全部楼层
本帖最后由 nanfang2000 于 2019-2-10 11:43 编辑

先定一个两个数组A1A2,然后根据条件用指针指向要用的数组。
这是指针最基本的用法

出0入0汤圆

发表于 2019-2-10 11:46:55 | 显示全部楼层
先定义,然后判断再赋值

出0入0汤圆

发表于 2019-2-10 11:49:01 | 显示全部楼层
先定义,再判断赋值
flash uchar A[]
if(PIND.4==1)
   {A[0]=1; A[1]=2; A[2]=3;   }
else if(PIND.4==0)
   {A[0]=4; A[1]=5; A[2]=6;   }

出0入0汤圆

发表于 2019-2-10 12:11:32 来自手机 | 显示全部楼层
你们啊……已经被flash修饰的变量了,还在程序中修改内容?

出0入0汤圆

发表于 2019-2-10 13:25:04 来自手机 | 显示全部楼层
你可以改行了,不适合写代码。

出0入4汤圆

发表于 2019-2-10 16:27:06 | 显示全部楼层
XA144F 发表于 2019-2-10 12:11
你们啊……已经被flash修饰的变量了,还在程序中修改内容?

flash修饰的变量是什么意思?将这个变量存进flash中吗?将这个变量存进flash不是用const吗?

出0入0汤圆

发表于 2019-2-11 07:59:05 | 显示全部楼层
编译和执行

出0入0汤圆

发表于 2019-2-11 21:49:40 | 显示全部楼层
flash估计是楼主自定义的类型吧,理解应该是Flash存储器即ROM上变量,也就是const变量,楼主的意思应该是根据不同状态获取相同变量名称的不同值吧,既然已经是静态变量,这些值应该是编译固化在flash上的,后期想修改智能做特殊处理。想要通过相同名称访问不同静态变量值只能使用指针来访问了。不同通状态改变指针指向内容。

出0入0汤圆

发表于 2019-2-12 13:07:30 | 显示全部楼层
uchar * pA;
if(PIND.4==1)
   {flash uchar A[]={1,2,3} ;   
    pA = A;}
else if(PIND.4==0)
   {flash uchar A[]={4,5,6}   
    pA = A;}

出0入0汤圆

发表于 2019-2-12 13:25:10 | 显示全部楼层
用预编译指令来定义 #if else就可以了

出0入0汤圆

 楼主| 发表于 2019-2-12 16:19:28 | 显示全部楼层
本帖最后由 rjx 于 2019-2-12 16:30 编辑
lingdianhao 发表于 2019-2-10 13:25
你可以改行了,不适合写代码。


不好意思,我本身就不是专业写代码的,我都是古来稀的老头子了。牛x一下:几年来自学了单片机和C,只是一种乐趣而已。目前会PIC,AVR和STM32。自己觉得比很多年轻人强多了。不信你搜一下本论坛和开源电子网,看看我发的帖子。
但是必须承认的是还存不少的知识盲点,所以才发帖向年轻人请教。你愿帮一下吗?
同时各位的解答,目前使用问题已解决,但不是最好的方法,是先定义两个全局数组,然后在程序中按不同的条件赋值。

出0入0汤圆

发表于 2019-2-12 16:39:15 | 显示全部楼层
rjx 发表于 2019-2-12 16:19
不好意思,我本身就不是专业写代码的,我都是古来稀的老头子了。牛x一下:几年来自学了单片机和C,只是一 ...

...70+了还折腾啥啊

出0入0汤圆

 楼主| 发表于 2019-2-12 16:49:59 | 显示全部楼层
tragedy 发表于 2019-2-12 16:39
...70+了还折腾啥啊

生活要有乐趣啊。

出0入4汤圆

发表于 2019-2-12 17:17:08 | 显示全部楼层
rjx 发表于 2019-2-12 16:49
生活要有乐趣啊。

使用全局变量,少很多麻烦。。。

出0入0汤圆

发表于 2019-2-12 17:26:50 来自手机 | 显示全部楼层
不定义全局数组,那就在函数开头定义呀

出0入10汤圆

发表于 2019-2-12 17:34:37 | 显示全部楼层
定义2维数组啊

出0入0汤圆

发表于 2019-2-12 22:07:12 | 显示全部楼层
C语言联合体的概念去了解下,如果对程序体积要求不大

出0入0汤圆

发表于 2019-2-12 23:18:18 | 显示全部楼层
本帖最后由 yiminglei_2 于 2019-2-12 23:22 编辑

一定要放到同一个数组吗?这样行不行?

flash uchar A[]={1,2,3};
flash uchar B[]={4,5,6};
uchar *p=A;

if(PIND.4==1)
{
        p=A;
}
else if(PIND.4==0)
{
        p=B;
}

出0入0汤圆

发表于 2019-2-13 03:34:07 来自手机 | 显示全部楼层
楼上和我想法一样。还可以进一步简化,把ab数组指针放到第三个数组,这样可以一句话用pind.4索引到。或者直接用二维数组也是一样,省去if else

出0入0汤圆

发表于 2019-2-13 09:14:05 | 显示全部楼层
rjx 发表于 2019-2-12 16:19
不好意思,我本身就不是专业写代码的,我都是古来稀的老头子了。牛x一下:几年来自学了单片机和C,只是一 ...


前辈失敬,你两种情况下需求的数组值都是固定的,从代码执行速度讲没必要在判断中给数组各个元素赋值一遍,因为分别复制要3条指令,指针指向只需要一条。
直接在判断里面使用指针,指向你需要的数组就行了,数组的值是编译的时候就确定好了。
代码,按31楼最简单了。

出0入0汤圆

 楼主| 发表于 2019-2-15 21:01:15 | 显示全部楼层
本帖最后由 rjx 于 2019-2-15 21:02 编辑

31楼的方法可行,感谢。我对指针这块不是太熟悉,改成这样行吗?目的是让C数组在两种情况下就可得到不同的值。

uchar  C[3]={0};
uchar A[]={1,2,3};
uchar B[]={4,5,6};
uchar *p=C;

if(PIND.4==1)
{
        p=A;
}
else if(PIND.4==0)
{
        p=B;
}

出0入0汤圆

发表于 2019-2-15 21:54:34 | 显示全部楼层
rjx 发表于 2019-2-15 21:01
31楼的方法可行,感谢。我对指针这块不是太熟悉,改成这样行吗?目的是让C数组在两种情况下就可得到不同的 ...


你这样写,C数组的内容是不会被修改的

出0入0汤圆

 楼主| 发表于 2019-2-16 16:54:30 | 显示全部楼层
本帖最后由 rjx 于 2019-2-16 17:02 编辑

感谢答复。
请教楼上,那应该怎么写?我的目的必须是第三个数组C在不同的情况下,分别为A数组或B数组的值。诚信请教。

出0入0汤圆

发表于 2019-2-16 16:58:48 | 显示全部楼层
rjx 发表于 2019-2-12 16:49
生活要有乐趣啊。

给你点赞!!!
你这个问题:是局部变量的生命周期只在他说处的 {}内。在{}外引用的不行的。

出0入0汤圆

发表于 2019-2-16 17:15:51 | 显示全部楼层
定义:uchar A[2][3] = {{4,5,6},{1,2,3}};
用法:uchar a = A[PIND.4][X];
根本不用判断引脚的电平就可以了

出0入0汤圆

 楼主| 发表于 2019-2-18 14:21:03 | 显示全部楼层
继续诚求解答。
有3个数组,其中C数组为待赋值的数组,另两个已知的数组A和B里各有100个不同的元素,按给定的条件,使C数组能得到不同的值,要求用指针的方法解决此问题

uchar  C[100]={0};
uchar A[100]={100个已知元素};
uchar B[100]={另外不同的100个已知元素};


if(PIND.4==1)
{
       使C数组等于A;
}
else if(PIND.4==0)
{
      使C数组等于B;
}

出0入59汤圆

发表于 2019-2-18 15:12:07 | 显示全部楼层
将C定义为指针,将相应数组的地址赋过去
建议楼主好好看下 c程序设计语言 这本书 https://book.douban.com/subject/1139336/
很薄的小册子

出0入0汤圆

 楼主| 发表于 2019-2-18 15:40:52 | 显示全部楼层
这样问题得到解决,不知是不是最好的办法.

uchar  C[100]={0};
uchar A[100]={100个已知元素};
uchar B[100]={另外不同的100个已知元素};
uchar *p;
uchar i;

if(PIND.4==1)
{
     for(i=0;i<100;i++)  { *p++=A[i]; }
}
else if(PIND.4==0)
{
      for(i=0;i<100;i++)  { *p++=B[i]; }
}

出0入0汤圆

发表于 2019-2-18 15:49:40 | 显示全部楼层
rjx 发表于 2019-2-18 14:21
继续诚求解答。
有3个数组,其中C数组为待赋值的数组,另两个已知的数组A和B里各有100个不同的元素,按给定 ...

uchar  C[100]={0};
uchar A[100]={100个已知元素};
uchar B[100]={另外不同的100个已知元素};


if(PIND.4==1)
{
       memcpy(C, A, sizeof(C)); //把数组A内容拷贝到数组C
}
else if(PIND.4==0)
{
      memcpy(C, B, sizeof(C)); //把数组B内容拷贝到数组C
}

出0入0汤圆

 楼主| 发表于 2019-2-18 16:43:04 | 显示全部楼层
本帖最后由 rjx 于 2019-2-18 16:45 编辑

谢谢楼上yiminlei_2指教。用memcpy函数也很好,现在在我的程序中,三种方法都可以了,一是用循环给数组逐一赋值,二是用指针逐一赋值;三是用memcpy函数,三种方法各有优势。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 23:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表