- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关键是只说w c,因为我对C更满意。
我不希望有一个示例说明它是如何工作的……我希望是为什么我们应该使用Call back函数或有人将其用作函数指针。
我也关注了许多博客和堆栈溢出问题,但对这些答案都不满意。
比方说(我在这里建议一种情况,例如排序),我们应该使用回调方法,其中方法/函数将花费更多时间进行处理。
假设一个进程只有一个线程,并且程序正在执行排序,这将花费大量时间(假设> 1分钟)。根据众多博客作者的说法,我们应该使用函数指针。但是,它将如何有用呢?
不管我们如何只有一个程序计数器,我们都会从CPU中获得一些时间来处理该进程,那么它将如何有用呢?
如果您认为还有其他示例可以解释函数指针的概念,请提供示例。
我看到一些提示,例如,如果您将使用函数指针,则可以稍后收集结果,但这听起来确实很尴尬!即使有可能怎么办?从函数返回后,如何从函数中收集内容?该功能将被销毁!
实时人们可以使用它来进行事件的任何更改,以便他们可以收到通知...(只需添加一个点)
我已经看到一些优秀的程序员使用此函数指针,我很想知道我为什么要使用它,当然这里有些我想念的东西...
请回复,在此先感谢。
最佳答案
由于您的上一则评论仍有一些不真实之处,因此也许有一个具体的例子来说明这些要点会有所帮助。让我们从一个简单的示例开始,该示例从命令行使用字符串作为用户输入(您也可以提示用户输入)。现在,我们要给用户提供选项,以告诉我们他们如何存储输入。就本示例而言,假设选项为(1)正常存储字符串,以使其水平打印在一行上;(2)存储与之相反的字符串,该字符串也将打印在一行上,(3)存储在每个字符后带有换行符的字符串,以便垂直打印;(4)将字符串与嵌入的换行符反向存储。
在解决此问题的常规方法中,您可能会编写一个switch
语句或一系列else if
语句,然后将字符串传递给4个不同的例程来处理不同的情况。函数指针使您可以稍微不同地解决问题。而不是使用4个不同的输入例程来处理每种情况,为什么不使用1个以函数指针作为参数并根据作为参数传递的函数来更改其处理字符串的方式的输入例程。输入例程可以很简单,例如复制字符串(防止修改argv[1]
等),然后将字符串作为参数传递给指针表示的函数:
/* make copy of original string, pass to callback function */
char *input (char *d, char *s, char *(*cbf)(char *))
{
strcpy (d, s);
return (*cbf) (d);
}
input
函数将目标字符串
d
,源字符串
s
和指向函数
cbf
的指针作为参数(回调函数的缩写)。让我们快速看一下函数指针的语法,并了解它告诉我们的内容:
char *(*cbf)(char *)
| | \
return | argument
type | list
|
function pointer
name/label
cbf
的函数指针的返回类型为
char *
,并接受类型为
char *
的单个参数。 (注意:在函子指针参数列表中仅指定类型,而不是在类型和参数名称中都指定-例如,不
char *str
,仅
char *
)现在每次传递时似乎要键入很多该类型的函数作为参数或在赋值中使用。它是。有一个简单的解决方案可以减少所需的键入。您可以将
typedef
用作函数指针,类似于将
typedef
与结构等一起使用的方法。创建
typedef
类型的
cbf
同样容易:
typedef char *(*cbf)(char *);
cbf
类型,该类型可以在需要函数指针类型的任何地方代替
char *(*cbf)(char *)
使用。使用typedef时,无需指定返回类型和参数列表,而且不必将函数指针放在括号内。这样可以将原始函数声明减少为:
char *input (char *d, char *s, cbf fname)
{
strcpy (d, s);
return fname (d);
}
typedef
不仅简化了将函数作为参数进行传递,而且还简化了函数指针数组的创建。可以根据需要使用函数指针数组简化选择和传递给定数量的函数中的任何一个。对于我们的
input
函数,我们创建一个函数指针数组,每个函数指针指向一个不同的函数,这些函数可用于将输入字符串设置为所需的格式。例如,假设上述4个函数具有如下声明:
/* input processing callback functions */
char *hfwd (char *s);
char *hrev (char *s);
char *vfwd (char *s);
char *vrev (char *s);
char *
类型的指针定义匹配,并接受
char *
类型的单个参数。使用我们的
cbf
typedef,我们可以轻松地创建一个称为
fnames
的函数指针数组,如下所示:
cbf fnames[] = { &hfwd, &hrev, &vfwd, &vrev };
fnames
数组通过数组索引选择我们的任何函数。 (例如
fnames[0]
是我们的函数
hfwd
)现在,这使我们能够从用户那里输入第二个数字,即数字,以选择输入字符串的格式。通过简单地将所需函数的数组索引作为命令行的第二个参数,就可以使用我们的任何回调函数。例如,可以通过调用以下程序来指定任何一种功能:
./progname my_string 1 /* to process the input with the hrev */
typedef
的情况下的全功能指针语法,但已注释,因此您可以比较/对比
typedef
的使用)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXS 128
/* typedef for function pointer */
typedef char *(*cbf)(char *);
/* simple string reverse function */
char *strrevstr (char *str);
/* input processing callback functions */
char *hfwd (char *s);
char *hrev (char *s);
char *vfwd (char *s);
char *vrev (char *s);
/* input function, pointer to function will determine behavior */
// char *input (char *d, char *s, char *(*cbf)(char *));
char *input (char *d, char *s, cbf fn);
int main (int argc, char **argv) {
if (argc < 3 ) {
fprintf (stderr, "error: insufficient input, usage: %s string int\n", argv[0]);
return 1;
}
int idx = atoi(argv[2]);
if (idx > 3 || idx < 0) {
fprintf (stderr, "error: invalid input -- out of range, (0 !< %d !< 3)\n", idx);
return 1;
}
cbf fnames[] = { &hfwd, &hrev, &vfwd, &vrev };
// char *(*fnames[])(char *) = { &hfwd, &hrev, &vfwd, &vrev };
char string[MAXS] = {0};
input (string, argv[1], fnames[idx]);
printf ("\nProcessed input ('%s' '%s'):\n\n%s\n\n", argv[1], argv[2], string);
return 0;
}
/* strrevstr - reverse string, original is not preserved. */
char *strrevstr (char *str)
{
if (!str) {
printf ("%s() error: invalid string\n", __func__);
return NULL;
}
char *begin = str;
char *end = str + strlen (str) - 1;
char tmp;
while (end > begin)
{
tmp = *end;
*end-- = *begin;
*begin++ = tmp;
}
return str;
}
/* string unchanged - print horizontal */
char *hfwd (char *s)
{ return s; }
/* string reversed - print horizontal */
char *hrev (char *s)
{ return strrevstr (s); }
/* string unchanged - print vertical */
char *vfwd (char *s)
{
char *p = s;
static char buf[MAXS] = {0};
char *b = buf;
while (*p)
{
*b++ = *p++;
*b++ = '\n';
}
*b = 0;
b = buf;
while (*b)
*s++ = *b++;
*b = 0;
return buf;
}
/* string reversed - print vertical */
char *vrev (char *s)
{
char *p = strrevstr (s);
static char buf[MAXS] = {0};
char *b = buf;
while (*p)
{
*b++ = *p++;
*b++ = '\n';
}
*b = 0;
b = buf;
while (*b)
*s++ = *b++;
*b = 0;
return buf;
}
/* make copy of original string, pass to callback function */
char *input (char *d, char *s, cbf fn)
// char *input (char *d, char *s, char *(*cbf)(char *))
{
strcpy (d, s);
return fn (d);
// return (*cbf) (d);
}
$ ( for i in {0..3}; do ./bin/fnc_pointer my_string $i; done )
Processed input ('my_string' '0'):
my_string
Processed input ('my_string' '1'):
gnirts_ym
Processed input ('my_string' '2'):
m
y
_
s
t
r
i
n
g
Processed input ('my_string' '3'):
g
n
i
r
t
s
_
y
m
关于c - 仅回叫w'r't编程,为什么要使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29729093/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!