OpenEdv-开源电子网

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

C语言语句分析

[复制链接]

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2019-3-14
在线时间
20 小时
发表于 2019-4-9 15:52:15 | 显示全部楼层 |阅读模式
2金钱
typedef struct IMainTask
{
    void (*RunMainTask)(struct IMainTask* pThis, SerialPortBase* pSerialPort);
    BaseTask* pBaseTask;
} IMainTask;
IMainTask* GetMainTask(const uint8_t* msgs){...}

IMainTask* pMainTask = GetMainTask(msgs);
pMainTask->RunMainTask(pMainTask, pSerialPort);

1)pMainTask是指向IMainTask的,函数GetMainTask(msgs)返回应该是地址值,是把一个地址给了这结构体吗?
2)pMainTask->RunMainTask(pMainTask, pSerialPort); 中pMainTask可以访问RunMainTask?怎么理解 pMainTask又指回了自己IMainTask?

最佳答案

查看完整内容[请看2#楼]

8#,9# 都一起回吧 其实这都是我说的隐性创建对象, 例如 发送方 typedef struct { int a; float b; }ABC; ABC abc; // 创建了ABC的对象 USART_Send((u8*)&abc, sizeof(abc)); // 在发送的时候它被转换至字节的类型 在接收方, 同样要定义同一个ABC的结构体 typedef struct { int a; float b; }ABC; // 但从来不用创建此结构体的对象 USART_Rx((u8*)RxData, sizeof(ABC)); // 接收到 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-9 15:52:16 | 显示全部楼层
本帖最后由 edmund1234 于 2019-4-9 23:30 编辑
lafayet 发表于 2019-4-9 20:47
比如    AgvState* pAgvState = pParamsFeedback->pState; 结构体AgvState没有声明对象,只是用指针指向 ...

8#,9# 都一起回吧

其实这都是我说的隐性创建对象, 例如 发送方
typedef struct {
int a;
float b;
}ABC;

ABC abc;  // 创建了ABC的对象

USART_Send((u8*)&abc, sizeof(abc));    // 在发送的时候它被转换至字节的类型

在接收方, 同样要定义同一个ABC的结构体
typedef struct {
int a;
float b;
}ABC;      // 但从来不用创建此结构体的对象

USART_Rx((u8*)RxData, sizeof(ABC));   // 接收到类型是字节的数据
ABC*  abc = (ABC*)RxData;    // 虽然你从没创建过ABC的对象, 但你现在有了ABC的对象abc了


在整个收发系统里, 是有创建对象的, 但如果说, 你只是写接收方的代码时, 你会觉得你从来没创建过对象, 但又能产生对象
这不止是在数据传送,就只在调用库函数也一样, 库函数也可以自己创建了对象, 只是给你返回此对象的指针,只是不用你创建而已




回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-9 16:41:19 | 显示全部楼层
1)pMainTask是指向IMainTask的,函数GetMainTask(msgs)返回应该是地址值,是把一个地址给了这结构体吗?
定义与对象是两个慨念, IMainTask是结构体的定义, 返回的是这结构体对象的指针
定义就好比是一幢房子的图纸, 而对象是房子,图纸是没有地址的, 只有房子有地址,就是说返回的是根据图纸IMainTask所建造的房子的地址。

2)pMainTask->RunMainTask(pMainTask, pSerialPort); 中pMainTask可以访问RunMainTask?怎么理解 pMainTask又指回了自己IMainTask?
pMainTask->RunMainTask是一个函数指针, 而不是函数, 访问一函数指针当然是可以的, 你还可以通过这函数指针调用这函数, 而调用这函数时用什么参数, 只要符合函数对其参数的类型定义就可以了, 是否是该函数的地址不影响。
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2019-3-14
在线时间
20 小时
 楼主| 发表于 2019-4-9 17:26:48 | 显示全部楼层
edmund1234 发表于 2019-4-9 16:41
1)pMainTask是指向IMainTask的,函数GetMainTask(msgs)返回应该是地址值,是把一个地址给了这结构体吗?
...

谢谢 1)搞明白了;2)中还有个问题如果用指针调用了函数RunMainTask(pMainTask, pSerialPort),这个函数传递的第一个参数pMainTask是指向包含这个函数上一层的结构体,这样操作是为什么呢?
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2019-3-14
在线时间
20 小时
 楼主| 发表于 2019-4-9 17:36:31 | 显示全部楼层
edmund1234 发表于 2019-4-9 16:41
1)pMainTask是指向IMainTask的,函数GetMainTask(msgs)返回应该是地址值,是把一个地址给了这结构体吗?
...

1)如果定义是结构,对象是实际房子,那没有对象的结构体还有意义的吗?
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-9 19:40:10 | 显示全部楼层
lafayet 发表于 2019-4-9 17:36
1)如果定义是结构,对象是实际房子,那没有对象的结构体还有意义的吗?

不应该说是没对象, 而应该说是隐型的对象
比如是数据传送, 要把一个结构体传送, 传送的时候都是以字节类型来传送的
而接收方, 从来没有产生过对这结构体的对象, 但用了字节为类型的数据流, 以指针的方生产生了一这结构体的对象。
这在数据传送中很常用的
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-9 19:45:22 | 显示全部楼层
本帖最后由 edmund1234 于 2019-4-9 19:51 编辑
lafayet 发表于 2019-4-9 17:26
谢谢 1)搞明白了;2)中还有个问题如果用指针调用了函数RunMainTask(pMainTask, pSerialPort),这个函数 ...

想了一会大致明白你的意思, 这不是类, 这结构体与被它的函数指针成员, 所指着的函数没有任何从属关系, 所以没什么上一层的关系
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-9 19:55:12 | 显示全部楼层
我觉得这种把一结构体对象的地址作为函数的参数, 是想做到类似C++把数据跟成员函数绑一块的目的吧
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2019-3-14
在线时间
20 小时
 楼主| 发表于 2019-4-9 20:35:59 | 显示全部楼层
edmund1234 发表于 2019-4-9 19:40
不应该说是没对象, 而应该说是隐型的对象
比如是数据传送, 要把一个结构体传送, 传送的时候都是以字 ...

明白了 好吧 这种解释还真抽象一些
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2019-3-14
在线时间
20 小时
 楼主| 发表于 2019-4-9 20:47:59 | 显示全部楼层
edmund1234 发表于 2019-4-9 19:40
不应该说是没对象, 而应该说是隐型的对象
比如是数据传送, 要把一个结构体传送, 传送的时候都是以字 ...

比如    AgvState* pAgvState = pParamsFeedback->pState; 结构体AgvState没有声明对象,只是用指针指向其中某个成员:pAgvState->maxSpeed = GetParamsValue(1, 23);         pAgvState->spgvPeakCps = GetParamsValue(4, 4);        ...这种操作是否相当于利用结构体指针间接创建了一个结构体的对象呢?
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-9 23:29:20 | 显示全部楼层
房子是一定存在的, 只不过经常都不是直接给你这房子的地扯, 而是给了你这房子的是GPS的坐标, 你需要自己动手, 把它转换为房子的地址
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2019-3-14
在线时间
20 小时
 楼主| 发表于 2019-4-10 08:38:04 | 显示全部楼层
edmund1234 发表于 2019-4-9 15:52
8#,9# 都一起回吧

其实这都是我说的隐性创建对象, 例如 发送方

明白了 非常感谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 08:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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