• 关于

    INT10H怎么用

    的搜索结果

回答

递归4—递归的弱点 之所以没有把这段归为算法的讨论,因为这里讨论的不在是算法,而只是讨论一下滥用递归的不好的一面。 递归的用法似乎是很容易的,但是递归还是有她的致命弱点,那就是如果运用不恰当,滥用递归,程序的运行效率会非常的低,低到什么程度,低到出乎你的想像。当然,平时的小程序是看不出什么的,但是一旦在大项目里滥用递归,效率问题将引起程序的实用性的大大降低。 例子:求1到200的自然数的和。 第一种做法: #include <stdio.h> void main() { int i; int sum=0; for(i=1;i<=200;i++) { sum+=i; } printf("%d\n",sum); } 该代码中使用变量2个,计算200次。再看下个代码: #include <stdio.h> int add(int i) { if(i==1) { return i; } else { return i+add(i-1); } } void main() { int i; int sum=0; sum=add(200); printf("%d\n",sum); } 但看add()函数,每次调用要声明一个变量,每次调用要计算一次,所以应该是200个变量,200次计算,对比一下想想,如果程序要求递归次数非常多的时候,而且类似与这种情况,我们还能用递归去做吗。这个时候宁愿麻烦点去考虑其他办法,也要尝试摆脱递归的干扰。 21:21 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它 | 计算机与 Internet 程序算法5—递归3—递归的再次挖掘 递归的魅力就在于递归的代码,写出来实在是太简练了,而且能解决很多看起来似乎有规律但是又不是一下子能表达清楚的一些问题。思路清晰了,递归一写出来问题立即就解决了,给人一重感觉,递归这么好用。我们在此再更深的挖掘一下递归的用法。 之前再强调一点,也许有人会问,你前边的例子用递归似乎是更麻烦了。是,是麻烦了,因为为了方便理解,只能举一些容易理解的例子,一般等实际应用递归的时候,远远不是这种状态。 好了我们现在看一个数字的序列;有一组数的集合{1,2,4,7,11,16,22,29,37,46,56……}我故意多给几项,一般是只给前4项让你找规律的。序列给了,要求是求前50项的和。规律。有。还是没有。一看就象有,但是又看不出来,我多给了几项,应该很快看出来了,哦,原来每相邻的两项的差是个自然数排列,2-1=1,4-2=2,7-4=3,11-7=4,16-11=5…… 好了,把规律找出来了,一开始可能觉得没头绪,没问题,咱们把这个序列存放到一个数组总可以吧。那我们就声明一个数组,存放前50个数据,一个一个相加总可以了。于是有了下边的写法: #include <stdio.h> void main() { int i,a[50],sum=0; a[0]=1; for(i=1;i<50;i++) { a[i]=a[i-1]+i; } for(i=0;i<50;i++) { sum+=a[i]; } printf("%d\n",sum); } 好了,代码运行一下,结果出来了,正确不正确呢。自己测试吧,把50项改成1、2、3、4、5……项,试试前多少项是不是正确,虽然这不是正确的测试方法,但是的确是常用的测试方法。 等到这个代码已经完全理解了,完全明白了正个计算过程,我们就应该对这段代码进行改写优化了,毕竟这个代码还是不值得用一个数组的,那么我们尝试着只用变量去做一下: #include <stdio.h> void main() { int i; int number=1; int sum=0; for(i=0;i<50;i++) { number+=i; sum+=number; } printf("%d\n",sum); } 不知道我这样写是不是跨度大了点,但是我不准备详细解释了,很多东西需要你去认真分析的,所以很多东西如果不懂,自己想清楚比别人解释的效果会更好,因为别人讲只能让你理解,如果你自己去想,你就在理解的同时学会了思考。 这个代码写出来,不要继续看下去,先自己尝试着把这个题目用递归做一下看看自己能不能写出来,当然,递归并不是那么轻松就能使用的,有时候也是需要去细心设计的。如果做出来了,对比一下下边的代码,如果没有写出来,建议认真分析后边的代码,然后最好是能完全掌握,能自己随时把这行代码写出来: #include <stdio.h> int add(int n,int num,int i) { num+=i; if(i>=n-1) { return num; } else { return num+add(n,num,i+1); } } void main() { int sum; sum=add(50,1,0); /*50表示前50象项*/ printf("%d\n",sum); } 当然这个代码中的n只是一个参考变量,如果把if(i>=n-1)中的n该成50,那么就不需要这个n了,函数两个参数就可以了,这样写是为了修改方便。 20:28 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它 | 计算机与 Internet 程序算法4—递归2—递归的魅力 两天没有再写下去,因为毕竟有时候会有点心情问题,有时候觉得心情不好,一下子什么东西都想不起来了,很多时候写一些东西是需要状态的,一旦状态有了,想的东西才能顺利的写出来,虽然有些东西写出来在别人看来很垃圾,但是起码自己觉得还是相当满意的,我写这个本来就没有多少技术含量,只是想给初学程序的人一些指引,加快他们对程序的领悟。 好了,言归正传,继续上次递归的讨论,看看递归的魅力所在。 有这样一个问题,说一个猴子和一堆苹果,猴子一天吃一半,然后再吃一个,10天后剩下一个了,也就是说吃了10次,剩下1个了。问原来一共有多少苹果。 当然我们的目的不是求出苹果的数量,而是寻求一种解决问题的方法,这个问题一出来,通常对程序掌握深度不一样的朋友对这个题会有不同的认识,首先介绍一种解决方法,这种人脑袋还是比较聪明的,思路非常的明确,也有可能语言工具掌握的也不错,代码写出来非常准确,先看一下代码再做评价吧: #include <stdio.h> void main() { int day=10; int apple; int i,j; for(i=1;;i++) { apple=i; for(j=0;j<day;j++) { if(apple%2==0&&apple>0) { apple/=2; apple--; } else { break; } } if(j==day&&apple==1) { printf("%d\n",i); return; } } } 程序的大概思路很明确,简单介绍一下,这种写法就是从一个苹果开始算起,for(i=1;;i++)的作用就是改变苹果的数量,如果1个符合条件,那就试试2个,然后3个、4个一直到适合为止,里边的for循环就是把每一次取得的苹果的数目进行计算,如果每次都能顺利的被2整除(也就是说每次都能保证猴子能正好吃一半),然后再减一一直到最后,如果最后苹果剩下是一个而且天数正好是10天,那么就输出一下苹果的数目,整个程序退出,如果看不明白的没关系,这个写法非常的不适用,我们叫写出这种算法的人傻X,虽然这种人脑袋也挺聪明,能写出一些新鲜的写法,但是又脏又臭,代码既不简练又不高效。 所以说,有时候有些人以为自己学的很好了,自己所做的一切都是最好的,这种想法是不正确的,也许有些初学者没有什么经验写出来的代码却更让人容易明白点,那么也是先看看代码: #include <stdio.h> void main() { int day[11]; int i; day[0]=1; for(i=1;i<11;i++) { day[i]=(day[i-1]+1)*2; } printf("%d\n",day[10]); } 代码不长,而且也恰当的应用了题目中的规律,不是说要吃一半然后再吃一个吗。那我用数组来存放每天苹果的数量,用day[0]表示最后一天的苹果数量,那就是剩下的一个,然后就是找规律了,什么规律。就是如果猴子不多吃一个的话,那就是正好吃了一半,也就是说猴子当天吃了之后剩余的苹果的数目加1个然后再乘以2就是前一天的数目了,这样一想这个题目就简单的多了,于是这个题用数组就轻松的做出来了。 那么这个代码究竟是不是已经很好了呢,我们注意到,这里边每个数组元素只用了一次并没有被重复使用,再这种情况下我们是不是可以用一种方法代替数组呢。于是就有了更优化的写法,这个写法似乎已经是相当简练了: #include <stdio.h> void main() { int apple=1; int i; for(i=0;i<10;i++) { apple=(apple+1)*2; } printf("%d\n",apple); } 代码写到这里已经把问题完全抽象化了,所以我们就应该站在数学的角度去分析了。也许我们就应该结束了讨论,但是偏偏这个时候,又来了递归,悄悄的通过美丽的调用显示了一下她的魅力: #include <stdio.h> int apple(int i) { if(i==0) { return 1; } else { return (apple(i-1)+1)*2; } } void main() { int i; i=apple(10); printf("%d\n",i); } 原理都还是一样的,但是写出来的格式已经完全变掉了,没有了for循环。假想一个复杂的问题远比这个问题复杂,而且没有固定循环次数,那么我们再使用循环虽然也能解决问题,但是可能面临循环难以设计、控制等问题,这个时候用递归可能就会让问题变的非常的清晰。 另外说一点,一般我这里的代码,并不是从最差到最好的,基本排列是从最差到最合适的代码(当然是本人认为最合适的,也许还有更好的,本人能力所限了),然后最后给出一种比较违反常规的代码,一般是不赞成用最后一种代码的,当然有时候最后一种代码也许是最好的选择,看情况吧。 20:25 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它 | 计算机与 Internet 10月15日 程序算法3—递归1—递归小显威力 现在用C语言实现一个字符串的倒序输出,当然,方法也是很多的,但是如果程序中能有相对优化的方法或者简单明了易读的方法,那对你自己或者别人都是一种幸福。 第一种写法,这类写法既浪费内存又不实用,一般是刚学程序的才这样做,程序的结构很简单,利用的是数组: #include <stdio.h> void main() { char c[2000]; int i,length=0; for(i=0;i<2000;i++) { scanf("%c",&c[i]); if(c[i]=='\n') { break; } else { length++; } } for(i=length;i>0;i--) { printf("%c",c[i-1]); } printf("\n"); } 这段代码中的数组,声明大了浪费内存空间,声明小了又怕不够,所以写这种代码的人一般写完之后会祈祷,祈祷测试的人不要输入的太多,太多就不能完全显示了。 与其这么提心吊胆,于是又有人想出了第二种方法,终于解决了一些问题,而且完全实现了程序的实际要求,于是,这种人经过一番苦想,觉得问题终于可以解决了,这种方法看起来是一种很不错的方法。 #include <stdio.h> #include <malloc.h> void main() { int i; char *c; c=(char *)malloc(1*sizeof(char)); for(i=0;;i++) { *(c+i)=getchar(); if(*(c+i)=='\n') { *(c+i)='\0'; break; } else c=(char *)realloc(c,(i+2)*sizeof(char)); } for(--i;i>=0;i--) { putchar(*(c+i)); } printf("\n"); free(c); } 怎么样。不错,准确的应用内存,几乎没有浪费什么空间,这种方法也体现了一下指针的强大功能,写这个程序虽然不敢说这个人已经掌握了指针的应用,但是起码可以说他已经会用指针了。代码写出来,看起来已经有点美感。 但是也有一些人还是比较喜欢动脑筋的,经过一番思考,终于想出了第三种比较容易写的方法,也许有写初学者可能觉得有些难度,但是事实上这个东西一点都不难,如果稍微有点程序功底之后再看这段代码,应该是相当轻松。 #include <stdio.h> void run() { char c; c=getchar(); if(c!='\n') { run(); } else { return; } putchar(c); } void main() { run(); printf("\n"); } 写出的代码让人眼前一亮,哇。原来递归功能简单而又好用,那我们为什么不好好利用呢。但是递归也不一定就是最好的选择,因为有时候虽然递归用起来很方便,但是效率却不高,以后的讨论中还会详细说明。

一键天涯 2019-12-02 01:24:01 0 浏览量 回答数 0

回答

java飘过,用过JNA,int 和指针都是32位的。SO......######指针里面存的就是一个内存地址,内存地址就可以用一个整数来表示。so……c忘光了######指针是一个地址,而且是32位,和int类型一样,在机器中表现的就是一个“数字”而已######太官方啦,有木有别的解释, return (void* )1 是什么意思,这个1代表什么?内存?######(void ) -1 代表什么意思?  ######(void)-1 表示把-1转换为一个无类型指针,这个指针存储的值就是-1. 看看关于C和指针方面的书,这都是比较基础的######void代表的是void type而不是void value######都是void了怎么还能存-1呢?######哈。首先要明确,机器处理的对象就是数字。当然不同位宽的数字有不同的辅助操作。而核心操作基本上就是加(减),乘,位操作,和取址操作。比较操作其实可以等同为减操作。 除非有硬件除法器,否则是没有除的概念。除法是调用系统库运算的结果。 由于核心操作都一样,所以不同类型,无非是位宽和核心操作前辅助操作的差异而已。 高级语言是为了方便你,帮你约束各个位宽,而落在机器上没有本质差异。 指针类型,无论指向的地址类型是什么 ,都是一个类型,就是“指针”类型。这个和机器的地址宽度有关。有时不和总线地址宽度有关,主要看CPU内部怎么处理了。但对于一个具体平台和OS,指针类型的位宽都是一致的。 需要注意的是,只有int和指针类型的位宽相同时,强制的转换才没有问题。否则还是会报错。int不等于指针类型的位宽。只是碰巧32位如此。###### 引用来自“中山野鬼”的答案 哈。首先要明确,机器处理的对象就是数字。当然不同位宽的数字有不同的辅助操作。而核心操作基本上就是加(减),乘,位操作,和取址操作。比较操作其实可以等同为减操作。 除非有硬件除法器,否则是没有除的概念。除法是调用系统库运算的结果。 由于核心操作都一样,所以不同类型,无非是位宽和核心操作前辅助操作的差异而已。 高级语言是为了方便你,帮你约束各个位宽,而落在机器上没有本质差异。 指针类型,无论指向的地址类型是什么 ,都是一个类型,就是“指针”类型。这个和机器的地址宽度有关。有时不和总线地址宽度有关,主要看CPU内部怎么处理了。但对于一个具体平台和OS,指针类型的位宽都是一致的。 需要注意的是,只有int和指针类型的位宽相同时,强制的转换才没有问题。否则还是会报错。int不等于指针类型的位宽。只是碰巧32位如此。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <string.h> struct stu                            //我自己定义的学生结构 { char name[20]; int age; }; void* thr_fn1(void* arg)                //线程thr_fn1 {    printf("thread 1 exiting\n");     printf("%d\n", ((struct stu*)arg)->age);        //把void* arg准换为结构体的指针,取出age成员    //((char*)arg)[20], ((int*)arg)[5] 用这样也可以读name , age return (void* )1; }     int main(void) 42 { 43 struct stu ones; 44 struct stu* pones = &ones; 45 memcpy(ones.name, "sgc", 4); 46 ones.age =10; 47 48 pthread_t tid; 49 void* tret; 50 pthread_create(&tid, NULL, thr_fn1, (void*)pones);    //创建线程1,传入结构体的指针并转换为void* 51 pthread_join(tid, &tret);                             //等待线程1结束        return 0;   } 我又不懂, void* 的一般用法有哪些,都在什么地方用? ###### 引用来自“gcshang”的答案 引用来自“中山野鬼”的答案 哈。首先要明确,机器处理的对象就是数字。当然不同位宽的数字有不同的辅助操作。而核心操作基本上就是加(减),乘,位操作,和取址操作。比较操作其实可以等同为减操作。 除非有硬件除法器,否则是没有除的概念。除法是调用系统库运算的结果。 由于核心操作都一样,所以不同类型,无非是位宽和核心操作前辅助操作的差异而已。 高级语言是为了方便你,帮你约束各个位宽,而落在机器上没有本质差异。 指针类型,无论指向的地址类型是什么 ,都是一个类型,就是“指针”类型。这个和机器的地址宽度有关。有时不和总线地址宽度有关,主要看CPU内部怎么处理了。但对于一个具体平台和OS,指针类型的位宽都是一致的。 需要注意的是,只有int和指针类型的位宽相同时,强制的转换才没有问题。否则还是会报错。int不等于指针类型的位宽。只是碰巧32位如此。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <string.h> struct stu                            //我自己定义的学生结构 { char name[20]; int age; }; void* thr_fn1(void* arg)                //线程thr_fn1 {    printf("thread 1 exiting\n");     printf("%d\n", ((struct stu*)arg)->age);        //把void* arg准换为结构体的指针,取出age成员    //((char*)arg)[20], ((int*)arg)[5] 用这样也可以读name , age return (void* )1; }     int main(void) 42 { 43 struct stu ones; 44 struct stu* pones = &ones; 45 memcpy(ones.name, "sgc", 4); 46 ones.age =10; 47 48 pthread_t tid; 49 void* tret; 50 pthread_create(&tid, NULL, thr_fn1, (void*)pones);    //创建线程1,传入结构体的指针并转换为void* 51 pthread_join(tid, &tret);                             //等待线程1结束        return 0;   } 我又不懂, void* 的一般用法有哪些,都在什么地方用? void 只要你觉得这个不知道啥类型 你就可以用void ###### 引用来自“小耶果”的答案 (void*)-1 表示把-1转换为一个无类型指针,这个指针存储的值就是-1. 看看关于C和指针方面的书,这都是比较基础的  #include <stdio.h> 02    #include <stdlib.h> 03    #include <pthread.h> 04    #include <unistd.h> 05    #include <string.h> 06      07    struct stu                            //我自己定义的学生结构 08    { 09        char name[20]; 10        int age; 11    }; 12    void* thr_fn1(void* arg)                //线程thr_fn1 13    { 14      15        printf("thread 1 exiting\n"); 16        printf("%d\n", ((struct stu*)arg)->age);        //把void* arg准换为结构体的指针,取出age成员 17      18       //((char*)arg)[20], ((int*)arg)[5]  用这样也可以读name , age 19       return (void* )1; 20      21    } 22        int main(void) 23     { 24         struct stu ones; 25         struct stu* pones = &ones; 26         memcpy(ones.name, "sgc", 4); 27         ones.age =10; 28      29         pthread_t tid; 30         void* tret; 31         pthread_create(&tid, NULL, thr_fn1, (void*)pones);    //创建线程1,传入结构体的指针并转换为void* 32         pthread_join(tid, &tret);                             //等待线程1结束 33     } 你看我把指向结构体的指针pones转换为void*传入到线程thr_fn1的函数中,然后再函数中把void* 的指针转换为 结构体指针,然后访问结构体成员是否有问题?void*的典型用法是怎样的 ?

kun坤 2020-05-29 11:40:27 0 浏览量 回答数 0

回答

首先给你个忠告永远不要省略if for while等语句的大括号 然后 一行只写一句话 最后 具体的错误等稍后我看过代码再给出 ###### 递归爆炸了,改成循环吧 ######数据不大 可以使用递归  ,数据大了 会出现栈溢出,因为在没有分支结束前或者被强行中断,单个线程是不会释放栈现场的。1.修改栈大小 。2.采用非递归方式。----几乎各个语言都要避免下这个问题哦######应该需要修改编译器堆栈的大小,但没有实际尝试,可以先修改N的大小,看是否堆栈还溢出。是否还有其他错误。######递归函数中没有一个return,递归调用还在必经路径上——连编译器都知道它会归死。######回复 @zhangjihan10 : 模拟一个栈 加上goto语句 就比较简单了 不过代码还是会很乱######回复 @zhangjihan10 : 当然可以, 自己模拟一个栈就可以了, 但是这有什么意义呢?######回复 @猫咪喵喵 :没递归结束条件呀,你能用循环写出来吗######回复 @猫咪喵喵 : 你是怎么贴出带有行号和滚动条这种效果的######然后统计时间的时候居然把数据准备 打印输出结果都算进去 真是乱的可以###### 简单看了一下你的代码 你的代码确实会栈溢出 这源于你并没有指定结束递归的条件 ###### 试试看这个 #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 1000 void quick_sort(int a[], int start, int end) { int i = start, j = end; int key = a[i]; while(i < j) { for(; i < j; j--) { if(a[j] < key) { a[i++] = a[j]; break; } } for(; i < j; i++) { if(a[i] > key) { a[j--] = a[i]; break; } } } a[i] = key; if(start < i - 1){ quick_sort(a, start, i - 1); } if(end > i + 1){ quick_sort(a, i + 1, end); } } int main() { srand((unsigned)time(NULL)); //随机数种子准备 int array[N] = {0}; //要被排序的数据准备 for(int i = 0; i < N; i++){ //随机生成一些数据 array[i] = rand() % N; } clock_t start = clock(); //记录开始时间 quick_sort(array, 0, 999); //调用排序算法对数据进行排序 clock_t end = clock(); //记录结束时间 for(int i = 0; i < N; i++){ //打印输出排序后的数据 printf("%5d", array[i]); } printf("\n"); double t = (double)(end - start) / CLOCKS_PER_SEC; //计算算法所消耗的时间 printf("快速排序运行时间:%lf秒\n", t); //输出时间 return 0; } ######回复 @月光双刀 : 仔细看提问者的代码 溢出并不是因为数据量过大 而是他的代码有问题 所以说 这个可以解决问题######这个也会栈溢出######编辑器上有个插入代码或脚本啦 @zhangjihan10######回复 @zhangjihan10 : 。######求大神手把手教代码高亮使用方法

kun坤 2020-06-02 14:30:33 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

首先给你个忠告永远不要省略if for while等语句的大括号 然后 一行只写一句话 最后 具体的错误等稍后我看过代码再给出 ###### 递归爆炸了,改成循环吧 ######数据不大 可以使用递归  ,数据大了 会出现栈溢出,因为在没有分支结束前或者被强行中断,单个线程是不会释放栈现场的。1.修改栈大小 。2.采用非递归方式。----几乎各个语言都要避免下这个问题哦######应该需要修改编译器堆栈的大小,但没有实际尝试,可以先修改N的大小,看是否堆栈还溢出。是否还有其他错误。######递归函数中没有一个return,递归调用还在必经路径上——连编译器都知道它会归死。######回复 @zhangjihan10 : 模拟一个栈 加上goto语句 就比较简单了 不过代码还是会很乱######回复 @zhangjihan10 : 当然可以, 自己模拟一个栈就可以了, 但是这有什么意义呢?######回复 @猫咪喵喵 :没递归结束条件呀,你能用循环写出来吗######回复 @猫咪喵喵 : 你是怎么贴出带有行号和滚动条这种效果的######然后统计时间的时候居然把数据准备 打印输出结果都算进去 真是乱的可以###### 简单看了一下你的代码 你的代码确实会栈溢出 这源于你并没有指定结束递归的条件 ###### 试试看这个 #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 1000 void quick_sort(int a[], int start, int end) { int i = start, j = end; int key = a[i]; while(i < j) { for(; i < j; j--) { if(a[j] < key) { a[i++] = a[j]; break; } } for(; i < j; i++) { if(a[i] > key) { a[j--] = a[i]; break; } } } a[i] = key; if(start < i - 1){ quick_sort(a, start, i - 1); } if(end > i + 1){ quick_sort(a, i + 1, end); } } int main() { srand((unsigned)time(NULL)); //随机数种子准备 int array[N] = {0}; //要被排序的数据准备 for(int i = 0; i < N; i++){ //随机生成一些数据 array[i] = rand() % N; } clock_t start = clock(); //记录开始时间 quick_sort(array, 0, 999); //调用排序算法对数据进行排序 clock_t end = clock(); //记录结束时间 for(int i = 0; i < N; i++){ //打印输出排序后的数据 printf("%5d", array[i]); } printf("\n"); double t = (double)(end - start) / CLOCKS_PER_SEC; //计算算法所消耗的时间 printf("快速排序运行时间:%lf秒\n", t); //输出时间 return 0; } ######回复 @月光双刀 : 仔细看提问者的代码 溢出并不是因为数据量过大 而是他的代码有问题 所以说 这个可以解决问题######这个也会栈溢出######编辑器上有个插入代码或脚本啦 @zhangjihan10######回复 @zhangjihan10 : 。######求大神手把手教代码高亮使用方法

kun坤 2020-06-14 12:17:32 0 浏览量 回答数 0

回答

" 首先给你个忠告永远不要省略if for while等语句的大括号 然后 一行只写一句话 最后 具体的错误等稍后我看过代码再给出 ###### 递归爆炸了,改成循环吧 ######数据不大 可以使用递归  ,数据大了 会出现栈溢出,因为在没有分支结束前或者被强行中断,单个线程是不会释放栈现场的。1.修改栈大小 。2.采用非递归方式。----几乎各个语言都要避免下这个问题哦######应该需要修改编译器堆栈的大小,但没有实际尝试,可以先修改N的大小,看是否堆栈还溢出。是否还有其他错误。######递归函数中没有一个return,递归调用还在必经路径上——连编译器都知道它会归死。######回复 @zhangjihan10 : 模拟一个栈 加上goto语句 就比较简单了 不过代码还是会很乱######回复 @zhangjihan10 : 当然可以, 自己模拟一个栈就可以了, 但是这有什么意义呢?######回复 @猫咪喵喵 :没递归结束条件呀,你能用循环写出来吗######回复 @猫咪喵喵 : 你是怎么贴出带有行号和滚动条这种效果的######然后统计时间的时候居然把数据准备 打印输出结果都算进去 真是乱的可以###### 简单看了一下你的代码 你的代码确实会栈溢出 这源于你并没有指定结束递归的条件 ###### 试试看这个 #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 1000 void quick_sort(int a[], int start, int end) { int i = start, j = end; int key = a[i]; while(i < j) { for(; i < j; j--) { if(a[j] < key) { a[i++] = a[j]; break; } } for(; i < j; i++) { if(a[i] > key) { a[j--] = a[i]; break; } } } a[i] = key; if(start < i - 1){ quick_sort(a, start, i - 1); } if(end > i + 1){ quick_sort(a, i + 1, end); } } int main() { srand((unsigned)time(NULL)); //随机数种子准备 int array[N] = {0}; //要被排序的数据准备 for(int i = 0; i < N; i++){ //随机生成一些数据 array[i] = rand() % N; } clock_t start = clock(); //记录开始时间 quick_sort(array, 0, 999); //调用排序算法对数据进行排序 clock_t end = clock(); //记录结束时间 for(int i = 0; i < N; i++){ //打印输出排序后的数据 printf("%5d", array[i]); } printf("\n"); double t = (double)(end - start) / CLOCKS_PER_SEC; //计算算法所消耗的时间 printf("快速排序运行时间:%lf秒\n", t); //输出时间 return 0; } ######回复 @月光双刀 : 仔细看提问者的代码 溢出并不是因为数据量过大 而是他的代码有问题 所以说 这个可以解决问题######这个也会栈溢出######编辑器上有个插入代码或脚本啦 @zhangjihan10######回复 @zhangjihan10 : 。######求大神手把手教代码高亮使用方法"

montos 2020-06-03 17:13:17 0 浏览量 回答数 0

回答

这是程序的入口啊,没有它怎么执行? ###### 用过字符操作界面吗? ls -a -a 就会被输入到main()中,成为参数 ######比如你想写一个小程序,计算数字1到n之间的总和,这个n由用户输入,这时你就要用main函数的参数了######哦 是这个意思,不能在程序里定义n?###### 谢谢各位,3q ###### 哈,这个是唯一的可变信息的入口。例如: 一个程序可以存在自己的参数配置文件,对该文件解析后设定这些参数。但该文件路径名你想不固定,那么还是需要通过上述参数给入。 c标准支持 main (void)的接口。但是对于我带的团队,仍然禁止使用main(void)。。。 ######argc是参数个数,*argv[]是参数数组,用来接收命令行参数,怎么会没有用. #include <stdio.h>nano ab.c #include <stdio.h> int main(int argc, char *argv[]) {     fprintf(stderr,"argc: %d\n",argc);     int i;     for(i=0;i<argc;i++) {         fprintf(stderr,"argv[%d]: %s\n",i,argv[i]);     }     return 0; } 编译: gcc ab.c -o ab 运行: ./ab -c10 -n500 http://127.0.0.1/index.php 结果: argc: 4 argv[0]: ./ab argv[1]: -c10 argv[2]: -n500 argv[3]: http://127.0.0.1/index.php Linux上在Bash里运行程序后使用 echo $? 查看返回值. Windows上在CMD里运行程序后使用 echo %ERRORLEVEL% 查看返回值. main函数的返回值用于说明程序的退出状态.如果返回0,则代表程序正常退出,返回其它数字的含义则由系统决定. return 0;  执行 echo $? 值为 0 return 2;  执行 echo $? 值为 2 return 1;  执行 echo $? 值为 1 return -1; 执行 echo $? 值为 255 return -2; 执行 echo $? 值为 254 ###### 引用来自“中山野鬼”的评论 哈,这个是唯一的可变信息的入口。例如: 一个程序可以存在自己的参数配置文件,对该文件解析后设定这些参数。但该文件路径名你想不固定,那么还是需要通过上述参数给入。 c标准支持 main (void)的接口。但是对于我带的团队,仍然禁止使用main(void)。。。 明白了,这就是我想了解的意思,谢谢 这是程序的入口啊,没有它怎么执行? ###### 用过字符操作界面吗? ls -a -a 就会被输入到main()中,成为参数 ######比如你想写一个小程序,计算数字1到n之间的总和,这个n由用户输入,这时你就要用main函数的参数了######哦 是这个意思,不能在程序里定义n?###### 谢谢各位,3q ###### 哈,这个是唯一的可变信息的入口。例如: 一个程序可以存在自己的参数配置文件,对该文件解析后设定这些参数。但该文件路径名你想不固定,那么还是需要通过上述参数给入。 c标准支持 main (void)的接口。但是对于我带的团队,仍然禁止使用main(void)。。。 ######argc是参数个数,*argv[]是参数数组,用来接收命令行参数,怎么会没有用. #include <stdio.h>nano ab.c #include <stdio.h> int main(int argc, char *argv[]) {     fprintf(stderr,"argc: %d\n",argc);     int i;     for(i=0;i<argc;i++) {         fprintf(stderr,"argv[%d]: %s\n",i,argv[i]);     }     return 0; } 编译: gcc ab.c -o ab 运行: ./ab -c10 -n500 http://127.0.0.1/index.php 结果: argc: 4 argv[0]: ./ab argv[1]: -c10 argv[2]: -n500 argv[3]: http://127.0.0.1/index.php Linux上在Bash里运行程序后使用 echo $? 查看返回值. Windows上在CMD里运行程序后使用 echo %ERRORLEVEL% 查看返回值. main函数的返回值用于说明程序的退出状态.如果返回0,则代表程序正常退出,返回其它数字的含义则由系统决定. return 0;  执行 echo $? 值为 0 return 2;  执行 echo $? 值为 2 return 1;  执行 echo $? 值为 1 return -1; 执行 echo $? 值为 255 return -2; 执行 echo $? 值为 254 ###### 引用来自“中山野鬼”的评论 哈,这个是唯一的可变信息的入口。例如: 一个程序可以存在自己的参数配置文件,对该文件解析后设定这些参数。但该文件路径名你想不固定,那么还是需要通过上述参数给入。 c标准支持 main (void)的接口。但是对于我带的团队,仍然禁止使用main(void)。。。 明白了,这就是我想了解的意思,谢谢

kun坤 2020-06-11 10:12:49 0 浏览量 回答数 0

问题

C++如何拼接LPWSTR类型字符串??报错

爱吃鱼的程序员 2020-06-08 20:03:02 0 浏览量 回答数 1

问题

什么样的手段处理图片后会使得用java取得该图片的RGB值与实际值不同?报错

因为相信,所以看见。 2020-05-27 12:59:32 6 浏览量 回答数 1

问题

JNI中调用任何标准输入输出处理流导致JVM崩溃?403.10 禁止访问:配置无效 

kun坤 2020-05-28 13:23:32 6 浏览量 回答数 1

问题

第6篇 指针数组字符串(下):报错

kun坤 2020-06-08 11:01:44 4 浏览量 回答数 1

回答

你发的这些东西看不出问题, 这只不过是设置SDL音频播放参数和回调接口而已. 得看看你是如何解码的, 有没有把解码出来的数据弄丢, 不然是不会有噪音的...######我把源码发上来了 你帮我看一下 拜托了######回复 @bruce_hou : 没看到你的代码, 我也不知道怎么回事.######具体怎么处理啊 能不能详细的说一下######我把源码发上来 #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include <SDL/SDL.h> #include <SDL/SDL_thread.h> #ifdef main #undef main #endif #include <stdio.h> #include <math.h> #define SDL_AUDIO_BUFFER_SIZE 1024 #define MAX_AUDIOQ_SIZE (5 * 16 * 1024) #define MAX_VIDEOQ_SIZE (5 * 256 * 1024) #define AV_SYNC_THRESHOLD 0.01 #define AV_NOSYNC_THRESHOLD 10.0 #define FF_ALLOC_EVENT (SDL_USEREVENT) #define FF_REFRESH_EVENT (SDL_USEREVENT + 1) #define FF_QUIT_EVENT (SDL_USEREVENT + 2) #define VIDEO_PICTURE_QUEUE_SIZE 1 typedef struct PacketQueue { AVPacketList *first_pkt, *last_pkt; int nb_packets; int size; SDL_mutex *mutex; SDL_cond *cond; } PacketQueue; typedef struct VideoPicture { SDL_Overlay *bmp; int width, height; int allocated; double pts; } VideoPicture; typedef struct VideoState { AVFormatContext *pFormatCtx; int videoStream, audioStream; double audio_clock; AVStream *audio_st; PacketQueue audioq; uint8_t audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2]; unsigned int audio_buf_size; unsigned int audio_buf_index; AVPacket audio_pkt; uint8_t *audio_pkt_data; int audio_pkt_size; int audio_hw_buf_size; double frame_timer; double frame_last_pts; double frame_last_delay; double video_clock; ///<pts of last decoded frame / predicted pts of next decoded frame AVStream *video_st; PacketQueue videoq; VideoPicture pictq[VIDEO_PICTURE_QUEUE_SIZE]; int pictq_size, pictq_rindex, pictq_windex; SDL_mutex *pictq_mutex; SDL_cond *pictq_cond; SDL_Thread *parse_tid; SDL_Thread *video_tid; char filename[1024]; int quit; } VideoState; SDL_Surface *screen; VideoState *global_video_state; void packet_queue_init(PacketQueue *q) { memset(q, 0, sizeof(PacketQueue)); q->mutex = SDL_CreateMutex(); q->cond = SDL_CreateCond(); } int packet_queue_put(PacketQueue *q, AVPacket *pkt) { AVPacketList *pkt1; if(av_dup_packet(pkt) < 0) { return -1; } pkt1 = (AVPacketList *)av_malloc(sizeof(AVPacketList)); if (!pkt1) return -1; pkt1->pkt = *pkt; pkt1->next = NULL; SDL_LockMutex(q->mutex); if (!q->last_pkt) q->first_pkt = pkt1; else q->last_pkt->next = pkt1; q->last_pkt = pkt1; q->nb_packets++; q->size += pkt1->pkt.size; SDL_CondSignal(q->cond); SDL_UnlockMutex(q->mutex); return 0; } static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block) { AVPacketList *pkt1; int ret; SDL_LockMutex(q->mutex); for(;;) { if(global_video_state->quit) { ret = -1; break; } pkt1 = q->first_pkt; if (pkt1) { q->first_pkt = pkt1->next; if (!q->first_pkt) q->last_pkt = NULL; q->nb_packets--; q->size -= pkt1->pkt.size; *pkt = pkt1->pkt; av_free(pkt1); ret = 1; break; } else if (!block) { ret = 0; break; } else { SDL_CondWait(q->cond, q->mutex); } } SDL_UnlockMutex(q->mutex); return ret; } double get_audio_clock(VideoState *is) { double pts; int hw_buf_size, bytes_per_sec, n; pts = is->audio_clock; hw_buf_size = is->audio_buf_size - is->audio_buf_index; bytes_per_sec = 0; n = is->audio_st->codec->channels * 2; if(is->audio_st) { bytes_per_sec = is->audio_st->codec->sample_rate * n; } if(bytes_per_sec) { pts -= (double)hw_buf_size / bytes_per_sec; } return pts; } int audio_decode_frame(VideoState *is, uint8_t *audio_buf, int buf_size, double *pts_ptr) { int len1, data_size, n; AVPacket *pkt = &is->audio_pkt; double pts; for(;;) { while(is->audio_pkt_size > 0) { data_size = buf_size; len1 = avcodec_decode_audio2(is->audio_st->codec, (int16_t *)audio_buf, &data_size, is->audio_pkt_data, is->audio_pkt_size); if(len1 < 0) { is->audio_pkt_size = 0; break; } is->audio_pkt_data += len1; is->audio_pkt_size -= len1; if(data_size <= 0) { continue; } pts = is->audio_clock; *pts_ptr = pts; n = 2 * is->audio_st->codec->channels; is->audio_clock += (double)data_size / (double)(n * is->audio_st->codec->sample_rate); return data_size; } if(pkt->data) av_free_packet(pkt); if(is->quit) { return -1; } if(packet_queue_get(&is->audioq, pkt, 1) < 0) { return -1; } is->audio_pkt_data = pkt->data; is->audio_pkt_size = pkt->size; if(pkt->pts != AV_NOPTS_VALUE) { is->audio_clock = av_q2d(is->audio_st->time_base)*pkt->pts; } } } void audio_callback(void *userdata, Uint8 *stream, int len) { VideoState *is = (VideoState *)userdata; int len1, audio_size; double pts; while(len > 0) { if(is->audio_buf_index >= is->audio_buf_size) { audio_size = audio_decode_frame(is, is->audio_buf, sizeof(is->audio_buf), &pts); if(audio_size < 0) { is->audio_buf_size = 1024; memset(is->audio_buf, 0, is->audio_buf_size); } else { is->audio_buf_size = audio_size; } is->audio_buf_index = 0; } len1 = is->audio_buf_size - is->audio_buf_index; if(len1 > len) len1 = len; memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1); len -= len1; stream += len1; is->audio_buf_index += len1; } } static Uint32 sdl_refresh_timer_cb(Uint32 interval, void *opaque) { SDL_Event event; event.type = FF_REFRESH_EVENT; event.user.data1 = opaque; SDL_PushEvent(&event); return 0; } static void schedule_refresh(VideoState *is, int delay) { SDL_AddTimer(delay, sdl_refresh_timer_cb, is); } void video_display(VideoState *is) { SDL_Rect rect; VideoPicture *vp; AVPicture pict; float aspect_ratio; int w, h, x, y; int i; vp = &is->pictq[is->pictq_rindex]; if(vp->bmp) { if(is->video_st->codec->sample_aspect_ratio.num == 0) { aspect_ratio = 0; } else { aspect_ratio = av_q2d(is->video_st->codec->sample_aspect_ratio) * is->video_st->codec->width / is->video_st->codec->height; } if(aspect_ratio <= 0.0) { aspect_ratio = (float)is->video_st->codec->width / (float)is->video_st->codec->height; } h = screen->h; w = ((int)(h * aspect_ratio)) & -3; if(w > screen->w) { w = screen->w; h = ((int)(w / aspect_ratio)) & -3; } x = (screen->w - w) / 2; y = (screen->h - h) / 2; rect.x = x; rect.y = y; rect.w = w; rect.h = h; SDL_DisplayYUVOverlay(vp->bmp, &rect); } } void video_refresh_timer(void *userdata) { VideoState *is = (VideoState *)userdata; VideoPicture *vp; double actual_delay, delay, sync_threshold, ref_clock, diff; if(is->video_st) { if(is->pictq_size == 0) { schedule_refresh(is, 1); } else { vp = &is->pictq[is->pictq_rindex]; delay = vp->pts - is->frame_last_pts; if(delay <= 0 || delay >= 1.0) { delay = is->frame_last_delay; } is->frame_last_delay = delay; is->frame_last_pts = vp->pts; ref_clock = get_audio_clock(is); diff = vp->pts - ref_clock; sync_threshold = (delay > AV_SYNC_THRESHOLD) ? delay : AV_SYNC_THRESHOLD; if(fabs(diff) < AV_NOSYNC_THRESHOLD) { if(diff <= -sync_threshold) { delay = 0; } else if(diff >= sync_threshold) { delay = 2 * delay; } } is->frame_timer += delay; actual_delay = is->frame_timer - (av_gettime() / 1000000.0); if(actual_delay < 0.010) { actual_delay = 0.010; } schedule_refresh(is, (int)(actual_delay * 1000 + 0.5)); video_display(is); if(++is->pictq_rindex == VIDEO_PICTURE_QUEUE_SIZE) { is->pictq_rindex = 0; } SDL_LockMutex(is->pictq_mutex); is->pictq_size--; SDL_CondSignal(is->pictq_cond); SDL_UnlockMutex(is->pictq_mutex); } } else { schedule_refresh(is, 100); } } void alloc_picture(void *userdata) { VideoState *is = (VideoState *)userdata; VideoPicture *vp; vp = &is->pictq[is->pictq_windex]; if(vp->bmp) { // we already have one make another, bigger/smaller SDL_FreeYUVOverlay(vp->bmp); } // Allocate a place to put our YUV image on that screen vp->bmp = SDL_CreateYUVOverlay(is->video_st->codec->width, is->video_st->codec->height, SDL_YV12_OVERLAY, screen); vp->width = is->video_st->codec->width; vp->height = is->video_st->codec->height; SDL_LockMutex(is->pictq_mutex); vp->allocated = 1; SDL_CondSignal(is->pictq_cond); SDL_UnlockMutex(is->pictq_mutex); } int queue_picture(VideoState *is, AVFrame *pFrame, double pts) { VideoPicture *vp; //int dst_pix_fmt; AVPicture pict; SDL_LockMutex(is->pictq_mutex); while(is->pictq_size >= VIDEO_PICTURE_QUEUE_SIZE && !is->quit) { SDL_CondWait(is->pictq_cond, is->pictq_mutex); } SDL_UnlockMutex(is->pictq_mutex); if(is->quit) return -1; // windex is set to 0 initially vp = &is->pictq[is->pictq_windex]; if(!vp->bmp || vp->width != is->video_st->codec->width || vp->height != is->video_st->codec->height) { SDL_Event event; vp->allocated = 0; event.type = FF_ALLOC_EVENT; event.user.data1 = is; SDL_PushEvent(&event); SDL_LockMutex(is->pictq_mutex); while(!vp->allocated && !is->quit) { SDL_CondWait(is->pictq_cond, is->pictq_mutex); } SDL_UnlockMutex(is->pictq_mutex); if(is->quit) { return -1; } } static struct SwsContext *img_convert_ctx; if (img_convert_ctx == NULL) { img_convert_ctx = sws_getContext(is->video_st->codec->width, is->video_st->codec->height, is->video_st->codec->pix_fmt, is->video_st->codec->width, is->video_st->codec->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL); if (img_convert_ctx == NULL) { fprintf(stderr, "Cannot initialize the conversion context\n"); exit(1); } } if(vp->bmp) { SDL_LockYUVOverlay(vp->bmp); //dst_pix_fmt = PIX_FMT_YUV420P; pict.data[0] = vp->bmp->pixels[0]; pict.data[1] = vp->bmp->pixels[2]; pict.data[2] = vp->bmp->pixels[1]; pict.linesize[0] = vp->bmp->pitches[0]; pict.linesize[1] = vp->bmp->pitches[2]; pict.linesize[2] = vp->bmp->pitches[1]; // Convert the image into YUV format that SDL uses sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, is->video_st->codec->height, pict.data, pict.linesize); SDL_UnlockYUVOverlay(vp->bmp); vp->pts = pts; if(++is->pictq_windex == VIDEO_PICTURE_QUEUE_SIZE) { is->pictq_windex = 0; } SDL_LockMutex(is->pictq_mutex); is->pictq_size++; SDL_UnlockMutex(is->pictq_mutex); } return 0; } double synchronize_video(VideoState *is, AVFrame *src_frame, double pts) { double frame_delay; if(pts != 0) { is->video_clock = pts; } else { pts = is->video_clock; } frame_delay = av_q2d(is->video_st->codec->time_base); frame_delay += src_frame->repeat_pict * (frame_delay * 0.5); is->video_clock += frame_delay; return pts; } uint64_t global_video_pkt_pts = AV_NOPTS_VALUE; int our_get_buffer(struct AVCodecContext *c, AVFrame *pic) { int ret = avcodec_default_get_buffer(c, pic); uint64_t *pts = (uint64_t *)av_malloc(sizeof(uint64_t)); *pts = global_video_pkt_pts; pic->opaque = pts; return ret; } void our_release_buffer(struct AVCodecContext *c, AVFrame *pic) { if(pic) av_freep(&pic->opaque); avcodec_default_release_buffer(c, pic); } int video_thread(void *arg) { VideoState *is = (VideoState *)arg; AVPacket pkt1, *packet = &pkt1; int len1, frameFinished; AVFrame *pFrame; double pts; pFrame = avcodec_alloc_frame(); for(;;) { if(packet_queue_get(&is->videoq, packet, 1) < 0) { // means we quit getting packets break; } pts = 0; // Save global pts to be stored in pFrame in first call global_video_pkt_pts = packet->pts; // Decode video frame len1 = avcodec_decode_video(is->video_st->codec, pFrame, &frameFinished, packet->data, packet->size); if(packet->dts == AV_NOPTS_VALUE && pFrame->opaque && *(uint64_t*)pFrame->opaque != AV_NOPTS_VALUE) { pts = *(uint64_t *)pFrame->opaque; } else if(packet->dts != AV_NOPTS_VALUE) { pts = packet->dts; } else { pts = 0; } pts *= av_q2d(is->video_st->time_base); // Did we get a video frame? if(frameFinished) { pts = synchronize_video(is, pFrame, pts); if(queue_picture(is, pFrame, pts) < 0) { break; } } av_free_packet(packet); } av_free(pFrame); return 0; } int stream_component_open(VideoState *is, int stream_index) { AVFormatContext *pFormatCtx = is->pFormatCtx; AVCodecContext *codecCtx; AVCodec *codec; SDL_AudioSpec wanted_spec, spec; if(stream_index < 0 || stream_index >= pFormatCtx->nb_streams) { return -1; } // Get a pointer to the codec context for the video stream codecCtx = pFormatCtx->streams[stream_index]->codec; if(codecCtx->codec_type == CODEC_TYPE_AUDIO) { // Set audio settings from codec info wanted_spec.freq = codecCtx->sample_rate; wanted_spec.format = AUDIO_S16SYS; wanted_spec.channels = codecCtx->channels; wanted_spec.silence = 0; wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE; wanted_spec.callback = audio_callback; wanted_spec.userdata = is; if(SDL_OpenAudio(&wanted_spec, &spec) < 0) { fprintf(stderr, "SDL_OpenAudio: %s\n", SDL_GetError()); return -1; } is->audio_hw_buf_size = spec.size; } codec = avcodec_find_decoder(codecCtx->codec_id); if(!codec || (avcodec_open(codecCtx, codec) < 0)) { fprintf(stderr, "Unsupported codec!\n"); return -1; } switch(codecCtx->codec_type) { case CODEC_TYPE_AUDIO: is->audioStream = stream_index; is->audio_st = pFormatCtx->streams[stream_index]; is->audio_buf_size = 0; is->audio_buf_index = 0; memset(&is->audio_pkt, 0, sizeof(is->audio_pkt)); packet_queue_init(&is->audioq); SDL_PauseAudio(0); break; case CODEC_TYPE_VIDEO: is->videoStream = stream_index; is->video_st = pFormatCtx->streams[stream_index]; is->frame_timer = (double)av_gettime() / 1000000.0; is->frame_last_delay = 40e-3; packet_queue_init(&is->videoq); is->video_tid = SDL_CreateThread(video_thread, is); codecCtx->get_buffer = our_get_buffer; codecCtx->release_buffer = our_release_buffer; break; default: break; } return 0; } int decode_interrupt_cb(void) { return (global_video_state && global_video_state->quit); } int decode_thread(void *arg) { VideoState *is = (VideoState *)arg; AVFormatContext *pFormatCtx; AVPacket pkt1, *packet = &pkt1; int video_index = -1; int audio_index = -1; int i; is->videoStream=-1; is->audioStream=-1; global_video_state = is; // will interrupt blocking functions if we quit! url_set_interrupt_cb(decode_interrupt_cb); // Open video file if(av_open_input_file(&pFormatCtx, is->filename, NULL, 0, NULL)!=0) return -1; // Couldn't open file is->pFormatCtx = pFormatCtx; // Retrieve stream information if(av_find_stream_info(pFormatCtx)<0) return -1; // Couldn't find stream information // Dump information about file onto standard error dump_format(pFormatCtx, 0, is->filename, 0); // Find the first video stream for(i=0; i<pFormatCtx->nb_streams; i++) { if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO && video_index < 0) { video_index=i; } if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_AUDIO && audio_index < 0) { audio_index=i; } } if(audio_index >= 0) { stream_component_open(is, audio_index); } if(video_index >= 0) { stream_component_open(is, video_index); } if(is->videoStream < 0 || is->audioStream < 0) { fprintf(stderr, "%s: could not open codecs\n", is->filename); goto fail; } // main decode loop for(;;) { if(is->quit) { break; } // seek stuff goes here if(is->audioq.size > MAX_AUDIOQ_SIZE || is->videoq.size > MAX_VIDEOQ_SIZE) { SDL_Delay(10); continue; } if(av_read_frame(is->pFormatCtx, packet) < 0) { if(url_ferror(pFormatCtx->pb) == 0) { SDL_Delay(100); continue; } else { break; } } // Is this a packet from the video stream? if(packet->stream_index == is->videoStream) { packet_queue_put(&is->videoq, packet); } else if(packet->stream_index == is->audioStream) { packet_queue_put(&is->audioq, packet); } else { av_free_packet(packet); } } while(!is->quit) { SDL_Delay(100); } fail: { SDL_Event event; event.type = FF_QUIT_EVENT; event.user.data1 = is; SDL_PushEvent(&event); } return 0; } int main(int argc, char *argv[]) { SDL_Event event; VideoState *is; is = (VideoState *)av_mallocz(sizeof(VideoState)); if(argc < 2) { fprintf(stderr, "Usage: test <file>\n"); exit(1); } // Register all formats and codecs av_register_all(); if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) { fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError()); exit(1); } // Make a screen to put our video #ifndef __DARWIN__ screen = SDL_SetVideoMode(640, 480, 0, 0); #else screen = SDL_SetVideoMode(640, 480, 24, 0); #endif if(!screen) { fprintf(stderr, "SDL: could not set video mode - exiting\n"); exit(1); } //pstrcpy(is->filename, sizeof(is->filename), argv[1]); strcpy(is->filename,argv[1]); is->pictq_mutex = SDL_CreateMutex(); is->pictq_cond = SDL_CreateCond(); schedule_refresh(is, 40); is->parse_tid = SDL_CreateThread(decode_thread, is); if(!is->parse_tid) { av_free(is); return -1; } for(;;) { SDL_WaitEvent(&event); switch(event.type) { case FF_QUIT_EVENT: case SDL_QUIT: is->quit = 1; SDL_Quit(); exit(0); break; case FF_ALLOC_EVENT: alloc_picture(event.user.data1); break; case FF_REFRESH_EVENT: video_refresh_timer(event.user.data1); break; default: break; } } return 0; } 你帮我看一下######你有没有最新的ffmpeg转码示范代码啊######回复 @Jack.arain : 给我一个示范代码好不,这上面的代码是一个示范代码,我把 avcodec_decode_audio3,######看了下代码, 不知道你用的是哪个版本的ffmpeg, 但你这个代码是非常老的了, 另外, 在ffmpeg后期的版本中, avcodec_decode_audio函数可能解码出来的数据要比实际的数据要长, 需要使用av_samples_get_buffer_size来获得实际大小.###### C++我不懂,不过音视频解码的内核我写过不少。如果内核解别的不出错,那么噪音基本来源于输出的音频PCM的BUF不干净或者输入的频段信息有缺失,某个通道没有数据进入。前者你的输出BUF可能被别的代码(包括解码本身)写操作过。你查下有没有内存泄露的问题。后者,是你的输入不全的问题。更大概率是后者。前者要定期加入噪音的概率还是比较小。 这类问题的检测方法是外围做最简单的调用。验证调用方法和内核模块都没有问题。然后再堆叠其他系统模块上去。 ######的确是旧的代码,现在新的都用上了avcodec_decode_audio4了,你的ffmpeg库是什么版本的,新的版本有libswresample,可以帮你的音频做重采样,这样播放出来就不会有噪声了,如果想看事例代码,就看你的ffmpeg源码里的ffplay.c吧,里面的接口都和你的ffmpeg对应的,看看人家是怎么处理音频的,希望对你有用。

爱吃鱼的程序员 2020-06-05 13:33:51 0 浏览量 回答数 0

问题

第6篇 指针数组字符串(下)补充:报错

kun坤 2020-06-08 11:02:03 3 浏览量 回答数 1

问题

RSA加密解密报错Data must not be longer than 11?400报错

爱吃鱼的程序员 2020-06-08 09:57:04 0 浏览量 回答数 1

问题

sonarqube 分析C++ 代码时,为什么无法检测出问题403.10 禁止访问:配置无效 

kun坤 2020-05-27 21:28:09 16 浏览量 回答数 1

回答

include 包含其他库、类、接口等的头文件。预处理器实际上就只是把整个头文件复制到你的源代码里面 (是的,这就是包含防御之所以是件好事的原因了). define 谁会不喜欢宏呢! 预处理器会把所有定义的实体替换成被定义的代码. 定义会一直持续直到发现这个定义的 #undef 指令. ifdef 条件行为告诉预处理器包含在遇到声明的条件成立的条件块中的代码. 你可以就像if-else语句一样使用它们,从这里面选择: #ifdef, #ifndef, #if, #else, 以及 #elif, 而你总是要使用一个 #endif 作为结束。leoxuleoxu翻译于 1年前0人顶顶 翻译的不错哦! error #warning 用来向用户发送消息。预处理器会在 #error 处, 而不会在 #warning 处停下来. 两种情况下他都会发送他在指令背后(的括号里面)发现的字符串, 发送到屏幕作为输出,因此它是一种确保针对你的平台一切OK的手动方式. line 用来在你遇到编译错误时修改显示的错误行号和文件名. 例如,加入你需要查看一个来自编译的中间文件的源文件(可能是自动生成的). pragma 其它由编译器解释的特殊指令。你的编译器文档会告诉你指令是怎么用的,而你不要假定他们在全世界都通用哦.leoxuleoxu翻译于 1年前0人顶顶 翻译的不错哦! assert #unassert 这些在老程序里面总是特别受欢迎的 (好吧,只要我也曾经为这样一个程序工作过), 但是它们在现在已经过时了。强烈建议不使用它们,这意味着不要把他们放到新的代码里面预定义宏 有许多可以利用的预定义宏:FILE 给出一个字符串的文件名LINE 给出当前的行号(整型)DATE 当前编译日期的字符串TIME 当前编译时间的字符串STDC 同编译器相关的,但常常被定义成1,以声明同ISO C标准兼容.__cplusplus 在编译一个C++程序是总是会被定义特别是开头两个在调试时真的非常有用。只要拿出它们俩,不用你自己编写文件和行处理类,就能神奇的让你获得丰富的信息输出.leoxuleoxu翻译于 1年前0人顶顶 翻译的不错哦!你的编译器可能还支持其它的宏,例如,你这从 这里 获得(面向GCC)的整个宏清单.那么当你运行预处理器时实际会发生什么呢? 替换所有的三字母组合,我会在将来的一篇文章中谈论到他,因为尽管他只是一个历史上的特性(而且你也要在GCC中对它进行切换),它仍让是很有趣的. 将并列的源代码分成多行. 移除所有的注释并用一个空格替换. 处理(我们上面讲到的)的预处理器指令。对于 #include, 他会在新文件上递归执行1 - 3步 :-) 处理转义序列. 把文件发送给编译器 如果你想看看预处理之后你的文件会是什么样子 (谁不想呢?),你可以向 gcc 传入 -E 选项. 这将会想stdout标准输出发送预处理过的源代码,并且没有编译和连接就直接终止gcc命令的执行。具体实例如下:`1g++ -E myfile.cpp`你也可以使用这个参数:`1-save-temps`编译的后会有一份临时文件。拿下面这个简单的程序说吧: 1#include <stdio.h> 2 3#define ONE 1 4#define TWO 2 5 6int main() 7{ 8 printf("%d, %d\n", ONE, TWO); 9 return 0; 10} 用下面这行命令编译`1g++ hello.cpp -save-temps`编译完后, 会在文件夹中生成两个文件: hello.s 和 hello.iihello.s 里面是汇编代码, 而 hello.ii 则是预处理过后的源代码。用文本编辑器打开 hello.ii , 你会发现多出许多代码. 那是因为 #include 指令把 stdio 头文件的代码加进去了。如果你把滚动条拉到最底下, 就会发现, printf 那一行的宏定义 ONE 和 TWO 已经被预处理器替换成 1 和 2 了 .神奇吧!其实它只是在编译的时候, 把你的源代码文件复制一份, 当作临时文件, 然后把里面的预处理指令替换掉. 用完后就把这个临时文件删了. 所以一般情况下我们不知道这个文件的存在.

a123456678 2019-12-02 01:56:33 0 浏览量 回答数 0

回答

Re关于RDS的性能 ping的数据如下: ds.aliyuncs.com (ip) 56(84) bytes of data. 64 bytes from ip: icmp_req=1 ttl=54 time=1.21 ms 64 bytes from ip: icmp_req=2 ttl=54 time=1.21 ms 64 bytes from ip: icmp_req=3 ttl=54 time=1.23 ms 64 bytes from ip: icmp_req=4 ttl=54 time=1.20 ms 看起来还好 ------------------------- 回1楼小猪猪的帖子 嗯,我试试用hibernate 2nd level cache,减少数据库的直接访问 ------------------------- 回2楼mayle的帖子 ping的数据还好,1.x ms 那现在的解释可能是,链接建立时间? 我是新手,配置mysql有个connection pool,这算是使用了长连接吗? 谢谢! ------------------------- 回7楼mayle的帖子 我用的java melody做的profiling 今天我打开了memcache,从而减少数据库访问,request的处理时间明显下降。 进一步说明,确实是因为访问数据库造成了性能下降。 另外,值得注意的是:数据库操作时间跟数据库sql hit的个数呈线性关系(我观察了大概10几个request,需要我也可以贴图),大概一个hit需费时4ms;这说明应该不是短长链接引起的; 我截了图,只放了一个request的数据;第一行是memcache打开之前的,第二行是memcache打开之后的数据。 ------------------------- Re关于RDS的性能 忘了说了,最后两列是数据库相关的。其中,最后一列是ms,倒数第二列是sql hit count 第四列绿色的数字,是request总耗时。 ------------------------- 回11楼mayle的帖子 刚刚申请加入了,能否帮忙转贴下分析结果。我现在进去,之前的聊天记录我应该看不到的吧 ------------------------- Re关于RDS的性能 我刚刚弄了一张最小的表,然后在RDS以及本地的数据库上都通过rest api进行操作,每个操作都只是简单的一个select 数据如下 第一行是数据库在RDS的性能,可以明显看到每个sql hit的mean time为3ms 第二行是数据库在本地(本地是个性能非常一般的机器),每个sqlhit的mean time为0(说明小于1ms) 期待大牛解释 ------------------------- Re关于RDS的性能 #include <mysql/mysql.h>#include <stdio.h>#include <unistd.h>#include <time.h>int main(void) {   MYSQL *conn;   MYSQL_RES *res;   MYSQL_ROW row;  /* Change me */   char *server = "rdsql.rds.aliyuncs.com";   char *user = "userXXX";   char *password = "XXXXX";   char *database = "XXXX";      conn = mysql_init(NULL);      /* Connect to database */   if (!mysql_real_connect(conn, server,         user, password, database, 0, NULL, 0)) {      fprintf(stderr, "%s\n", mysql_error(conn));      exit(1);   }      struct timeval start, end;   long secs_used,micros_used;   gettimeofday(&start, NULL);   char *sql_cmd = "SELECT * FROM user where id=11";   /* send SQL query */   if (mysql_query(conn, sql_cmd)) {      fprintf(stderr, "%s\n", mysql_error(conn));      exit(1);   }   gettimeofday(&end, NULL);   printf("start: %d secs, %d usecs\n",start.tv_sec,start.tv_usec);   printf("end: %d secs, %d usecs\n",end.tv_sec,end.tv_usec);   secs_used=(end.tv_sec - start.tv_sec); //avoid overflow by subtracting first   micros_used= ((secs_used*1000000) + end.tv_usec) - (start.tv_usec);   printf("Execute SQL %s micros_used: %d\n",sql_cmd, micros_used);   res = mysql_use_result(conn);   int num_fields = mysql_num_fields(res);   /* output table name */   printf("Result of %s is :\n", sql_cmd);   while ((row = mysql_fetch_row(res)) != NULL) {      int i;      for (i = 0; i < num_fields; i++) {          printf("%s ", row ? row : "NULL");      }      printf("\n");   }   /* close connection */   mysql_free_result(res);   mysql_close(conn);    return 0;} ------------------------- Re关于RDS的性能 gcc -o select_one_row mysql_select_one_row.c -lmysqlclient------------------------- Re关于RDS的性能 总结一下,使用RDS,肯定会比local的mysql要慢。具体是一个sql select操作,RDS大概会费时3到4ms,而local的mysql server,大概是0.4到0.5ms。原因应该就是网络延迟,ping rds大概是1.3ms;本来我不理解的是,local的0.4ms 加上网络延迟1.3ms,到了RDS最多也就是2ms,怎么会变成3到4ms;可能的解释是,ping也就是一个来回,而且是比较简单的网络协议;sql操作可能会涉及到一些握手行为,多加一个来回,就是多1ms多。------------------------- Re关于RDS的性能 嗯,看我代码,profile相关的代码,只是包含了select 操作,没有包含建立链接以及关闭链接------------------------- 回23楼joyzheng的帖子 第一个问题见20楼第二个问题,我的理解,是的------------------------- Re关于RDS的性能 最后回复下21楼,2000次的select,平均下来的sql操作也是3.x msstart: 1410340266 secs, 704180 usecsend: 1410340274 secs, 412382 usecsExecute SQL SELECT * FROM user where id=%d 2000 times, average micros_used: 3854  

打靶归来 2019-12-02 00:19:53 0 浏览量 回答数 0

问题

Java web网站含图片的表单上传问题

蛮大人123 2019-12-01 20:00:59 1572 浏览量 回答数 3

回答

把配置文件拿出来看看? ###### 引用来自“李玉珏”的评论把配置文件拿出来看看? <?xml version="1.0" encoding="UTF8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <!-- Set to true to enable distributed class loading for examples, default is false. --> <property name="peerClassLoadingEnabled" value="true"/> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <!-- Ignite provides several options for automatic discovery that can be used instead os static IP based discovery. For information on all options refer to our documentation: http://apacheignite.readme.io/docs/cluster-config --> <!-- Uncomment static IP finder to enable static-based discovery of initial nodes. --> <!--<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">--> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"> <property name="addresses"> <list> <!-- In distributed environment, replace with actual host IP address. --> <value>127.0.0.1:48500..48509</value> </list> </property> </bean> </property> </bean> </property> <!-- Explicitly configure TCP communication SPI changing local port number for the nodes from the first cluster. --> <property name="communicationSpi"> <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi"> <property name="localPort" value="48100"/> </bean> </property> <!-- Enable task execution events for examples. --> <property name="includeEventTypes"> <list> <!--Task execution events--> <util:constant static-field="org.apache.ignite.events.EventType.EVT_TASK_STARTED"/> <util:constant static-field="org.apache.ignite.events.EventType.EVT_TASK_FINISHED"/> <util:constant static-field="org.apache.ignite.events.EventType.EVT_TASK_FAILED"/> <util:constant static-field="org.apache.ignite.events.EventType.EVT_TASK_TIMEDOUT"/> <util:constant static-field="org.apache.ignite.events.EventType.EVT_TASK_SESSION_ATTR_SET"/> <util:constant static-field="org.apache.ignite.events.EventType.EVT_TASK_REDUCED"/> <!--Cache events--> <util:constant static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_PUT"/> <util:constant static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_READ"/> <util:constant static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_REMOVED"/> </list> </property> </bean> <bean id="igniteCacheFactory" class="com.ignite.IgniteCacheFactory"> <constructor-arg index="0" ref="typesMap" /> <constructor-arg index="1" ref="queryEntitiesMap" /> <constructor-arg index="2" ref="ignite.cfg" /> <constructor-arg index="3" value="REPLICATED" /> </bean> <bean id="typesMap" class="com.ignite.TypesMap"> <property name="list"> <list> <bean class="org.apache.ignite.cache.store.jdbc.JdbcType"> <property name="databaseSchema" value="mishu"/> <property name="databaseTable" value="cert_aqrz_copy"/> <property name="keyType" value="com.toubiaomishu.mojo.CertAqrzCopyKey"/> <property name="valueType" value="com.toubiaomishu.mojo.CertAqrzCopy"/> <property name="keyFields"> <list> <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> <property name="databaseFieldType"> <util:constant static-field="java.sql.Types.VARCHAR"/> </property> <property name="databaseFieldName" value="srcUUid"/> <property name="javaFieldType" value="java.lang.String"/> <property name="javaFieldName" value="srcuuid"/> </bean> </list> </property> <property name="valueFields"> <list> <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> <property name="databaseFieldType"> <util:constant static-field="java.sql.Types.VARCHAR"/> </property> <property name="databaseFieldName" value="srcUUid"/> <property name="javaFieldType" value="java.lang.String"/> <property name="javaFieldName" value="srcuuid"/> </bean> <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> <property name="databaseFieldType"> <util:constant static-field="java.sql.Types.VARCHAR"/> </property> <property name="databaseFieldName" value="secureLevel"/> <property name="javaFieldType" value="java.lang.String"/> <property name="javaFieldName" value="securelevel"/> </bean> <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> <property name="databaseFieldType"> <util:constant static-field="java.sql.Types.VARCHAR"/> </property> <property name="databaseFieldName" value="secureRank"/> <property name="javaFieldType" value="java.lang.String"/> <property name="javaFieldName" value="securerank"/> </bean> <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> <property name="databaseFieldType"> <util:constant static-field="java.sql.Types.VARCHAR"/> </property> <property name="databaseFieldName" value="yxqTime"/> <property name="javaFieldType" value="java.lang.String"/> <property name="javaFieldName" value="yxqtime"/> </bean> <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> <property name="databaseFieldType"> <util:constant static-field="java.sql.Types.VARCHAR"/> </property> <property name="databaseFieldName" value="zhUUid"/> <property name="javaFieldType" value="java.lang.String"/> <property name="javaFieldName" value="zhuuid"/> </bean> </list> </property> </bean> </list> </property> </bean> <bean id="queryEntitiesMap" class="com.ignite.QueryEntitiesMap"> <property name="list"> <list> <bean class="org.apache.ignite.cache.QueryEntity"> <property name="keyType" value="com.toubiaomishu.mojo.CertAqrzCopyKey"/> <property name="valueType" value="com.toubiaomishu.mojo.CertAqrzCopy"/> <property name="fields"> <util:map map-class="java.util.LinkedHashMap"> <entry key="srcuuid" value="java.lang.String"/> <entry key="securelevel" value="java.lang.String"/> <entry key="securerank" value="java.lang.String"/> <entry key="yxqtime" value="java.lang.String"/> <entry key="zhuuid" value="java.lang.String"/> </util:map> </property> <property name="indexes"> <list> <bean class="org.apache.ignite.cache.QueryIndex"> <property name="name" value="PRIMARY"/> <property name="indexType"> <util:constant static-field="org.apache.ignite.cache.QueryIndexType.SORTED"/> </property> <property name="fields"> <map> <entry key="srcuuid" value="true"/> </map> </property> </bean> <bean class="org.apache.ignite.cache.QueryIndex"> <property name="name" value="srcUUid"/> <property name="indexType"> <util:constant static-field="org.apache.ignite.cache.QueryIndexType.SORTED"/> </property> <property name="fields"> <map> <entry key="srcuuid" value="true"/> <entry key="yxqtime" value="true"/> <entry key="zhuuid" value="true"/> </map> </property> </bean> </list> </property> </bean> </list> </property> </bean> <!-- Datasource for sample in-memory mysql database. --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mishu?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"/> <property name="username" value="root"/> <property name="password" value="5201128blue"/> <!-- 连接池启动时的初始值 --> <property name="initialSize" value="10"/> <!-- 连接池的最大值 --> <property name="maxActive" value="100"/> <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 --> <property name="maxIdle" value="10"/> <!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 --> <property name="minIdle" value="5"/> <property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" value="10"/> <property name="testWhileIdle"> <value>true</value> </property> <property name="testOnBorrow"> <value>true</value> </property> <property name="testOnReturn"> <value>true</value> </property> <property name="validationQuery"> <value>SELECT 1</value> </property> <property name="validationQueryTimeout"> <value>1</value> </property> <property name="timeBetweenEvictionRunsMillis"> <value>3600000</value> </property> <property name="minEvictableIdleTimeMillis"> <value>60000</value> </property> <property name="numTestsPerEvictionRun"> <value>5</value> </property> </bean> </beans> package com.ignite; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.Ignition; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory; import org.apache.ignite.cache.store.jdbc.JdbcType; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; //这个类根据JdbcType和QueryEntity创建缓存 public class IgniteCacheFactory { public IgniteCacheFactory(TypesMap typesMap,QueryEntitiesMap queryEntitiesMap,IgniteConfiguration conf,CacheMode cacheMode){ init(typesMap.getList(),queryEntitiesMap,conf,cacheMode); } public void init(List<JdbcType> list,QueryEntitiesMap queryEntitiesMap,IgniteConfiguration conf,CacheMode cacheMode) { CacheConfiguration[] cacheConflist = new CacheConfiguration[list.size()]; for(int i=0;i<list.size();i++){ JdbcType qe=list.get(i); String cacheName=qe.getDatabaseTable(); qe.setCacheName(cacheName); String valueType=qe.getValueType(); CacheConfiguration cfg=IgniteCacheConfigurationFactory.create(cacheName); CacheJdbcPojoStoreFactory sf= new CacheJdbcPojoStoreFactory(); sf.setDataSourceBean("dataSource"); sf.setTypes(qe); cfg.setCacheMode(cacheMode);//CacheMode.PARTITIONED cfg.setCacheStoreFactory(sf); cacheConflist[i]=cfg; List<QueryEntity> qlist=new ArrayList<>(); qlist.add(queryEntitiesMap.get(valueType)); cfg.setQueryEntities(qlist); } conf.setCacheConfiguration(cacheConflist); System.out.println("----------------->>------------------"); } } ######你开启那么多事件做什么呢?###### 调用任务代码,先加载,在执行分布式任务: public static void main(String[] args) throws IgniteException{ //Ignition.setClientMode(true); Ignite ignite=Ignition.start("ignite2.xml"); IgniteCluster cluster = ignite.cluster(); // 启动之后调用,直接加载所有定的表数据进缓存 Object[] list= (Object[]) ignite.cacheNames().toArray(); for(int i=0;i<list.length;i++){ String cacheName=String.valueOf(list[i]); IgniteCache cahce= ignite.cache(cacheName); cahce.loadCache(null); } CreditCalculate c=new CreditCalculate(); c.setGc(3); c.setSc(5); c.setGb(new BigDecimal(20)); c.setSb(new BigDecimal(20)); c.setSqlstr("(SELECT.... THEN ...."); c.setAq("1"); c.setIdd(new BigDecimal(3)); c.setProjTy("房程"); c.setXydjDqq("xydjDqq"); IgniteCompute compute = ignite.compute(cluster.forRemotes()); // Execute task on the clustr and wait for its completion. List<String> cnt = compute.execute(CreditCalculateTask.class,c); //System.out.println(">>> Total number of characters in the phrase is '" + cnt.size() + "'."); //System.out.println(">>>"+ cnt.get(0)); System.out.println("----------------mapreduce end-------------------"); } ###### 引用来自“李玉珏”的评论把配置文件拿出来看看? 半夜醒来:会不会是因为我缓存是在任务外声明的,所以执行任务是引用都是同一台机器上的缓存 // Inject Ignite instance. @IgniteInstanceResource private Ignite ignite; IgniteCache certSrcCache = ignite.cache("cert_src");//******这里声明 @Override public List<ComputeJob> split(int gridSize, CreditCalculate arg) { List<ComputeJob> jobs = new ArrayList<>(); SqlQuery sql2 = new SqlQuery(CertSrc.class, "from ..."); QueryCursor<Cache.Entry<Long, CertSrc>> companyList = certSrcCache.query(sql2); ... for (Cache.Entry<Long, CertSrc> e : companyList) { jobs.add(new ComputeJobAdapter() { @Override public Object execute() { .... SqlFieldsQuery sql = new SqlFieldsQuery(sql1); try (QueryCursor<List<?>> cursor = certSrcCache.query(sql)) {//*******这里在ComputeJobAdapter内部引用 ######回复 @fir01 : 如果默认的端口被占用的话,会使用一个随机的端口,我估计你看看节点启动时的控制台输出应该会有的。######回复 @fir01 : 任务数没有数量限制,这个看你的内存配置了。######回复 @李玉珏 : 端口好像是随机的,怎么从本机访问远程机器的h2控制台,或者在哪里配置固定的端口呢?######回复 @李玉珏 : 谢谢回复。好像是搞定了,估计mapReduce有bug或者要配置,在ubuntu里面就是单线程的,windows是多线程。换executorService就都可以异步多线程了,但是ubuntu里面执行看打印还是会执行一会就停个6秒,为什么呢?是不是存放任务的队列有大小限制?任务总数10823######回复 @fir01 : SHARED是默认的部署模式。###### 我想我还要测试一下是不是我本机发送任务速度慢。7519个任务1秒钟就发送完毕。######任务数不要太多,你可以换一个维度,控制下任务的总数量,大量的任务处于排队状态,是很占用资源的。######都是用ignite自己的broadcast方法异步发布任务就又快又流畅,无卡顿现象。看样子非官方的,说可以用的东西最好别用。

kun坤 2020-06-06 23:16:57 0 浏览量 回答数 0

问题

深入理解Magento – 第六章 – 高级Magento模型 :报错

kun坤 2020-06-14 15:19:25 0 浏览量 回答数 1

问题

深入理解Magento – 第六章 – 高级Magento模型:配置报错 

kun坤 2020-06-02 14:47:07 2 浏览量 回答数 1

问题

深入理解Magento – 第六章 – 高级Magento模型 - Magento报错

montos 2020-06-03 20:30:01 2 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站