应该比俺强。
俺没啥文化, 初中毕业, 大伙都知道。
俺人到中年才开始学 C/C++, 同时仿照别人的代码复制了一个 LINUX 下的录音程序。俺的录音程序已经完成, LINUX 下可以运行, 放在这里供大家免费下载:能生成 RAW 以及 WAV 文件。
https://1eq.ca/wp-content/uploads/2021/02/wxrec_done_64bit_linux.zip
当然, 学习是快乐的。每天都有新的发现和快乐。
上世纪末,MCSE 和 CCIE 考证很火的时候, 成都就有中学生考了 MCSE 和 CCIE。 相信这个孩子现在也是年薪百万了吧。
家长的鼓励和引导是很重要的。等孩子上了大学, 他们的地平线就更广了。就不需要大人来指手画脚了。
*** 备注: 俺 15~16 岁就过了六级, 所以写了这篇回答
FIFO 俺也照抄了一个, 把别人的变量名换成自己的就可以了。
基本上也是初中水平。
// CB_WENXUE.c // // A SIMPLE CIRCULAR BUFFER EXAMPLE // // LICENSE : WTFPL // #include <stdio.h> #include <pthread.h> #include <unistd.h> //sleep() is from here #include <malloc.h> #include <sched.h> #include <string.h> #include <stdbool.h> #include <stdint.h> #define DATACAP 16 typedef struct cbuff{ float rt_arr[DATACAP]; int dhead_p; //实际上是 GLOBAL 全局计数器 int dtail_p; int dqlen; }*RQB; struct cbuff *init_cb(void){ struct cbuff *cbStru_ptr = NULL; cbStru_ptr = (struct cbuff *)malloc(sizeof(struct cbuff)); if(cbStru_ptr == NULL) { puts("init_cb: Mem alloc error!
"); return NULL;} cbStru_ptr->dhead_p = 0; cbStru_ptr->dtail_p = 0; cbStru_ptr->dqlen = 0; return cbStru_ptr; } // KEEP IT SIMPLE int isfull_cb(struct cbuff *cbStru_ptr){ return (cbStru_ptr->dqlen == DATACAP) & (cbStru_ptr->dhead_p == cbStru_ptr->dtail_p ); } int isempt_cb(struct cbuff *cbStru_ptr){ return (cbStru_ptr->dqlen != DATACAP) & (cbStru_ptr->dhead_p == cbStru_ptr->dtail_p) ; } int isXrun_cb(struct cbuff *cbStru_ptr){ return (cbStru_ptr->dqlen !=0) & (cbStru_ptr->dhead_p == cbStru_ptr->dtail_p ); } // Delete one element from Data Queue int poll_cb(struct cbuff *cbStru_ptr) { if( isempt_cb(cbStru_ptr) ) { puts("poll_cb: buffer queue is empty"); return -1;} else { cbStru_ptr->rt_arr[ (cbStru_ptr->dhead_p + 1) % DATACAP ] ; cbStru_ptr->dqlen = cbStru_ptr->dqlen -1 ; } return 0 ; } int put_cb(struct cbuff *cbStru_ptr, float rt_data) { if( isfull_cb(cbStru_ptr) ) { puts("put_cb: buffer queue is full. Overwriting data.
"); cbStru_ptr->rt_arr[ cbStru_ptr->dtail_p % DATACAP ] = rt_data; printf (" put_cb:data %f , stored to pos--> %d
", rt_data, (cbStru_ptr->dtail_p) ); cbStru_ptr->dtail_p = (cbStru_ptr->dhead_p +1) % DATACAP ; cbStru_ptr->dhead_p = (cbStru_ptr->dhead_p +1) % DATACAP ; cbStru_ptr->dqlen = DATACAP ; printf ("put_cb:data queue Head ----------------->>> %d
", cbStru_ptr->dhead_p ); printf ("put_cb:data queue Tail ------------------->>> %d
", cbStru_ptr->dtail_p ); printf ("put_cb:data queue Length-------->>> %d
", cbStru_ptr->dqlen ); return -10089; } else { cbStru_ptr->rt_arr[ (cbStru_ptr->dtail_p) % DATACAP ] = rt_data; printf ("put_cb:data %f , stored to pos--> %d
", rt_data, (cbStru_ptr->dtail_p) ); cbStru_ptr->dtail_p = (cbStru_ptr->dtail_p +1) % DATACAP ; //cbStru_ptr->dqlen = cbStru_ptr->dqlen +1 ; cbStru_ptr->dqlen = cbStru_ptr->dqlen +1 ; printf ("put_cb:data queue Head -------------------> %d
", cbStru_ptr->dhead_p ); printf ("put_cb:data queue Tail ---------------------> %d
", cbStru_ptr->dtail_p ); printf ("put_cb:data queue Length----------> %d
", cbStru_ptr->dqlen ); return 0 ; } } float get_cb(struct cbuff *cbStru_ptr, float rt_data ) { if(isempt_cb(cbStru_ptr) ) { puts("
get_cb:buffer empty :p
"); return -10086; } else { rt_data = cbStru_ptr->rt_arr[ cbStru_ptr->dhead_p % DATACAP ]; cbStru_ptr->dhead_p = (cbStru_ptr->dhead_p +1) % DATACAP ; cbStru_ptr->dqlen = (cbStru_ptr->dqlen -1) % DATACAP; return rt_data; } } // Clear the Data Queue int reset_cb(struct cbuff *cbStru_ptr) { cbStru_ptr->dhead_p = 0; cbStru_ptr->dtail_p = 0; cbStru_ptr->dqlen =0; printf( "
reset_cb: Address of Array:%p, Array pointer Size:%d
", cbStru_ptr, sizeof(cbStru_ptr->rt_arr)); return 0; } int gc_cb(struct cbuff *cbStru_ptr) { if(cbStru_ptr == NULL) { puts("gc_cb: pointer null
"); return -1; } free(cbStru_ptr); return 0; } /////////////////////////////////////////////////////////////////////////////////// int main() { float test_input = 0.111111, ret_float; int ret_err; RQB my_cbuff_ptr; my_cbuff_ptr = init_cb(); reset_cb(my_cbuff_ptr) ; printf ("
Size of CBStruct:%d
", sizeof(struct cbuff)); //testing for(int i = 0;i< 50;i++) { ret_err = put_cb(my_cbuff_ptr, i * test_input) ; if(ret_err==0 ) { printf("
Attempt %d: %10.5f <<<<<<<<<<ERROR: %d <<<<<<<<<<<<<<<<<<< Data to inject
", (i+1), i * test_input , ret_err); printf("Data queue Length: %d:
", my_cbuff_ptr->dqlen ); printf("Data injected: %f:
", my_cbuff_ptr->dhead_p ); } else { printf("
Attempt %d: %10.5f <<<<<<<<<<ERROR: %d <<<<<<<<<<<<<<<<<<< Data to inject
", (i+1), i * test_input, ret_err); printf("Data queue Length: %d:
", my_cbuff_ptr->dqlen ); printf("Data injected: %f:
", my_cbuff_ptr->dhead_p ); printf (" Error: %d
", ret_err); } } sleep(1); for(int i = 0;i<32;i++) { ret_float = get_cb(my_cbuff_ptr, ret_float); printf("
get attempt %d ---> %10.5f
", (1+i), ret_float); } //testing 2 for(int i = 0;i< 16;i++) { ret_err = put_cb(my_cbuff_ptr, i * test_input) ; if(ret_err==0 ) { printf("
Test2 try %d: %10.5f <<<<<<<<<<ERROR: %d <<<<<<<<<<<<<<<<<<< Data to inject
", (i+1), i * test_input , ret_err); printf("Data queue Length: %d:
", my_cbuff_ptr->dqlen ); printf("Data injected: %f:
", my_cbuff_ptr->dhead_p ); } else { printf("
Test2 try %d: %10.5f <<<<<<<<<<ERROR: %d <<<<<<<<<<<<<<<<<<< Data to inject
", (i+1), i * test_input, ret_err); printf("Data queue Length: %d:
", my_cbuff_ptr->dqlen ); printf("Data injected: %f:
", my_cbuff_ptr->dhead_p ); printf (" Error: %d
", ret_err); } } sleep(1); for(int i = 0;i<16;i++) { ret_float = get_cb(my_cbuff_ptr, ret_float); printf("
get attempt %d ---> %10.5f
", (1+i), ret_float); } gc_cb(my_cbuff_ptr); return 0; }
还有波形文件的头结构。俺也自创了一个, 其实也不能说自创, 是按照 HEX EDITOR 和 RIFF 文档自己凿了一个。
初中水平其实不丢人。
俺经常说的,
知识就是力量, 初中知识也是力量。
//////////////////////////////////////
俺知乎阅读总量只有 0.7亿 没跨出一小步 (n<1亿)。盐值低迷(3年过去了还900+)希望长点盐值。俺的回答您当笑话看看就算了。
“老麦, 大家都说你是笑话、论坛孤儿和神棍。”
“没错。 只有百万分之0.5的读者赞同俺的观点。”
你的github用户名呢?talk is cheap...
另外真正的Newtype这时候应该在整汇编了。这几天为了做个简单的改版而正在通读去年泄露的GBC塞尔达传说:织梦岛DX源码,太痛苦了。。。。
Linus Torvalds 可能熟练的语言只有 c,但是这并不影响他是程序员大神,现在随便一个培训班出来的学生简历上的语言就不止五种,估计远远超过 Donald Knuths 所会的语言,可是人家仍然能把你秒的渣都不剩。
外行理解问题的时候,总倾向于把一个人在一个领域的能力粗暴降维,变成用一个数字可以衡量的东西:写过几行代码,会几种语言, 这让我想起了之前看到的一些新闻,比如 四岁的孩子会背一百首唐诗,五岁的孩子会背圆周率前两千位,这些都是一种倾向于把能力坍缩成一个非常粗浅的衡量标准上,粗浅到和能力已经没有什么关系了。
我在油管上看过 Linus 的一个高校的演讲视频,里面有说到他看 c 代码的时候,他就知道这段代码对应的汇编长什么样,所以他可以通过调整代码的写法来让 cpu 的 cache miss 尽可能的少,从而提升代码的运行速度,我想请问这位初一的同学是否能做到?
为了明白 c 语言和汇编的关系,你需要学习编译原理,为了搞明白编译后的二进制是如何跑在 CPU 上的,你需要学习计算机组成原理,甚至计算机体系结构,而为了给出高性能的代码,你需要会计算你的代码复杂度,并且选择合适的数据结构和算法,这又需要算法和数据结构的知识,而算法和数据结构本身又会用到很多离散数学的基础知识,知识是一个相互依存的网络,而为了搞明白 c 库和系统调用的关系,还有内存分配的原理,你又需要学习操作系统的知识,而刚刚提到的这几门课,恰恰就是计算机专业的核心课程。
搜索引擎有一个判断网页权威性的算法,大概就是根据网站之间的相互引用来的,如果把每个 webpage 比作一个节点,a 引用了 b,就从 a 向 b 连一条边,于是就得到了一个有向图,而那些被其它网页引用的网页,就倾向于有更高的权威性,知识网络也同样如此。
入度高的知识更有学习价值,所有编程语言的标准库都涉及到数据结构,也就是说所有编程语言的节点都指向数据结构,数据结构在知识网中是一个炽热发光的热点。
虽然知识点是网,各个节点之间相互依存,但是总有几个节点,它们的入度极大,这些知识分块合并,就成为了所谓的专业核心课程。
所以还是建议大家多花点时间学习核心课程,在此基础上争取多听多看,培养兴趣,找到喜欢的方向,持续发力,这样的人一定会成长为不可或缺的人才。
楼主说的学会到底是什么程度呢?入门还是精通?如果是精通的话,超过的可不只是同龄人呢,很多工作的人都表示你厉害吧!
给大家拜个晚年:
请允许我用22种编程语言,祝大家新年快乐
C语言:printf("祝大家新年快乐");
C++ : cout<<"祝大家新年快乐";
OC: NSLog(@"祝大家新年快乐")
QBasic : Print "祝大家新年快乐"
Asp : Response.Write "祝大家新年快乐"
PHP : echo "祝大家新年快乐";
JScript: alert("祝大家新年快乐")
VBScript:MsgBox "祝大家新年快乐"
Jscript:document.write("祝大家新年快乐")
Delphi: ShowMessage('祝大家新年快乐!');
VB: Print "祝大家新年快乐!"
VC: MessageBox("祝大家新年快乐!");
shell: echo 祝大家新年快乐
perl: print '祝大家新年快乐'
java: System.out.println("祝大家新年快乐");
powerBuilder:messagebox("祝大家新年快乐")
C#:System.Console.WriteLine("祝大家新年快乐!")
COBOL:DISPLAY '祝大家新年快乐!
Python:print("祝大家新年快乐!")
AS:Alert.show("祝大家新年快乐!");
Foxpro: ? 【祝大家新年快乐!】
DOS 批处理: echo 祝大家新年快乐
易语言:信息框(“祝大家新年快乐!”,,64)
冒泡排序,选择排序,插入排序,快速排序,堆排序,归并排序,希尔排序,桶排序,基数排序新年帮您排忧解难。
有向图,无向图,有环图,无环图,完全图,稠密图,稀疏图,拓扑图祝您新年宏图大展。
最长路,最短路,单源路径,所有节点对路径祝您新年路路通畅。
二叉树,红黑树,van Emde Boas树,最小生成树祝您新年好运枝繁叶茂。
最大流,网络流,标准输入流,标准输出流,文件输入流,文件输出流祝您新年顺顺流流。
线性动规,区间动规,坐标动规,背包动规,树型动归为您的新年规划精彩。
散列表,哈希表,邻接表,双向链表,循环链表帮您在新年表达喜悦。
O(1), O(log n), O(n), O(nlog n), O(n^2), O(n^3), O(2^n), O(n!)祝大家新年渐进步步高。
1、算
2、这并没有什么卵用,我小学就超越同龄人了,沉湎于这种虚幻的成就感没有什么屁用,能享受编程的乐趣而不是装X的乐趣才是最重要的。
“地球大气中的云”整体上不符合学术界现在使用的任何生物定义,但是云中有一些微生物存在。
地球微生物跟随每年升入大气层的数亿吨灰尘、大量水汽和人造污染物加入大气环流,蔓延至平流层顶到电离层中部;少数微生物长期生活在卡门线外,俄罗斯宇航员在国际空间站外表面发现的海洋微生物证明有极少数地球微生物自然到达近地轨道[1]。
美国科学家曾经从加勒比海、美国内陆和加利福尼亚上空一万米高度的空气里收集到来自314个物种的数万个微生物样本,计算显示一万米高的对流层里每立方米空气存在约5100个细菌细胞、数十个真菌孢子,其中60%以上的微生物是活着的。普遍发现的17种细菌包括可以代谢草酸的类型,大气细颗粒物和水滴里的草酸可能允许它们在大气里活跃地生存。
在云的高度存在比这还要多的微生物,它们可以参与天气活动。微生物的大小与结构允许水蒸气在它们周围聚集成小水滴或冰晶,进而形成云。就是说,云中不但存在微生物,有些云还是微生物造出来的。
地表存在的致病微生物也能被热带气旋带到云里长距离漂流。热带气旋作为大型耗散系统可以谈一谈Lyfe之类天体生物学上的生物定义。
谁希望中国完蛋?
除了美国,当然就是类似于丰县官员这样的中国人
如果中国烂了,他们的所作所为再过几辈子也不会为人所知,而且还习以为常,甚至自动给他们洗白
所以中国人民的对手有国界可分的一部分敌人,还有一部分是自己人
中国能否强盛,很大程度上要看会不会识别出这样的内部渣滓,还有如何处理这些渣滓
所以别有用心的人就会故意的利用国籍来个神神兔兔对立,来个把水搅混
年轻人请不要上当
美国完了就是完了,中国做的不好的地方该骂一样骂
要记住敌人要用阶级分类,而不是国籍分类
故意把阶级问题转换成国家问题的,不是蠢就是坏