搜索
bottom↓
12
返回列表 发新帖
楼主: wye11083

向莫大学习,从今天开始有限解答C/C++/Xilinx方面的较难问题

  [复制链接]
(7954978)

出0入0汤圆

发表于 2020-8-1 04:18:37 | 显示全部楼层
支持楼主
(7715681)

出0入0汤圆

发表于 2020-8-3 22:46:54 | 显示全部楼层
支持楼主
(7678661)

出0入0汤圆

发表于 2020-8-4 09:03:54 | 显示全部楼层
支持,希望在这个帖子下多学习,取得进步
(6680052)

出0入0汤圆

发表于 2020-8-15 22:27:23 | 显示全部楼层
请楼主介绍下,多文档设计,如果躲开MFC,C++还有比较容易上手的工具吗?还有上次提到的线程里加SLEEP(100),加上后CPU的占用率仍是100%。
(6679941)

出0入16汤圆

 楼主| 发表于 2020-8-15 22:29:14 来自手机 | 显示全部楼层
zw_7627 发表于 2020-8-15 22:27
请楼主介绍下,多文档设计,如果躲开MFC,C++还有比较容易上手的工具吗?还有上次提到的线程里加SLEEP(100) ...

不知道了。qt你可以看看。cpu 100%还是你代码有跑,没有执行sleep,你调试。
(6679641)

出0入0汤圆

发表于 2020-8-15 22:34:14 | 显示全部楼层
wye11083 发表于 2020-8-15 22:29
不知道了。qt你可以看看。cpu 100%还是你代码有跑,没有执行sleep,你调试。 ...

谢谢,还有个情况,比如我想开个120秒的定时器,第一种settimier(1,1000,null);然后计数;第二种第一种settimier(1,120000,null);两种定时的时间并不准确。是什么原因,有什么好的解决办法?
(6677634)

出0入16汤圆

 楼主| 发表于 2020-8-15 23:07:41 来自手机 | 显示全部楼层
zw_7627 发表于 2020-8-15 22:34
谢谢,还有个情况,比如我想开个120秒的定时器,第一种settimier(1,1000,null);然后计数;第二种第一种se ...

pc本来就不精确。你可以用mutex配合timeout用。
(2910453)

出0入0汤圆

发表于 2020-9-28 13:34:02 | 显示全部楼层
mark,收藏慢慢学习
(1967286)

出0入0汤圆

发表于 2020-10-9 11:33:29 | 显示全部楼层
请教两个关于 C++的问题,也是困扰我两天的问题。
1、 7347F77A15A902DB20688C1A2C2AA2AC.jpg
此处 typedef 的函数指针定义为啥我不能放在类里面,图中第二个箭头所示的方向,放在里面就会报错,参见最下面一个箭头。

2、我在移植一个 shell 类的时候,涉及到函数指针的问题,本意上 shell 的命令都是通过 public 的外部函数进行添加,如下:
  1. void X_Shell::addCommand(const char *name, ShellFunctionT functionPoint)
  2. {
  3.         strncpy(&this->_staticCommand[X_Shell::commandCount].commandName[0], name, sizeof(this->_staticCommand[X_Shell::commandCount].commandName));
  4.         this->_staticCommand[X_Shell::commandCount].functionPoint = functionPoint;

  5.         X_Shell::commandCount++;

  6.         if (X_Shell::commandCount >= X_SHELL_MAX_CMD_COUNT)
  7.         {
  8.                 this->_shellSerial->print("Too many commands has been added!\r\n");
  9.         }
  10. }
复制代码

其中
  1. _staticCommand
复制代码
的结构体定义如下:
  1. typedef struct
  2. {
  3.         char commandName[X_SHELL_CMD_NAME_MAX_LENGTH];
  4.         void (*functionPoint)(char argc, char *argv);
  5. } CommandT;
复制代码


我为了内置一个保留命令,“ls”,所以将这个命令加入
  1. _staticCommand[0]
复制代码

但是在构造函数中初始化的的时候一直报错,
  1. X_Shell::X_Shell(HardwareSerial &serial)
  2. {
  3.         this->_shellSerial = &serial;

  4.         strncpy(this->_shell.userName, X_SHELL_USER_NAME, sizeof(this->_shell.userName));

  5.         strncpy(this->_staticCommand[0].commandName, "ls", sizeof(_staticCommand[0].commandName));
  6.         this->_staticCommand[0].functionPoint = this->shellListCommand;

  7.         this->_shell.command = &_staticCommand[0];
  8. }
复制代码

其中shellListCommand的定义如下:
  1. void X_Shell::shellListCommand(char argc, char *argv)
  2. {
  3.         if (!strcmp("all", &argv[argv[1]]))
  4.         {
  5.                 for (uint8_t i = 0; this->_staticCommand[i].functionPoint != NULL; i++)
  6.                 {
  7.                         this->_shellSerial->printf("%s\r\n", this->_staticCommand[i].commandName);
  8.                 }
  9.         }
  10.         else if (!strcmp("-v", &argv[argv[1]]))
  11.         {
  12.                 this->_shellSerial->printf("%s\r\n", X_SHELL_VERSION);
  13.         }
  14.         else
  15.         {
  16.                 this->_shellSerial->print("ls [options]\r\n");
  17.                 this->_shellSerial->print("options: \r\n");
  18.                 this->_shellSerial->print("\t -v \t: Show version\r\n");
  19.                 this->_shellSerial->print("\t all \t: show all commands\r\n");
  20.         }
  21. }
复制代码


看到网上说涉及到类的函数指针,需要把成员函数声明为 static,这块也不是很理解,还是希望大神指点一下~
(1962739)

出0入16汤圆

 楼主| 发表于 2020-10-9 12:49:16 来自手机 | 显示全部楼层
solojimes 发表于 2020-10-9 11:33
请教两个关于 C++的问题,也是困扰我两天的问题。
1、
此处 typedef 的函数指针定义为啥我不能放在类里面, ...

1 typedef确实是类似于define的东西,但是又不一样,一般是放顶层头文件或者全局,具体你要查c++标准,我也没这样用过。

2 报什么错?
(1957949)

出0入0汤圆

发表于 2020-10-9 14:09:06 | 显示全部楼层
wye11083 发表于 2020-10-9 12:49
1 typedef确实是类似于define的东西,但是又不一样,一般是放顶层头文件或者全局,具体你要查c++标准, ...

iShot2020-10-09 14.08.41.png
(1949325)

出0入16汤圆

 楼主| 发表于 2020-10-9 16:32:50 来自手机 | 显示全部楼层
solojimes 发表于 2020-10-9 14:09

你加个强制类型转换试试,或者先弄成void*再转换。类里面的函数一般来说都是全局的,继承的函数会通过virtual ptr表去找。
(1942892)

出0入0汤圆

发表于 2020-10-9 18:20:03 | 显示全部楼层
wye11083 发表于 2020-10-9 16:32
你加个强制类型转换试试,或者先弄成void*再转换。类里面的函数一般来说都是全局的,继承的函数会通过vi ...

而类成员函数指针就不仅仅是类成员函数的内存起始地址,还需要能解决因为C++的多重继承、虚继承而带来的类实例地址的调整问题,所以类成员函数指针在调用的时候一定要传入类实例对象。

https://blog.csdn.net/qq_3766843 ... 9#comments_13380571

参考一下
(1942480)

出0入16汤圆

 楼主| 发表于 2020-10-9 18:26:55 来自手机 | 显示全部楼层
solojimes 发表于 2020-10-9 18:20
而类成员函数指针就不仅仅是类成员函数的内存起始地址,还需要能解决因为C++的多重继承、虚继承而带来的 ...

所以我叫你强制转换啊。
(1852966)

出0入0汤圆

发表于 2020-10-10 19:18:49 | 显示全部楼层
solojimes 发表于 2020-10-9 11:33
请教两个关于 C++的问题,也是困扰我两天的问题。
1、
此处 typedef 的函数指针定义为啥我不能放在类里面, ...

1。放到外边是全局的定义,类型是ShellFunctionT,放到类里边定义类型是X_Shell::ShellFunctionT
2。void X_Shell::shellListCommand(char argc, char *argv) 是 void (X_Shell::*)(char , char *)类型,不是void (*)(char , char *) 类型
void (X_Shell::*)(char , char *)是类成员函数指针,参数隐含this指针,是和X_Shell类的实例绑定的,可以使用this指针访问类内部变量。
void (*)(char , char *)不和任何类实例绑定,不能使用this指针。
类内部的static 函数不和类绑定,static void X_Shell::shellListCommand(char argc, char *argv)不和任何类实例绑定,不能访问类内部非static变量


为了通用的话接口不要定义为void (*)(char , char *),定义成std::function<void(char,char*)> 类型,类外的函数和static函数直接传进来,
类内部的函数用std::bind绑定下在传进来
(1696779)

出0入0汤圆

发表于 2020-10-12 14:41:56 | 显示全部楼层
顶一下,学习
(1108204)

出0入0汤圆

发表于 2020-10-19 10:11:31 来自手机 | 显示全部楼层
楼主好人,请教个问题:现在用C#编一个界面,里面有一部分实时显示摄像头图像,现在需要拍一张照片,然后在和摄像头实时采集图像进行对比。但是不知道怎么实现,楼主如有思路,请指教,谢谢
(1107482)

出0入16汤圆

 楼主| 发表于 2020-10-19 10:23:33 来自手机 | 显示全部楼层
heyangfengyue 发表于 2020-10-19 10:11
楼主好人,请教个问题:现在用C#编一个界面,里面有一部分实时显示摄像头图像,现在需要拍一张照片,然后在 ...

对比什么?你这可能涉及到图像检测或图像识别领域了。

如果只是单纯的显示,那你一边一个好了,静态图像最简单的可以用picture控件,但是注意csharp的picture控件非常难用(加载图像文件之后会占有文件句柄造成文件被系统锁定),而且动态刷流时极易崩溃,如果不在乎cpu可以用opengl。mfc做这件事比csharp要方便10000倍。
(1101111)

出0入0汤圆

发表于 2020-10-19 12:09:44 | 显示全部楼层
点赞,支持你,大佬!
(897158)

出0入0汤圆

发表于 2020-10-21 20:48:57 | 显示全部楼层
wye11083 发表于 2020-10-19 10:23
对比什么?你这可能涉及到图像检测或图像识别领域了。

如果只是单纯的显示,那你一边一个好了,静态图像 ...

拍摄的图像是用于对比位置的,就是拍摄一张图片,然后和摄像头里面的图像进行对比,发现位置有偏差了就纠正偏差,使之对齐。是想实现这样的功能
(893624)

出0入16汤圆

 楼主| 发表于 2020-10-21 21:47:51 来自手机 | 显示全部楼层
heyangfengyue 发表于 2020-10-21 20:48
拍摄的图像是用于对比位置的,就是拍摄一张图片,然后和摄像头里面的图像进行对比,发现位置有偏差了就纠 ...

那你这得做图像匹配,你找找opencv。
(892689)

出0入0汤圆

发表于 2020-10-21 22:03:26 | 显示全部楼层
wye11083 发表于 2020-10-21 21:47
那你这得做图像匹配,你找找opencv。

拍个照片只是参考,调节位置,是手动调节的,不是自动调节,用不着OPENCV。我现在是获取了摄像头的实时图像,也可以拍照,但是不知道怎么把图片叠加在摄像头的实时图像上,望指教,谢谢
(886199)

出0入16汤圆

 楼主| 发表于 2020-10-21 23:51:36 来自手机 | 显示全部楼层
heyangfengyue 发表于 2020-10-21 22:03
拍个照片只是参考,调节位置,是手动调节的,不是自动调节,用不着OPENCV。我现在是获取了摄像头的实时图 ...

取bitmap,然后直接用指针访问就行了。网上有例程。
(829379)

出0入0汤圆

发表于 2020-10-22 15:38:36 | 显示全部楼层
wye11083 发表于 2020-10-21 23:51
取bitmap,然后直接用指针访问就行了。网上有例程。

好滴,谢谢大神指导
(812174)

出0入0汤圆

发表于 2020-10-22 20:25:21 | 显示全部楼层
  1. main()
  2. {
  3.         signed char i;
  4.         i=0xff;
  5.         D1=0;
  6.         if(i==0xff)
  7.                 D1=0;
  8.         else
  9.                 D1=1;
  10.         while(1);
  11. }
复制代码

这段代码的执行结果 D1为1,请问是什么原因?
(807896)

出0入16汤圆

 楼主| 发表于 2020-10-22 21:36:39 来自手机 | 显示全部楼层
iamastu 发表于 2020-10-22 20:25
这段代码的执行结果 D1为1,请问是什么原因?

如果你按signed char,那么它=-1,显然不等于0xff(255)。当值未显式定义长度时,编译器默认为标准int类型数据。
(549552)

出0入0汤圆

发表于 7 天前 | 显示全部楼层
谢谢wye11083,应该是将i的值转换成 int 类型,变为0xffff,与 0xff 不相等了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-11-1 06:01

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

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