北落燕门

北落燕门 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织 xhizm.com/ 编辑
编辑

人是铁,饭是钢

个人动态

北落燕门 发布了文章 · 3月3日

C语言中fun1()和fun2(void)的区别

在一次C语言实训中我发现老师在对无参函数的书写中写成fun2(void)的形式,这引起了我的好奇心,我只知道fun1()和fun2(void)是两个无参函数,后者是C99中规定的,void的意思就是该函数不接受任何参数,但是我在使用的过程中除了对fun2传参会导致报错以外没有发现别的问题,所以就开始好奇为什么老师在实训时会特意在没有传参的函数里写上void。

经过谷歌搜索得到以下结论

(C) The difference between int main() and int main(void)

A common misconception for C programmers, is to assume that a function prototyped as follows takes no arguments:

int foo();

In fact, this function is deemed to take an unknown number of arguments. Using the keyword void within the brackets is the correct way to tell the compiler that the function takes NO arguments.

参考文章:https://faq.cprogramming.com/...

但是我还是不能理解到底为什么要这样定义,最后在抖音的一个博主(抖抖代码)那里得到了解答

以下是博主演示的代码:

#include<stdio.h>
int main(void){
    void fun1();
    void fun2(void);
    fun1();
    fun2();
    return 0;
}
void fun1(){
    printf("doudou \n");
}
void fun2(){
    printf("douodu 2\n");
}
/*
得到输出为:
doudou 
douodu 2
*/

在没有传入任何参数的情况下两者都是被正常运行的。

但是如果对fun1和fun2分别进行传参,其结果如下

//fun1
#include<stdio.h>
int main(void){
    void fun1();
    void fun2(void);
    fun1(888,999);
    // fun2();
    return 0;
}
void fun1(){
    printf("doudou \n");
}
void fun2(){
    printf("douodu 2\n");
}
//输出为
//doudou
#include<stdio.h>
int main(void){
    void fun1();
    void fun2(void);
    // fun1(888,999);
    fun2(888,999);
    return 0;
}
void fun1(){
    printf("doudou \n");
}
void fun2(){
    printf("douodu 2\n");
}
/*输出为
test.c:20:5: error: too many arguments to function 'fun2'
     fun2(888,999);
     ^~~~
test.c:18:10: note: declared here
     void fun2(void);
 */

由此得出,在对fun1()和fun2(void)传参时,fun2会直接报错中断程序的运行。如果不含参的函数不带void并进行传参的话,表面上不会有任何影响,但是在Linux或者Unix平台中函数的参数会被推入堆栈中,所以只要读取参数所推入的寄存器便可获得传入的参数

#include <stdio.h>
int main(void)
{
    void fun1();
    fun1(888, 999);
    return 0;
}
void fun1()
{
    register int sp1 asm("di"); //关联第一个参数
    register int sp2 asm("si"); //关联第二个参数
    printf("%d,%d", sp1, sp2);
}

0210303171256.png

20210303171808.png

研究这个问题花费了我三个小时,三个小时的时间也许可以让我学完一种特性或者几个语法糖,但是对这个小细节的求解却让我乐在其中。编程的魅力让我无法自拔。

查看原文

赞 0 收藏 0 评论 0

北落燕门 发布了文章 · 2月26日

Ubuntu下观看B站视频

在使用Ubuntu学习时想打开B站看视频结果发现未安装flash插件
image

方法一:安装Flash插件

点击下载Flash插件

image

之后在下载目录使用解压命令

tar-zx -f [flash插件压缩包名称]

解压之后将libpepflashplayer.so 文件复制到狐火的插件目录下(具体目录需要结合系统版本)

sudo cp libflashplayer.so /usr/lib/firefox-addons/plugins

之后更改flash插件的权限

sudo chmod 755 libpepflashplayer.so

之后重启系统

方法二:终端下载火狐插件

sudo apt-get update
sudo apt-get install flashplugin-installer

pass:如果出现这种情况

image

需要tab+enter键确定

最终得出结论还是windows看B站舒服

查看原文

赞 0 收藏 0 评论 0

北落燕门 发布了文章 · 2月26日

Xshell+Xftp管理服务器

在使用Xshell7和Xftp7管理本地VMware虚拟机的时候需要注意,VMware的虚拟网络vlan0和vlan8需要和本地IP在同一个网段才能连接的上;如果在使用ifconfig查询ip的时候提示了没有该命令,需要下载一个network-tool。
Xshell7和Xftp7可以申请个人免费使用

查看原文

赞 0 收藏 0 评论 0

北落燕门 发布了文章 · 2月26日

PIP切换镜像源

在学习python的时候安装库,因为网络的问题便出现这个问题如图,

image

经过百度得知要切换镜像源

使用如下代码

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

又出现新的问题

image

继续查找问题得知需要先切换到pip.exe所在的目录再进行切换镜像源

假设我的pip.exe在C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\Scripts这个地方
所以要先执行

cd C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\Scripts
查看原文

赞 0 收藏 0 评论 0

北落燕门 赞了回答 · 2020-07-23

解决池化报错问题

上面显示的 max_pool 应该是 4个维度,但是你传入的是两个维度 [3, 3],可以尝试把value的维度改为[1, 1, 3, 3].看看行不行

关注 2 回答 1

北落燕门 提出了问题 · 2020-07-23

解决池化报错问题

在池化时显示报错,附上代码求大佬解答image.pngimage.png

关注 2 回答 1

北落燕门 提出了问题 · 2020-07-23

卷积神经网络

image.png
主要问题是不知道怎么创建一个3*3的彩色图片,求大佬指点一下

关注 5 回答 2

北落燕门 赞了回答 · 2020-07-23

python遍历文件子目录并以字典形式输出

用py的pathlib库

from pathlib import Path

def scan_image_file(path):
    result={}
    dirList =  [str(x) for x in Path(path).iterdir() if x.is_dir()]
    for v in dirList:
        # Path('.').glob('*.jpg') 不使用递归
        result[v]=[str(i) for i  in Path(v).glob('**/*.jpg')]
    return result

# 用递归的形式扫描当下文件夹下子目录内的所有jpg文件
res = scan_image_file('.')
print(res)  

关注 2 回答 1

北落燕门 提出了问题 · 2020-07-22

python遍历文件子目录并以字典形式输出

QQ截图20200721185820.png
寻求大佬指点一下,主要存在的问题就是以字典的形式输出

关注 2 回答 1

北落燕门 收藏了文章 · 2020-07-21

斐波那契数列的四种实现

孔乙己自己知道不能和他们谈天,便只好向 Intern 说话。有一回对我说道,“你写过代码么?”我略略点一点头。他说,“写过代码,……我便考你一考。斐波那契数列的输出,怎样实现?”我想,讨饭一样的人,也配考我么?便回过脸去,不再理会。孔乙己等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些代码应该记着。将来做 Leader 的时候,开发项目要用。”我暗想我和 Leader 的等级还很远呢,而且我们 Leader 也从不在项目里写斐波那契;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是递归么?”孔乙己显出极高兴的样子,将两个指头的长指甲敲着键盘,点头说,“对呀对呀!……斐波那契有四样写法,你知道么?”我愈不耐烦了,努着嘴走远。孔乙己刚在命令行打开 Vim,想在里面写代码,见我毫不热心,便又叹一口气,显出极惋惜的样子。
(改编自 鲁迅《孔乙己》)

在家闲着也是闲着,不如我们来看看,如何写一个输出斐波那契数列的代码吧。

先说下,什么是 斐波那契数列

斐波那契(Fibonacci)数列,又称黄金分割数列,因数学家列昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:

1、1、2、3、5、8、13、21、34……

在数学上,斐波那契数列以如下被以递推的方法定义:

F(1) = 1

F(2) = 1

F(n) = F(n - 1) + F(n - 2) (n ≥ 3,n ∈ N*)

简单来讲就是:数列中 某一项的值,等于它的前一项加上前前一项的和

在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。(摘自 百度百科)

我曾经也把手写斐波那契作为面试题之一。

1. 递归

在编程教程中提到斐波那契数列,通常都是用来讲解递归函数。当一个关于 N 的问题可以转换为关于 N - k 的同样问题时,它就可以尝试用递归的思路来解决。



 def fib_1(n):
  if n <= 1:
      return 1
  return fib_1(n-1) + fib_1(n-2)

for i in range(20):
    print(fib_1(i), end=' ')

2. 循环

但斐波那契并非一定要用递归实现。事实上,所有的递归都可以用循环来实现。



def fib_2(n):
    a, b = 0, 1
    for i in range(n):
        print(b, end=' ')
        a, b = b, a + b

fib_2(20)

3. 生成器

用生成器的思路本质来说和上面的循环是一样的,只是实现的时候用了 yield



def fib_3(n):
    a, b = 0, 1
    while n > 0:
        yield b
        a, b = b, a + b
        n -= 1

for i in fib_3(20):
    print(i, end=' ')

4. 矩阵相乘

此方法的原理是利用二阶矩阵的相乘:



import numpy as np

def fib_4(n):
    for i in range(n):
        res = pow(np.matrix([[1, 1], [1, 0]], dtype='int64'), i) * np.matrix([[1], [0]])
        print(int(res[0][0]), end=' ')

fib_4(20)

上述 4 种方法的输出结果都是:



1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

斐波那契数列的实现方法并不仅这 4 种。如果你有其他的实现,欢迎在留言中补充。

------

一起学,走得远!

欢迎搜索: Crossin的编程教室

查看原文

认证与成就

  • 获得 0 次点赞
  • 获得 3 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 3 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2020-07-21
个人主页被 431 人浏览