OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2549|回复: 8

结构体做函数参数不能被赋值的问题。

[复制链接]

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-31
在线时间
49 小时
发表于 2020-2-27 16:26:46 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 xiao19344859 于 2020-2-27 16:58 编辑

定义了一个结构体 如下:如下结构体只做演示用

struct  stu
{


    u16 a;
u16 b;
u16 c;

};
extern struct stu aa;


//把结构体成员当作函数的参数使用的时候 发现结构体不能被赋值了
//程序没有任何报错 也没有警告
实例如下
//s 作为参数入口
void TSJ_init(u16 s)
{   s=STMFLASH_ReadHalfWord(zhou_yi_kai_FLASH_BASE);////读数据
if(s>8000)//如果超过上限值
s=7139;//恢复到默认值        STMFLASH_WriteHalfWord(zhou_yi_kai_FLASH_BASE, s);//恢复的默认值存储起来s=STMFLASH_ReadHalfWord(zhou_yi_kai_FLASH_BASE);//把存储好的数据读出来 赋值给 结构体成员 这里读到的是0
cc[0]=STMFLASH_ReadHalfWord(zhou_yi_kai_FLASH_BASE);//把存储好的数据读出来 赋值给 数组这里读到的是正确的 7139
}



TSJ_init(aa.a)//调用函数,结构体成员做 入口参数   
函数执行完了之后发现  aa.a的结构体成员数值是0  但是cc[0]数组的值是正确的值

顺便请教一下 结构体怎么作为函数的参数来使用,有没有成功的案例 方便贴上来做参考吗?









正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2020-2-27 16:48:30 | 显示全部楼层
典型的C没学好,
TSJ_init(aa.a);调用这个函数时,只是将aa.a的拷贝赋值给了s而已
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-31
在线时间
49 小时
 楼主| 发表于 2020-2-27 16:52:16 | 显示全部楼层
szczyb1314 发表于 2020-2-27 16:48
典型的C没学好,
TSJ_init(aa.a);调用这个函数时,只是将aa.a的拷贝赋值给了s而已

抱歉  是我没写明白。
实际上 前面还一段代码是  存数据的 到FLASH  存好的数据  读出来 给结构体的时候是0  同一个地址读出来的数据给  数组的时候  数组是正确的数据
回复

使用道具 举报

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-31
在线时间
49 小时
 楼主| 发表于 2020-2-27 16:56:40 | 显示全部楼层
szczyb1314 发表于 2020-2-27 16:48
典型的C没学好,
TSJ_init(aa.a);调用这个函数时,只是将aa.a的拷贝赋值给了s而已

我又修改了下帖子 麻烦再帮忙看下是哪里的问题  谢谢了!!!!
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2020-2-27 17:17:28 | 显示全部楼层
xiao19344859 发表于 2020-2-27 16:56
我又修改了下帖子 麻烦再帮忙看下是哪里的问题  谢谢了!!!!

单步打断点在s=STMFLASH_ReadHalfWord(zhou_yi_kai_FLASH_BASE);  
你这里的s在赋值后还是0吗?不可能时0的
你定义了结构体aa
TSJ_init(aa.a);调用这个函数时,只是将aa.a的拷贝赋值给了s而已,在函数内对s赋值,对在函数外的aa.a根本不受影响,如果你希望你在函数内对s的赋值也能赋值到函数外aa.a,那你得用指针才行
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-31
在线时间
49 小时
 楼主| 发表于 2020-2-27 17:44:17 | 显示全部楼层
szczyb1314 发表于 2020-2-27 17:17
单步打断点在s=STMFLASH_ReadHalfWord(zhou_yi_kai_FLASH_BASE);  
你这里的s在赋值后还是0吗?不可能时 ...

。。。
谢谢指点,确实是理解上有问题,作为函数的参数使用的时候 在函数内部给参数赋值是无效的。指针的话暂时还没测试
回复

使用道具 举报

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-31
在线时间
49 小时
 楼主| 发表于 2020-2-27 17:47:56 | 显示全部楼层
szczyb1314 发表于 2020-2-27 17:17
单步打断点在s=STMFLASH_ReadHalfWord(zhou_yi_kai_FLASH_BASE);  
你这里的s在赋值后还是0吗?不可能时 ...

单步打断点在s=STMFLASH_ReadHalfWord(zhou_yi_kai_FLASH_BASE);  
              aa[0]=STMFLASH_ReadHalfWord(zhou_yi_kai_FLASH_BASE);  
我把同一个地址的数据 连续读2次 赋值给不同的变量(其中一个是函数的参数),我发现函数的参数变量的值始终是0,我把值发送到串口显示出来发现2个值一个是0 一个是正确的值
aa[0]的值是正确的   
  最终我的理解是  作为参数使用的时候在函数内部是不能进行赋值操作的。至少结构体的形式是不可以,
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2020-2-28 08:41:03 | 显示全部楼层
给你个C语言的测试例程:
#include <stdio.h>
typedef unsigned short u16;
struct  stu
{
           u16 a;
        u16 b;
        u16 c;
};
struct stu aa;
u16 cc;
void test(u16 s)
{
        int a = 5;
        int b = 6;
        s = a + b;
        cc = a + b;
        printf("the \"s\" is %d,the \"cc\" is %d,the \"aa.a\" is %d\r\n",s,cc,aa.a);
}

int main()
{
   /* 我的第一个 C 程序 */
   printf("Hello, World! \n");
   test(aa.a);
   printf("The \"aa.a\" is %d\r\n",aa.a);
   return 0;
}
输出结果:
Hello, World!
the "s" is 11,the "cc" is 11,the "aa.a" is 0
The "aa.a" is 0

第二个例程:
#include <stdio.h>
typedef unsigned short u16;
struct  stu
{
           u16 a;
        u16 b;
        u16 c;
};
struct stu aa;
u16 cc;
void test(u16 *s)
{
        int a = 5;
        int b = 6;
        *s = a + b;
        cc = a + b;
        printf("the \"*s\" is %d,the \"cc\" is %d,the \"aa.a\" is %d\r\n",*s,cc,aa.a);
}

int main()
{
   /* 我的第一个 C 程序 */
   printf("Hello, World! \n");
   test(&aa.a);
   printf("The \"aa.a\" is %d\r\n",aa.a);
   return 0;
}
输出结果:
Hello, World!
the "*s" is 11,the "cc" is 11,the "aa.a" is 11
The "aa.a" is 11

你自己分析下吧,对你的“最终我的理解是  作为参数使用的时候在函数内部是不能进行赋值操作的。至少结构体的形式是不可以”这个来说,C是不存在这样子的情况的,只是你没用对方法
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 22:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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