小冥冥 发表于 2019-12-3 19:48:54

c语言函数指针和指针函数的问题


按函数指针的课后习题改的,编译能过,运行时会跳出问题,非常疑惑
直接fp=add等是可以运行的
#include<stdio.h>
float add(float, float);
float sub(float, float);
float mul(float, float);
float chu(float, float);
float (*sellect(char op))(float, float);
float calc(float*fp(float,float),float ,float);

float add(float num1, float num2)
{
      return num1 + num2;
}

float sub(float num1, float num2)
{
      return num1 - num2;
}

float mul(float num1, float num2)
{
      return num1 * num2;
}

float chu(float num1, float num2)
{
      return num1 / num2;
}
float (*sellect(char op))(float, float)
{
      switch ('op')
      {
      case'+':return add;
      case'-':return sub;
      case'*':return mul;
      case'/':return chu;
      default:
                return 0;
      }
}

float calc(float(* fp)(float, float), float num1, float num2)
{
//      return (*fp)(num1, num2);
}

int main(void)
{
      float num1, num2;
      char op;
      float(*fp)(float,float);
      printf("请输入+-*/的算法式例如(3+5)\n");
      scanf("%f%c%f",&num1,&op,&num2);
      fp = sellect(op);

      printf("%f%c%f=%f", num1, op, num2,(*fp)(num1,num2));//在本行跳出0x00000000 处(位于 Project1.exe 中)引发的异常: 0xC0000005: 执行位置 0x00000000 时发生访问冲突
      return 0;
}

bin554385863 发表于 2019-12-3 19:48:55

本帖最后由 bin554385863 于 2019-12-5 13:00 编辑

小冥冥 发表于 2019-12-5 12:48
都不懂的话不如等待一个会的,而不是来这里跟我口嗨

指出你不写注释就口嗨?
厉害啊,我竟无言以对!!!NX
#include <stdio.h>
float add(float a, float b)//计算加法
{
    return a + b;
}
float sub(float a, float b)//计算减法
{
    return a - b;
}
float mul(float a, float b)//计算乘法
{
    return a * b;
}
float div(float a, float b)//计算除法
{
    return a / b;
}
float (*sellect(char op))(float, float)//返回指定类型的函数指针
{
    float (*funcptr)(float, float);
    switch (op)
    {
    case '+':
      funcptr = add;
      break;
    case '-':
      funcptr = sub;
      break;
    case '*':
      funcptr = mul;
      break;
    case '/':
      funcptr = div;
      break;
    }
    return funcptr;
}
float calc(float a, char op, float b, float (*funcptr)(float, float))//计算函数
{
    funcptr = sellect(op);
    return funcptr(a, b);
}
int main(int argc, char const *argv[])
{
    float a = 5, b = 7;
    char s = '+';
    float (*funcptr)(float, float);
    calc(a, s, b, funcptr);
    printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
    s = '-';
    calc(a, s, b, funcptr);
    printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
    s = '*';
    calc(a, s, b, funcptr);
    printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
    s = '/';
    calc(a, s, b, funcptr);
    printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
    return 0;
}

================================================
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode\Code>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.2\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-3xhsedah.zwn --stdout=Microsoft-MIEngine-Out-4exwmvoh.unt --stderr=Microsoft-MIEngine-Error-5cj4vc0c.jga --pid=Microsoft-MIEngine-Pid-ckhutod3.xho --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
5.00 + 7.00 = 12.00
5.00 - 7.00 = -2.00
5.00 * 7.00 = 35.00
5.00 / 7.00 = 0.71

E:\Users\admin\Documents\VScode\Code>

a1163675107 发表于 2019-12-3 23:59:29

小冥冥 发表于 2019-12-4 15:17:26

a1163675107 发表于 2019-12-3 23:59
提问的时候注意姿势,这么长一串代码一个注释都没有..

这个是小甲鱼课上的代码....

bin554385863 发表于 2019-12-4 15:54:00

小冥冥 发表于 2019-12-4 15:17
这个是小甲鱼课上的代码....

所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说明你根本没有看懂这个代码的逻辑

18113397842 发表于 2019-12-4 22:46:22

想要作业,能给我份吗,给你红包

小冥冥 发表于 2019-12-5 09:16:47

bin554385863 发表于 2019-12-4 15:54
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说 ...

对不起,没想到这话戳你G点了,我这些都看得懂,这个程序在我看来printf级别基础的,觉得不需要写注释的.抱歉.

小冥冥 发表于 2019-12-5 09:17:18

bin554385863 发表于 2019-12-4 15:54
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说 ...

哦对了,书上我也学,也有的

小冥冥 发表于 2019-12-5 09:20:18

bin554385863 发表于 2019-12-4 15:54
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说 ...

如果你有书都还不知道这个代码,还来这里口嗨,那就有点意思了哦,我只是想解决问题而已.

小冥冥 发表于 2019-12-5 09:21:08

18113397842 发表于 2019-12-4 22:46
想要作业,能给我份吗,给你红包

你也学到这里来了吗?
太难搞这部分了

小冥冥 发表于 2019-12-5 09:25:43

#include<stdio.h>
float add(float, float);
float sub(float, float);
float mul(float, float);
float chu(float, float);//分别是加减乘除计算函数
float (*sellect(char op))(float, float);//挑选函数返回一个带两个float型整型参数的指针函数
float calc(float*fp(float,float),float ,float);//实现直接返回对应指针函数的计算

float add(float num1, float num2)
{
      return num1 + num2;
}

float sub(float num1, float num2)
{
      return num1 - num2;
}

float mul(float num1, float num2)
{
      return num1 * num2;
}

float chu(float num1, float num2)
{
      return num1 / num2;
}
float (*sellect(char op))(float, float)
{
      switch ('op')
      {
      case'+':return add;
      case'-':return sub;
      case'*':return mul;
      case'/':return chu;
      default:
                return 0;
      }
}

float calc(float(* fp)(float, float), float num1, float num2)
{
//      return (*fp)(num1, num2);
}

int main(void)
{
      float num1, num2;
      char op;
      float(*fp)(float,float);//定义了一个带两个浮点型的函数指针
      printf("请输入+-*/的算法式例如(3+5)\n");
      scanf("%f%c%f",&num1,&op,&num2);//输入
      fp = sellect(op);

      printf("%f%c%f=%f", num1, op, num2,(*fp)(num1,num2));//在本行跳出0x00000000 处(位于 Project1.exe 中)引发的异常: 0xC0000005: 执行位置 0x00000000 时发生访问冲突
      return 0;
}

bin554385863 发表于 2019-12-5 12:21:47

本帖最后由 bin554385863 于 2019-12-5 12:53 编辑

小冥冥 发表于 2019-12-5 09:16
对不起,没想到这话戳你G点了,我这些都看得懂,这个程序在我看来printf级别基础的,觉得不需要写注释的.抱歉 ...

用我给你发一份C/C++ primer第六版电子版么,好好看一看有没有这个代码?
既然看懂了,还会有疑惑?
论坛提问规范不是给你看的?

小冥冥 发表于 2019-12-5 12:47:32

麻烦大佬别气了,能解答的话帮忙看一下,谢谢大佬了。
不然就也别不懂装懂了

小冥冥 发表于 2019-12-5 12:48:42

都不懂的话不如等待一个会的,而不是来这里跟我口嗨

小冥冥 发表于 2019-12-5 13:04:46

bin554385863 发表于 2019-12-3 19:48
指出你不写注释就口嗨?
厉害啊,我竟无言以对!!!NX
自己对比一下哪里有问题


不愧是大佬,冒犯了,我这个先设你为正确答案,希望能解释下我的那个的错误原因,我有另开一个帖子,我这个代码设计为能由用户自由输入并计算例如我输入3+5便显示3+5=8(这里我拿整形举个例子),输入3-5便显示3-5=-2,我在代码后面有补充,我直接复制fp=add是可以实现的,但是采用函数指针为返回值却出现问题,希望能解释下这个,您这个代码我是知道的,相当于我那个直接赋值,是可以运行的

bin554385863 发表于 2019-12-5 14:12:41

小冥冥 发表于 2019-12-5 13:04
不愧是大佬,冒犯了,我这个先设你为正确答案,希望能解释下我的那个的错误原因,我有另开一个帖子,我这 ...

既然大姐头指出问题所在了,我也就不班门弄斧了。
其实,加注释是个好习惯,写注释的时候就顺便把代码检查了。而且等你代码多的时候后不写注释,时间长了自己都会不知道自己写的啥意思!
页: [1]
查看完整版本: c语言函数指针和指针函数的问题