回调函数问题
Call Back Function issue
我正在尝试回调函数,我看不出这里出了什么问题。
func1接受两个函数指针,我将指针传递给func2和func3。Func2在打印到cout之前应该等待5秒,func3在打印到cout之前应该等待12秒。wait()函数是我自己实现的,但没有包括在这里。
程序运行时,5秒后,func2和func3同时输出。我本来期望等待5秒让func2打印出来,然后再等待12秒让func3打印出来,但事实并非如此。
有人能看出这里有什么问题吗?提前感谢。
#define ONE_SEC 1000000000/3
void wait(int);
void func1(void(*)(), void(*)());
void func2();
void func3();
int main()
{
std::cout<<"In Main Program!!"<<std::endl;
void (*funcPtr2)();
void (*funcPtr3)();
funcPtr2 = func2;
funcPtr3 = func3;
func1(funcPtr2, funcPtr3);
return 0;
}
void func1(void (*fptr2)(), void (*fptr3)())
{
std::cout<<"In function one!!"<<std::endl;
(*fptr2)();
(*fptr3)();
}
void func2()
{
wait(5);
std::cout<<"In function 2 - callback function!!"<<std::endl;
}
void func3()
{
wait(20);
std::cout<<"In function 3 - callback function!!"<<std::endl;
}
void wait (int secs)
{
long j;
long i;
for (i = 0; i < secs * (ONE_SEC); i++)
{
j++;
}
}
既然你重新发明的轮子不工作,试试这个:
#include <iostream>
#include <thread>
#include <chrono>
int main()
{
std::cout << "yo" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
std::cout << "whats" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(5));
std::cout << "up" << std::endl;
std::cin.get();
return 0;
}
如果在windows操作系统上不能设置,请选择Sleep(seconds),否则在unix上执行ussleep
试试这个
#include <iostream>
#include <stdlib.h>
#include <time.h>
void wait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}
void func1(void(*)(), void(*)());
void func2();
void func3();
int main()
{
std::cout<<"In Main Program!!"<<std::endl;
void (*funcPtr2)();
void (*funcPtr3)();
funcPtr2 = func2;
funcPtr3 = func3;
func1(funcPtr2, funcPtr3);
return 0;
}
void func1(void (*fptr2)(), void (*fptr3)())
{
std::cout<<"In function one!!"<<std::endl;
(*fptr2)();
(*fptr3)();
}
void func2()
{
wait(5);
std::cout<<"In function 2 - callback function!!"<<std::endl;
}
void func3()
{
wait(20);
std::cout<<"In function 3 - callback function!!"<<std::endl;
}
假设您必须实现自己的wait
函数,并且不调用更合理的this_thread::sleep_for
或针对clock()
实现的检查之一,那么下面的代码(您的代码)具有未定义的行为,因为您从未初始化j
:
void wait (int secs)
{
long j;
long i;
for (i = 0; i < secs * (ONE_SEC); i++)
{
j++;
}
}
基本类型(int
, long
, bool
, char
)需要默认初始化,因为它们没有构造函数(它们不是c++中的实际类)。(当变量存在于文件/命名空间作用域中时,它将被零初始化,但这种情况很少发生)。因此,简单地将j
设置为0
将摆脱您的未定义行为:
void wait (int secs)
{
long j = 0;
long i;
for (i = 0; i < secs * (ONE_SEC); i++)
{
j++;
}
}
但这有点多余,不是吗?下面的内容不一样吗?
void wait (int secs)
{
for (size_t i = 0; i < secs * (ONE_SEC); i++)
{}
}
然而,这样做的问题是,除非ONE_SEC
和secs
是在编译时或运行时根据您的系统确定的,否则几乎无法保证您的程序将等待指定的时间。随着硬件的改进,等待的时间会越来越少。
最后,我想说使用现在标准的this_thread::sleep_for()
,就像另一个用户早些时候发布的那样:
#include<thread>
#include<chrono>
// ...
void wait (int secs)
{
std::this_thread::sleep_for(std::chrono::seconds(secs));
}
相关文章:
- Visual Studio中的函数声明和函数定义问题
- C++quit()函数中可能存在作用域问题
- 类似于strcat()的函数出现问题
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 类C++中的函数问题(LNK2019和LNK1120错误)
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 关于简单C++函数(is_palindrome)的逻辑的问题
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- constexpr构造函数需要常量成员函数时出现问题
- 添加存储在向量中的大整数的函数出现问题
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 关于 c++ 函数中指针赋值的简单问题
- 如何在标头中声明(或定义)函数的问题
- 有关 c++ 构造函数的问题
- 模板类转换问题 - 无法推断调用的函数
- 从 C++ 中的函数返回数组地址问题
- 关于复制构造函数的一个棘手问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题