vs调用其他c.pp中的函数

有个mian.cpp
里面有main函数
main函数中调用了一个function,
这个function我写在另一个binary.cpp。
main中include“binary.cpp”
编译时候提醒已经在 binary.obj 中定义

5个回答

函数声明一定要定义在.h中吗?

找一个简单的多cpp的工程看看它怎么实现的吧,一看就应该会了。

不能包含cpp 需要include h文件来申明函数

给binary写一个对应的.h文件,include这个.h文件

1。写.h文件
2。在main.cpp中声明这个函数,不要包含那个cpp,只需要声明一下,然后所有cpp一起连接(VS的IDE会自动处理连接这步,如果用VS的命令行需要手动或自己写makefile连接)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
为什么Point类的无参数构造函数无法调用?还有根据题意我应该在CRect的构造函数里面写些什么?有没有一种可能能在CRect的构造函数中调用CRect的成员函数?
![图片说明](https://img-ask.csdn.net/upload/202003/26/1585225574_353637.png) /*7.定义一个点类Point,包括x坐标和y坐标(int)。 定义一个CRect类,代表一个矩形, 要求CRect类中有代表矩形的左上角坐标(x1,y1) 和右下角坐标(x2,y2)点类的对象, 要求CRect类中有两个成员函数RectHeight()和RectWidth(), 通过这两个函数能得到矩形的高和宽; 此外还需要有求此矩形面积的成员函数。 要求每个类至少有两个以上构造函数, 在main函数中测试他门的每一个成员函数。 注:只考虑四条边和横纵轴垂直平行的矩形。*/ ``` #include <iostream> #include <math.h> using namespace std; /*与7.3相比较 为什么Point类的无参数构造函数无法调用? 应该在CRect的构造函数里面写些什么?*/ class Point{ //定义一个点类Point public: Point() { x=0; y=0; cout<<"calling the constructor"<<endl; cout<<"(x,y)为"<<"("<<x<<","<<y<")"; } Point(int xx=0,int yy=0) //Point类的构造函数 { x=xx; y=yy; cout<<"calling the constructor"<<endl; cout<<"(x,y)为"<<"("<<x<<","<<y<")"; } int getX(){ return x; } int getY(){ return y; } private: int x,y; }; class CRect{ //定义一个CRect类 public: CRect(); //无参数的构造函数 CRect(Point p,Point p1); //有参数的构造函数 int RectHeight(); //得到矩形的高 int RectWidth(); //得到矩形的宽 int RectArea(); //得到矩形的面积 private: Point p,p1; }; CRect::CRect(Point pp,Point pp1):p(pp),p1(pp1) { cout<<"calling the constructor"<<endl; } int CRect::RectHeight() { int H=0; H=abs(p.getY()-p1.getY()); return H; } int CRect::RectWidth() { int W=0; W=abs(p.getX()-p1.getX()); return W; } int CRect::RectArea() { int A=0; A=abs((p.getY()-p1.getY())*(p.getX()-p1.getX())); return A; } int main(int argc, char** argv) { int x,y; int x1,y1; cin>>x>>y; cin>>x1>>y1; Point a; //?????? Point p(x,y); //调用Point的构造函数 Point p1(x1,y1); CRect c(p,p1); //调用CRect的构造函数 int H=0,W=0,A=0; H=c.RectHeight(); cout<<"矩形的高为"<<H<<endl; W=c.RectWidth(); cout<<"矩形的宽为"<<W<<endl; A=c.RectArea(); cout<<"矩形的面积为"<<A<<endl; return 0; } ```
(1,0)是怎么来的?我只调用了一次Point类的无参数的构造函数啊
![图片说明](https://img-ask.csdn.net/upload/202003/27/1585276048_254613.png)![图片说明](https://img-ask.csdn.net/upload/202003/27/1585276082_162164.png) ``` #include <iostream> #include <math.h> using namespace std; /*与7.3相比较 为什么Point类的无参数构造函数都无法调用? 应该在CRect的构造函数里面写些什么? 有没有一种可能能在CRect的构造函数中调用CRect的成员函数?*/ class Point{ //定义一个点类Point public: /* Point() { x=0; y=0; cout<<"calling the constructor"<<endl; cout<<"(x,y)为"<<"("<<x<<","<<y<")"; }*/ //简化上述代码 Point() { Point(0,0); cout<<"calling the constructor"<<endl; cout<<"(x,y)为"<<"("<<x<<","<<y<<")"<<endl; } Point(int xx,int yy):x(xx),y(yy) //Point类的构造函数 { /* x=xx; y=yy;合成到构造函数的声明里面*/ cout<<"calling the constructor"<<endl; cout<<"(x,y)为"<<"("<<x<<","<<y<<")"<<endl; } int getX(){ return x; } int getY(){ return y; } private: int x,y; }; class CRect{ //定义一个CRect类 public: CRect(); //无参数的构造函数 CRect(Point p,Point p1); //有参数的构造函数 int RectHeight(); //得到矩形的高 int RectWidth(); //得到矩形的宽 int RectArea(); //得到矩形的面积 private: Point p,p1; }; CRect::CRect(Point pp,Point pp1):p(pp),p1(pp1) { cout<<"calling the constructor"<<endl; } int CRect::RectHeight() { int H=0; H=abs(p.getY()-p1.getY()); return H; } int CRect::RectWidth() { int W=0; W=abs(p.getX()-p1.getX()); return W; } int CRect::RectArea() { int A=0; A=abs((p.getY()-p1.getY())*(p.getX()-p1.getX())); return A; } int main(int argc, char** argv) { int x,y; int x1,y1; cin>>x>>y; cin>>x1>>y1; Point a; //?????? /*因为 Point() 和 Point(int x=0,int y=0) 两个混淆了。 编译器遇到 Point p不知道是调用p()好,还是p(x=0,y=0)好。*/ Point p(x,y); //调用Point的构造函数 Point p1(x1,y1); CRect c(p,p1); //调用CRect的构造函数 int H=0,W=0,A=0; H=c.RectHeight(); cout<<"矩形的高为"<<H<<endl; W=c.RectWidth(); cout<<"矩形的宽为"<<W<<endl; A=c.RectArea(); cout<<"矩形的面积为"<<A<<endl; return 0; } ```
CRect的成员函数可以不带参数是不是因为已经定义了私有数据成员Point p,p1?还有,请问有任何建议给我的代码吗》
/*7.定义一个点类Point,包括x坐标和y坐标(int)。 定义一个CRect类,代表一个矩形, 要求CRect类中有代表矩形的左上角坐标(x1,y1) 和右下角坐标(x2,y2)点类的对象, 要求CRect类中有两个成员函数RectHeight()和RectWidth(), 通过这两个函数能得到矩形的高和宽; 此外还需要有求此矩形面积的成员函数。 要求每个类至少有两个以上构造函数, 在main函数中测试他门的每一个成员函数。 注:只考虑四条边和横纵轴垂直平行的矩形。*/ 带参数的代码: ``` #include <iostream> #include <math.h> using namespace std; class Point{ //定义一个点类Point public: Point() { x=0; y=0; cout<<"calling the constructor"<<endl; cout<<"(x,y)为"<<"("<<x<<","<<y<")"; } Point(int xx=0,int yy=0) //Point类的构造函数 { x=xx; y=yy; cout<<"calling the constructor"<<endl; cout<<"(x,y)为"<<"("<<x<<","<<y<")"; } int getX(){ return x; } int getY(){ return y; } private: int x,y; }; class CRect{ //定义一个CRect类 public: CRect(); //无参数的构造函数 CRect(Point p,Point p1); //有参数的构造函数 int RectHeight(Point pp,Point pp1); //得到矩形的高 int RectWidth(Point pp,Point pp1); //得到矩形的宽 int RectArea(Point p,Point p1); //得到矩形的面积 private: Point p,p1; }; CRect::CRect(Point pp,Point pp1):p(pp),p1(pp1) { cout<<"calling the constructor"<<endl; } int CRect::RectHeight(Point p,Point p1) { int H=0; H=abs(p.getY()-p1.getY()); return H; } int CRect::RectWidth(Point p,Point p1) { int W=0; W=abs(p.getX()-p1.getX()); return W; } int CRect::RectArea(Point p,Point p1) { int A=0; A=abs((p.getY()-p1.getY())*(p.getX()-p1.getX())); return A; } int main(int argc, char** argv) { int x,y; int x1,y1; cin>>x>>y; cin>>x1>>y1; Point p(x,y); //调用Point的构造函数 Point p1(x1,y1); CRect c(p,p1); //调用CRect的构造函数 int H=0,W=0,A=0; H=c.RectHeight(p,p1); cout<<"矩形的高为"<<H<<endl; W=c.RectWidth(p,p1); cout<<"矩形的宽为"<<W<<endl; A=c.RectArea(p,p1); cout<<"矩形的面积为"<<A<<endl; return 0; } ``` 不带参数的代码: ``` #include <iostream> #include <math.h> using namespace std; class Point{ //定义一个点类Point public: Point() { x=0; y=0; cout<<"calling the constructor"<<endl; cout<<"(x,y)为"<<"("<<x<<","<<y<")"; } Point(int xx=0,int yy=0) //Point类的构造函数 { x=xx; y=yy; cout<<"calling the constructor"<<endl; cout<<"(x,y)为"<<"("<<x<<","<<y<")"; } int getX(){ return x; } int getY(){ return y; } private: int x,y; }; class CRect{ //定义一个CRect类 public: CRect(); //无参数的构造函数 CRect(Point p,Point p1); //有参数的构造函数 int RectHeight(); //得到矩形的高 int RectWidth(); //得到矩形的宽 int RectArea(); //得到矩形的面积 private: Point p,p1; }; CRect::CRect(Point pp,Point pp1):p(pp),p1(pp1) { cout<<"calling the constructor"<<endl; } int CRect::RectHeight() { int H=0; H=abs(p.getY()-p1.getY()); return H; } int CRect::RectWidth() { int W=0; W=abs(p.getX()-p1.getX()); return W; } int CRect::RectArea() { int A=0; A=abs((p.getY()-p1.getY())*(p.getX()-p1.getX())); return A; } int main(int argc, char** argv) { int x,y; int x1,y1; cin>>x>>y; cin>>x1>>y1; Point p(x,y); //调用Point的构造函数 Point p1(x1,y1); CRect c(p,p1); //调用CRect的构造函数 int H=0,W=0,A=0; H=c.RectHeight(); cout<<"矩形的高为"<<H<<endl; W=c.RectWidth(); cout<<"矩形的宽为"<<W<<endl; A=c.RectArea(); cout<<"矩形的面积为"<<A<<endl; return 0; } ```
MVC开发模式,javabean中函数if分支语句好像不起作用?换成switch-case就正确了,为什么?
MVC开发模式,javabean中函数if分支语句好像不起作用?换成switch-case就正确了,为什么? javabean中代码: ``` package javabean; public class Fs { private double x; private double y; public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } public Fs(double x, double y) { this.x = x; this.y = y; } public Fs() {} public Fs opp(Fs c,String op) { double j = 0; double i = 0; switch(op) { case "+" : j=this.x+c.x; i=this.y+c.y; break; case "-" : j=this.x-c.x; i=this.y-c.y; break; case "*" : j=(this.x*c.x)-(this.y*c.y); i=(this.y*c.x)+(this.x*c.y); break; case "/" : j=(this.x*c.x+this.y*c.y)/((c.x*c.x)+(c.y*c.y)); i=((this.y*c.x)-(this.x*c.y))/((c.x*c.x)+(c.y*c.y)); break; } return new Fs(j,i); } public String pp() { String r=null; if(y!=0) { if(y>0) r=""+x+"+"+y+"i"; else r=""+x+y+"i"; } else r=""+x; return r; } //以下是计算函数的修改过程,错误原因应该都是c3没有正确的调用函数 //在if分支语句好像并不起作用,换成switch-case则正确,原因? /* 第一版本 public Fs add(Fs c) { double j=this.x+c.x; double i=this.y+c.y; Fs m = new Fs(j,i); return m; } public Fs subtract(Fs c) { double j=this.x-c.x; double i=this.y-c.y; Fs m = new Fs(j,i); return m; } public Fs mutiply(Fs c) { //(ac-bd)+(bc+ad)i double j=(this.x*c.x)-(this.y*c.y); double i=(this.y*c.x)+(this.x*c.y); Fs m = new Fs(j,i); return m; } public Fs divide(Fs c) { //(a+bi)/(c+di)=(ac+bd)/(c2+d2) +((bc-ad)/(c2+d2))i double j=(this.x*c.x+this.y*c.y)/((c.x*c.x)+(c.y*c.y)); double i=((this.y*c.x)-(this.x*c.y))/((c.x*c.x)+(c.y*c.y)); Fs m = new Fs(j,i); return m; } */ /* 第三版本 public Fs opp(Fs c,String op) { if(op=="+") { return new Fs(this.x+c.x,this.y+c.y); } if(op=="-") { return new Fs(this.x-c.x,this.y-c.y); } } */ /* 第二版本 public Fs opp(Fs c,String op) { if(op=="+") { j=this.x+c.x; i=this.y+c.y; return new Fs(this.x+c.x,this.y+c.y); } if(op=="-") { j=this.x-c.x; i=this.y-c.y; } if(op=="*") { j=(this.x*c.x)-(this.y*c.y); i=(this.y*c.x)+(this.x*c.y); } if(op=="/") { j=(this.x*c.x+this.y*c.y)/((c.x*c.x)+(c.y*c.y)); i=((this.y*c.x)-(this.x*c.y))/((c.x*c.x)+(c.y*c.y)); } Fs m = new Fs(j,i); return m; } */ } ``` 我实在是不知道错在哪了,或许是某个使用方法我不知道?求解
R语言错误“外接函数调用时不能有NA/NaN/Inf(arg1)”
从《Modern applied statistic with S》(pp216-217)中看到一种不需要精确起始参数,即可进行非线性函数模型拟合的方法。我在R语言运行时出现错误,请教高手指点解决方法,运行脚本及错误如下: > cl<-data.frame( + Area=c(521.5, 689.78, 1284.71, 2018.8, 2560.46, 524.91, 989.05, 1646.32, 2239.65, 2972.96, 478.54, 875.52, 1432.5, 2144.74, 2629.2), + Retention=c(95.3, 87.18, 44.94, 26.36, 18.12, 84.68, 37.24, 33.04, 23.46, 9.72, 97.92, 71.44, 44.52, 24.44, 15.26) + ) > negexp <- selfStart(model = ~ exp(b0*exp(b1*x^th)), + initial = negexp.SSival, parameters = c("b0", "b1", "th"), + template = function(x, b0, b1, th) {}) > wtloss.ss <- nls(Retention ~ negexp(Area, B0, B1, theta), + data = cl, trace = T) B0 B1 theta 4.208763 144.205455 1035.324595 Error in qr.default(.swts * attr(rhs, "gradient")) : 外接函数调用时不能有NA/NaN/Inf(arg1)
LandscapeEdMode.cpp里的方法要怎么调用
最近要做个插件访问到UE4编辑器里的信息,用到LandscapeEdMode这个文件,使用的时候 FEdModeLandscape* LandscapeEdMode = (FEdModeLandscape*)GLevelEditorModeTools().GetActiveMode(FBuiltinEditorModes::EM_Landscape); //像这样访问变量没问题 LandscapeEdMode->CurrentBrush; //但是访问函数方法就会报错 LandscapeEdMode->CopyDataToGizmo(); //访问任何函数都会报错 错误 LNK1120 1 个无法解析的外部命令 PP C:\Users\Administrator\Desktop\HoudiniEngine\Plugins\HoudiniEngine\Binaries\Win64\UE4Editor-HoudiniEngineEditor.dll 1 错误 UBT ERROR: Failed to produce item: C:\Users\Administrator\Desktop\HoudiniEngine\Plugins\HoudiniEngine\Binaries\Win64\UE4Editor-HoudiniEngineEditor.dll PP C:\Users\Administrator\Desktop\HoudiniEngine\Intermediate\ProjectFiles\UnrealBuildTool 1 错误 MSB3075 命令“"E:\Epic Games\UE_4.21\Engine\Build\BatchFiles\Build.bat" PPEditor Win64 Development "C:\Users\Administrator\Desktop\HoudiniEngine\PP.uproject" -WaitMutex -FromMsBuild”已退出,代码为 5。请验证您是否拥有运行此命令的足够权限。 PP E:\VS\Common7\IDE\VC\VCTargets\Microsoft.MakeFile.Targets 44 错误 LNK2019 无法解析的外部符号 "public: void __cdecl FEdModeLandscape::CopyDataToGizmo(void)" (?CopyDataToGizmo@FEdModeLandscape@@QEAAXXZ),该符号在函数 "private: virtual class UObject * __cdecl UHoudiniAssetFactory::FactoryCreateBinary(class UClass *,class UObject *,class FName,enum EObjectFlags,class UObject *,wchar_t const *,unsigned char const * &,unsigned char const *,class FFeedbackContext *)" (?FactoryCreateBinary@UHoudiniAssetFactory@@EEAAPEAVUObject@@PEAVUClass@@PEAV2@VFName@@W4EObjectFlags@@1PEB_WAEAPEBEPEBEPEAVFFeedbackContext@@@Z) 中被引用 PP C:\Users\Administrator\Desktop\HoudiniEngine\Intermediate\ProjectFiles\Module.HoudiniEngineEditor.cpp.obj 1 --------------------- 相应模块"UnrealEd", "LevelEditor", “Landscape”,“LandscapeEditor”已经在.cs文件中引用 ---------------------------- incluide了相关项 ## #include "Runtime/Landscape/Classes/Landscape.h" ## #include "Runtime/Landscape/Classes/LandscapeProxy.h" ## #include "Runtime/Landscape/Classes/LandscapeInfo.h" ## #include "Runtime/Landscape/Classes/LandscapeLayerInfoObject.h" ## #include "Editor/UnrealEd/Public/EditorModeTools.h" ## #include "Editor/UnrealEd/Public/EditorModes.h" ## #include "Editor/UnrealEd/Public/EditorModeManager.h" ## #include "Editor/LandscapeEditor/Private/LandscapeEdMode.h"
stm32f303 ADC 模拟看门狗不能中断
芯片:stm32f303CBT6 IDE:keil 我配置好后ADC后,当从ADC通道引脚输入的电压超过设置范围后, 不能进入ADC模拟看门狗中断。 但在main函数while循环里调用ADC_GetConversionValue(ADC1)时,才会进入 ADC模拟看门狗中断,请问有人用过stm32f303的看门狗吗? 如果只有在while循环体中不断调用ADC_GetConversionValue(ADC1)才能进入ADC 模拟中断的话,那这个中断失去意义了,那程序每次读取后也可判断范围。我想应该 是不用调用ADC_GetConversionValue(ADC1)也可以进入中断的,只不过我代码用得 不对,以下是代码,请用过stm32f303看门狗的帮忙指正,在这里谢谢了。 **注:不用DMA功能,用DMA功能当然可以产生中断,因为DMA会在后台会读取ADC数据寄存器。** u32 calibration_value1 = 0; void ADC1_2_IRQHandler(void) { if(SET == ADC_GetFlagStatus(ADC1,ADC_FLAG_AWD1)) { ADC_ITConfig(ADC1,ADC_IT_AWD1,DISABLE); ADC_ClearFlag(ADC1,ADC_FLAG_AWD1); ADC_ClearITPendingBit(ADC1,ADC_IT_AWD1); } if(SET == ADC_GetFlagStatus(ADC2,ADC_FLAG_AWD2)) { ADC_ITConfig(ADC2,ADC_IT_AWD2,DISABLE); ADC_ClearITPendingBit(ADC2,ADC_IT_AWD2); } } void adc1_init(void) { ADC_CommonInitTypeDef cs; ADC_InitTypeDef adcs; ADC_VoltageRegulatorCmd(ADC1, ENABLE); delay_ms(1); ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1) != RESET ); calibration_value1 = ADC_GetCalibrationValue(ADC1); adcs.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable; adcs.ADC_Resolution = ADC_Resolution_12b; adcs.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;//ADC_ExternalTrigConvEvent_7 adcs.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None; adcs.ADC_DataAlign = ADC_DataAlign_Right; adcs.ADC_OverrunMode = ADC_OverrunMode_Disable; adcs.ADC_AutoInjMode = ADC_AutoInjec_Disable; adcs.ADC_NbrOfRegChannel = 1; ADC_Init(ADC1, &adcs); cs.ADC_Clock = ADC_Clock_AsynClkMode; cs.ADC_Mode = ADC_Mode_Independent;//ADC_Mode_Interleave; cs.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;; cs.ADC_DMAMode = ADC_DMAMode_Circular; cs.ADC_TwoSamplingDelay = 0; ADC_CommonInit(ADC1, &cs); //Tconv = Sampling time + 12.5 ADC clock cycles (12.5+Sampling)/64M ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_61Cycles5);//ADC_SampleTime_1Cycles5 ADC_Cmd(ADC1, ENABLE); } void adc1_watchDog_cfg(void) { ADC_AnalogWatchdog1SingleChannelConfig(ADC1,ADC_Channel_3); ADC_AnalogWatchdog1ThresholdsConfig(ADC1,400,0); ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable); ADC_ITConfig(ADC1,ADC_IT_AWD1,ENABLE); } void ad_gpio_cfg(void) { GPIO_InitTypeDef gs; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // RCC_AHB1PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); gs.GPIO_Mode = GPIO_Mode_AN; gs.GPIO_OType = GPIO_OType_PP; gs.GPIO_PuPd = GPIO_PuPd_NOPULL; gs.GPIO_Speed = GPIO_Speed_50MHz; //PA1--->ADC1_IN2 PA2--->ADC1_IN3 PA4--->ADC2_IN1 gs.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_4; GPIO_Init(GPIOA, &gs); } void adc_init(void) { //VrefintCal = *((u16 *)(VREFINT_CAL_ADDR)); ad_gpio_cfg(); RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1);//RCC_ADC12PLLCLK_Div1 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE); ADC_DeInit(ADC1); adc1_init(); adc1_watchDog_cfg(); ADC_StartConversion(ADC1); } mai函数 int main(void) { ... while(1) { ADC_GetConversionValue(ADC1); } ... } ``` ```
求解释为什么**注释的那段代码出现错误但是/*注释的那段代码把他代替以后程序就可以运行了,看着没问题啊?
``` #include <stdio.h> void fun ( int x, int pp[], int *n ) **{int i,j=0; for(i=1;i<=x;i++) {if((i%2==1)&&(x/i==0)) pp[j++]=i; } *n=j; }** /*{ int i,j=0; for(i=1;i<=x;i=i+2) if(x%i==0) pp[j++]=i; *n=j; }/*传回满足条件的数的个数*/ main( ) { int x, aa[1000], n, i ;void NONO (); printf( "\nPlease enter an integer number:\n" ) ; scanf("%d", &x) ; fun(x, aa, &n ) ; for( i = 0 ; i < n ; i++ ) printf("%d ", aa[i]) ; printf("\n") ; NONO( ) ; } void NONO () {/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/ int x, aa[1000], n, i, j ; FILE *fp ; fp = fopen("out.dat","w") ; for(j = 0 ; j < 10 ; j++) { x = 30 + j ; fun(x, aa, &n) ; for(i = 0 ; i < n ; i++) fprintf(fp, "%d ", aa[i]) ; fprintf(fp, "\n") ; } fclose(fp) ; } ```
native client demo 无法加载本地native模块
你好,我刚学习native client,使用sdk里面的例子跑发现无法加载本地native 模块对象。自己按照你说的方法也写了一个demo,但是运行也是发现加载native module对象失败,该值为空。无法加载本地native模块对象。这是怎么回事呀?具体代码如下: 前端: <!DOCTYPE html> <html> <head> <title>hello_tutorial</title> <script type="text/javascript"> hello_tutorialModule = null; // 模块的全局对象 statusText = 'NO-STATUS'; // 更新状态 function moduleDidLoad() { hello_tutorialModule = document.getElementById('hello_tutorial'); updateStatus('SUCCESS'); // 向模块发送消息 hello_tutorialModule.postMessage('hello'); } // 消息句柄函数。句柄在NaCl模块发送相应消息时自动唤起。 // 在C中是PPB_Messaging.PostMessage(),C++中则是pp::Instance.PostMessage() // 在这个demo当中,我们收到消息之后弹窗示意 function handleMessage(message_event) { alert(message_event.data); } // 页面载入时很可能NaCl模块还没有载入,因此我们将状态写为正在读取; // 而如果模块已经载入,则什么都不做。 function pageDidLoad() { if (hello_tutorialModule == null) { updateStatus('LOADING...'); } else { // 事实上,NaCl模块的载入成功事件是不可能在页面载入成功事件之前就发生的, // 因此我们这里简单的认为页面载入之后所更新显示的消息仍旧是当前消息,而不是'SUCCESS'。 updateStatus(); } } // 设置状态。如果存在id为'statusField'的元素,那么将其设置为参数携带的状态 function updateStatus(opt_message) { if (opt_message) statusText = opt_message; var statusField = document.getElementById('status_field'); if (statusField) { statusField.innerHTML = statusText; } } </script> </head> <body onload="pageDidLoad()"> <h1>Native Client Module hello_tutorial</h1> <p> <!-- 读取.nexe文件。通过.nmf,浏览器将结合目前所处的CPU架构来读取不同的模块文件。 于此同时,<embed>元素之外的<div>还绑定着两个事件监听('load'以及'message'), 之所以绑定在div上,而不是embed之上,是为了确保模块在载入之前就可以将监听的绑定彻底完成, 同时也确保了开发者可以在模块内部的初始化阶段调用API发送消息。 --> <div id="listener"> <script type="text/javascript"> var listener = document.getElementById('listener'); listener.addEventListener('load', moduleDidLoad, true); listener.addEventListener('message', handleMessage, true); </script> <embed name="nacl_module" id="hello_tutorial" width=0 height=0 src="hello_tutorial.nmf" type="application/x-nacl" /> </div> </p> <h2>Status</h2> <div id="status_field">NO-STATUS</div> </body> </html> native端: /// @file hello_tutorial.cc /// 载入NaCl模块时,浏览器首先将搜索CreateModule()方法,CreateModule()会返回一个对象实例, /// 之后浏览器会调用该实例的CreateInstance()方法,这时浏览器每遇到一次相应的<embed>就会调用一次。 /// /// 浏览器通过Javascript的postMessage()函数与NaCl通信。 /// 当调用postMessage()时,浏览器会转而调用pp::Instance的HandleMessage()方法。 /// 而如果模块需要与外界主动通信,则是使用pp::Instance的postMessage()方法。 /// 注意,这两个postMessage()都是异步的,因此两者在调用之后迅速返回。 #include <cstdio> #include <string> #include "ppapi/cpp/instance.h" #include "ppapi/cpp/module.h" #include "ppapi/cpp/var.h" namespace { // 这个字符串用来判断消息是否是我们期望的内容 const char* const kHelloString = "hello"; // 这个字符串用来向浏览器返回内容 const char* const kReplyString = "hello from NaCl"; } // namespace /// 每一个NaCl模块都将有一个相应的pp::Instance子类实例对应, /// 为了与浏览器进行通信,你必须重载 HandleMessage()方法以及PostMessage()方法 class hello_tutorialInstance : public pp::Instance { public: explicit hello_tutorialInstance(PP_Instance instance) : pp::Instance(instance) {} virtual ~hello_tutorialInstance() {} /// HandleMessage() 负责接收浏览器中postMessage()发送的消息内容 /// 其中的参数几乎可以表示任何东西,但通常都是JSON字符串,比如这样: /// var json_message = JSON.stringify({ "myMethod" : "3.14159" }); /// nacl_module.postMessage(json_message); virtual void HandleMessage(const pp::Var& var_message) { // 这里是处理消息的代码了 if (!var_message.is_string()) return; std::string message = var_message.AsString(); pp::Var var_reply; if (message == kHelloString) { var_reply = pp::Var(kReplyString); PostMessage(var_reply); } } }; class hello_tutorialModule : public pp::Module { public: hello_tutorialModule() : pp::Module() {} virtual ~hello_tutorialModule() {} virtual pp::Instance* CreateInstance(PP_Instance instance) { return new hello_tutorialInstance(instance); } }; namespace pp { Module* CreateModule() { return new hello_tutorialModule(); } } // namespace pp
Servlet实现排队处理视频转换请求中的疑问,贴代码请斧正!
项目需求:客户端上传视频(*.avi),server将请求排队,然后一个一个排队处理转换任务. 前面问过该问题,现在自己实现,由于多线程不精通. 如下实现该排队需求,自己感觉不太准确,有问题,请指出,并给个解决方法. (tip,没有servlet的单线程模式或将dopost方法synchronied,视乎这样做是由系统将请求排队,request请求不能立即得到回复! :) ) 1.TaskBean 写了一个bean,这个bean用来存储了转换任务的属性. [code="java"]package videoconvert; public class TaskBean { private String videoPath; private String flvPath; private boolean isConverting; public String getVideoPath() { return videoPath; } public void setVideoPath(String videoPath) { this.videoPath = videoPath; } public String getFlvPath() { return flvPath; } public void setFlvPath(String flvPath) { this.flvPath = flvPath; } public boolean getIsConverting() { return isConverting; } public void setIsConverting(boolean isConverting) { this.isConverting = isConverting; } }[/code] 2.VideoConvert 这是个servlet,用来排队请求,并调度转换工具进行转换. [code="java"]package videoconvert; import java.io.IOException; import java.io.PrintWriter; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class VideoConvert extends HttpServlet { private static final long serialVersionUID = 6312986385178354217L; private static Logger logger = LoggerFactory.getLogger(VideoConvert.class); private static LinkedList<TaskBean> taskStack = new LinkedList<TaskBean>(); public VideoConvert() { super(); } @Override public void init() throws ServletException { // TODO Auto-generated method stub super.init(); new Timer().schedule(new TimerTask() { public void run() { checkTaskList();[color=red]//这里按时间间隔检查栈.并取出task来执行.[/color] } }, 0, 10000); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getRemoteAddr().equals("127.0.0.1")) { TaskBean task = new TaskBean(); String videoPath = (String) request.getAttribute("VideoPath"); String flvPath = (String) request.getAttribute("FlvPath"); if (null != videoPath && null != flvPath) { task.setVideoPath(videoPath); task.setFlvPath(flvPath); task.setIsConverting(false); synchronized (taskStack) { [color=red] //多线程以taskStack栈作为同步量,当持有taskStack对象才添加任务进栈[/color] taskStack.addLast(task); logger.info("add task to queue!"); } } else { logger.info("the paramters are null!"); } } else { logger.info("visit is illegal!"); } response.setContentType("text/html; charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write("上传视频成功,等待转换....") pw.flush(); } //这个是timer触发的任务,取出stack中的一个任务,然后检查是否在转换中,如果没有就调用工具进行转换. private void checkTaskList() { synchronized (taskStack) { [color=red]//这里感觉不准确,因为同步块里面,Timer新建的了一个线程p1来调用外 //部工具 // FFmpeg.并且会(process.waitFor();)等待FFmepg运行完成来返回结果. 所以在调 // 用外部工具的整个过程都占用了同步量(taskStack).所以应该如何改进...[/color] TaskBean task = taskStack.peekFirst(); if (null != task) { if (!task.getIsConverting()) { task.setIsConverting(true); executProcess(task); } } } } private void executProcess(TaskBean task) { MediaUtility mu = new MediaUtility(); //在类MediaUtility 中调用新建线程调用工具,并waitfor()结果 if (mu.video2Flv(task.getVideoPath(), task.getFlvPath())) { taskStack.removeFirst(); logger.info("achieve video convert,removeFirst task!"); } else { logger.error("video convert fail!"); taskStack.removeFirst(); } } }[/code] 3.调用工具的类 MediaUtility [code="java"]package videoconvert; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MediaUtility { private static Logger logger = LoggerFactory.getLogger(MediaUtility.class); public boolean video2Flv(String videoPath, String flvPath) { if (!checkfile(videoPath)) { logger.error(videoPath + " is not file!"); return false; } String cmdStr = "ffmpeg -i " + videoPath + " " + flvPath; logger.info(cmdStr); logger.info("Starting convert video to flv...."); BufferedReader ffmpegOut = null; try { Process process = Runtime.getRuntime().exec(cmdStr); // ffmpegOut = new BufferedReader(new InputStreamReader(process // .getInputStream())); ffmpegOut = new BufferedReader(new InputStreamReader(process .getErrorStream())); // FileWriter fileOut = new FileWriter(new File("c:/F.txt")); String dLine = ""; while ((dLine = ffmpegOut.readLine()) != null) { logger.info(dLine); // fileOut.write(dLine); } // fileOut.close(); process.waitFor(); logger.info("***************************** end convert video *************************"); ffmpegOut.close(); return true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } finally { try { if (null != ffmpegOut) { ffmpegOut.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static boolean checkfile(String path) { File file = new File(path); if (!file.isFile()) { return false; } return true; } // public static void main(String[] args) { // boolean bb = video2Flv("d:/ffmpeg/uploadVideo/Video1.wmv", // "d:/ffmpeg/convertedVideo/pp1.flv"); // logger.info("the bb result is " + bb); // boolean cc = video2Flv("d:/ffmpeg/uploadVideo/Video2.wmv", // "d:/ffmpeg/convertedVideo/pp2.flv"); // logger.info("the cc result is " + cc); // }[/code] 如上面的代码.上面的代码每次只能有一个视频在转换,如果想改进为最多同时有3个或者6个任务在执行呢? 此时是否要再设置一个信号量呢? [b]问题补充:[/b] [quote]放一个线程池(ThreadPool),可以解决你的问题,每次把你的任务丢到线程池里面。[/quote] 只知道连接数据库用到线程池.请求排队也可以用线程池?有这样的应用吗? 8) 并且具体如何用,能给个例子吗? [b]问题补充:[/b] [quote]jdk的cocurrent里面有现成的。 Java代码 queue = new LinkedBlockingQueue<Runnable>(1000); threadPool = new ThreadPoolExecutor(5, 10, 10, TimeUnit.SECONDS, queue); 这样就定义了一个线程池。 Java代码 threadPool.execute(runnable); 这样就放入线程池一个Runnable了,就可以满足你的需求了。[/quote] 感谢taopian的热心回复,马上看jdk的cocurrent. :) [b]问题补充:[/b] [quote]jdk的cocurrent里面有现成的。 [/quote] 谢谢了,cocurrent包,感觉很好,应该就是解决问题的办法了. :idea: 另外,我还有一个不好很明白,就是 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) 构造函数中的 BlockingQueue<Runnable> workQueue的作用? 感觉JVM可以在内部维护这个队列,不用释放出接口来. 当然尽管API上讲了" 大队列 用小池, 小队列 用大池," 可以提高资源利用率.然而现在还不是很理解.后面在实践中体会了. 嘿嘿 [b]问题补充:[/b] 先问再吃饭. :D [quote]BlockingQueue<Runnable> workQueue 这个就是放一个队列,任务扔到队列里面,可以对并发做控制。 把这个队列暴露出来,能够让你进行很好的控制,并且你可以继承BlockingQueue,来加入你自己需要的功能,:)。[/quote] 嗯,是的,可以自己继承BlockingQueue,再增加一些自己的功能,然后放入executor中去. 面向接口 :) 现在我已经可以顺利,并准确的运行了. 最后一个疑问: executor.excute(new Runnable(){ public void run(){ run 中的变量要求是final的.final变量的GC时间是否会有影响呢? 或者有别的更好解决方法 } } ) 我是这样的改的: 这个bean被迫为final的了.呵呵,有更好的方法吗? [code="java"]if (null != videoPath && null != flvPath) { final TaskBean task = new TaskBean(); task.setVideoPath(videoPath); task.setFlvPath(flvPath); threadPool.execute(new Runnable(){ public void run(){ MediaUtility.video2Flv(task.getVideoPath(), task.getFlvPath()); } });[/code] 哎呀,罗嗦了,吃饭先..... :D
STM32F103CBT6上移植ucos操作系统 仿真后LED任务不运行一直处于空闲任务 是什么原因啊?
主函数 #include "stm32f10x.h" #include "stm32f10x_conf.h" #include "ucos_ii.h" #define TASK_STK_SIZE 64 //定义堆栈长度 OS_STK LED0_TASK_STK[TASK_STK_SIZE]; OS_STK LED1_TASK_STK[TASK_STK_SIZE]; /*定义两个任务的堆栈数组*/ #define ON 0 #define OFF 1 #define LED0(a) if (a) \ GPIO_SetBits(GPIOA,GPIO_Pin_0);\ else \ GPIO_ResetBits(GPIOA,GPIO_Pin_0) #define LED1(a) if (a) \ GPIO_SetBits(GPIOA,GPIO_Pin_1);\ else \ GPIO_ResetBits(GPIOA,GPIO_Pin_1) /*宏定义两个选择函数*/ void GPIO_configuration(void) //配置I/O口 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*开启GPIOA的外设时钟*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; /*选择要控制的GPIOA引脚*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*调用库函数,初始化GPIOA*/ /* 关闭led0灯 */ GPIO_SetBits(GPIOA, GPIO_Pin_0); GPIO_SetBits(GPIOA, GPIO_Pin_1); } void BSP_Init(void) //硬件配置 { GPIO_configuration(); /* GPIO端口初始化 */ } void SysTick_init(void) /* SysTick_init 配置SysTick定时器 */ { SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC); //初始化并使能SysTick定时器 } void Task_LED0(void *p_arg) { (void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警告 SysTick_init(); //在第一个任务中开启系统时钟 while (1) { LED0( ON ); OSTimeDlyHMSM(0, 0,0,100); LED0( OFF); OSTimeDlyHMSM(0, 0,0,100); } } void Task_LED1(void *p_arg) { (void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警告 while (1) { LED1( ON ); OSTimeDlyHMSM(0, 0,0,500); LED1( OFF); OSTimeDlyHMSM(0, 0,0,500); } } int main(void) { BSP_Init(); OSInit(); OSTaskCreate(Task_LED0,(void *)0, &LED0_TASK_STK[TASK_STK_SIZE-1], 4); OSTaskCreate(Task_LED1,(void *)0, &LED1_TASK_STK[TASK_STK_SIZE-1], 5); OSStart(); return 0; } 仿真后一直在空闲函数中运行 有大神知道是为什么吗
STM32F013用FSMC驱动SSD1289控制气的问题
尊敬的大侠们,菜鸟我刚买了个stm32f103的板子,用fsmc驱动时发现当你使用变化的数据流往寄存器写数据时(即显示图片时),他无法刷屏,直接是当前的刷屏背景,复位都没有用,但是你写入一种颜色数据确实正常的....代码附上,求大神帮忙 、、、、、、、、、、、、这是LCD.C中的、、、、、、、、、、、、、、、、、、、 #include "include.h" /* *函数名: void LCD_FSMCConfig(void) *描述: 初始化FSMC *输入参数: *返回值: *调用方法: 直接调用 */ void LCD_FSMCConfig(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef p; //设置地址建立时间 p.FSMC_AddressSetupTime = 5; //设置地址保持时间 p.FSMC_AddressHoldTime = 0; //设置数据建立时间 p.FSMC_DataSetupTime = 10; //总线返转时间 p.FSMC_BusTurnAroundDuration = 0; //时钟分频 p.FSMC_CLKDivision = 0; //数据保持时间 p.FSMC_DataLatency = 0; //FSMC选用模式 p.FSMC_AccessMode = FSMC_AccessMode_A; //选择设置的BANK以及片选信号(BANK1中的第一个block) FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; //设置是否数据地址总线时分复用(No) FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //设置存储器类型(NOR) FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR; //设置数据宽度(16bit) FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //设置是否使用迸发访问模式(连续读写模式)(No) FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; //设置WAIT信号的有效电平(低电平有效) FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; //设置是否使用还回模式(No) FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; //设置WAIT信号有效时机(在wait状态之前) FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; //设置是否使能写操作(Yes) FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //设置是否使用WAIT信号(No) FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; //设置是否使用扩展模式(读写时序相互独立)(No) FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; //设置是否使用迸发写模式(No) FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; //设定读写时序 FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); /* Enable FSMC Bank1_SRAM Bank */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); } /* *函数名: void LCD_IOConfig(void) *描述: 初始化LCD的IO口 *输入参数: *返回值: *调用方法: 直接调用 */ void LCD_IOConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; //打开FSMC时钟和GPIO口时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE); /********************打开FSMC的数据端口D[15:0]****************************/ /*初始化GPIOD口,电路图从左至右*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_0|GPIO_Pin_9| GPIO_Pin_5|GPIO_Pin_15|GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_10 |GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOD , &GPIO_InitStructure); /*初始化GPIOE口,电路图从左至右*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11| GPIO_Pin_13|GPIO_Pin_15|GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_14; GPIO_Init(GPIOE , &GPIO_InitStructure); /* RS接PD11---A16*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; GPIO_Init(GPIOD , &GPIO_InitStructure); /*NE1------LCD_CS--->GPIOD-7*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; GPIO_Init(GPIOD , &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_ResetBits(GPIOD, GPIO_Pin_12);//取消LCD 的复位 } /* *函数名: void delay_ms(uint16_t ms) *描述: *输入参数: *返回值: *调用方法: */ void delay_ms(uint16_t ms) { uint16_t i,j; for( i = 0; i < ms; i++ ) { for( j = 0; j < 1141; j++ ); } } /* *函数名: __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue) *描述: 写LCD寄存器(内联写寄存器,不重入压栈,加快速度) *输入参数: LCD寄存器地址和写入寄存器的值 *返回值: *调用方法: */ __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue) { /* 写入寄存器16位地址然后写入寄存器的值 */ // Clr_Cs;RS=0; BANK1_LCD_REG=LCD_Reg; /* Write 16-bit Reg , RS=1*/ BANK1_LCD_RAM=LCD_RegValue; // Set_Cs; } /* *函数名: void LCD_SetCursor() *描述: 设置LCD数据写入的起始坐标0x4e--xpos,0x4f---ypos; *输入参数: LCD寄存器地址和写入寄存器的值 *返回值: *调用方法: */ void LCD_SetCursor(uint16_t Xpos , uint16_t Ypos) { LCD_WriteReg(0x004e , Xpos); LCD_WriteReg(0x004f , Ypos); } /* *函数名: LCD_GetPoint(xpos , ypos); *描述: 获取屏幕上一个点的颜色数据 *输入参数: 坐标参数 *返回值: 颜色数据 *调用方法: */ uint16_t LCD_GetPoint(uint16_t Xpos , uint16_t Ypos) { uint16_t RGBColor=0; LCD_SetCursor( Xpos , Ypos); BANK1_LCD_REG=0x22; RGBColor=BANK1_LCD_RAM; RGBColor=BANK1_LCD_RAM; return RGBColor; } /* *函数名: LCD_SetPoint(xpos , ypos); *描述: 在屏幕上打一个点 *输入参数: 坐标参数 *返回值: *调用方法: */ void LCD_SetPoint(uint16_t Color) { BANK1_LCD_RAM=Color; } /* *函数名: LCD_SetDispArea *描述: 设置显示区域 *输入参数: 起始终止坐标 *返回值: *调用方法: */ void LCD_SetDispArea(uint16_t Xspos , uint16_t Yspos , uint16_t Xepos , uint16_t Yepos) { LCD_WriteReg(0x44,Xspos+(Xepos<<8)); /*水平坐标起始(低八位)和终止(高八位)*/ LCD_WriteReg(0x45,Yspos); /*Yspos*/ LCD_WriteReg(0x46,Yepos); /*Yepos*/ } /* *函数名: LCD_ClearArea(uint16_t Xspos , uint16_t Yspos , uint_t Xepos ,uint_t Yepos,uint16_t Color) *描述: 清屏 *输入参数: *返回值: *调用方法: */ void LCD_Clear(uint16_t Color) { int i=0; LCD_SetDispArea(0, 0,239,320); LCD_SetCursor(0 , 0); BANK1_LCD_REG=0x22; for(i=0 ; i<240*320 ; i++) { LCD_SetPoint(Color); } } void DispImag(const unsigned char *Image , unsigned int Lenth) { int i=0; uint16_t Color; LCD_SetDispArea(0, 0,239,320); LCD_SetCursor(0 , 0); BANK1_LCD_REG=0x22; if(i<Lenth/2) { Color = (u16)(Image[2*i]<<8) + Image[2*i+1]; BANK1_LCD_RAM=Color; i++; } } /* *函数名: void LCD_Init(void) *描述: 初始化LCD *输入参数: *返回值: *调用方法: 直接调用 */ void LCD_Init(void) { LCD_IOConfig(); LCD_FSMCConfig(); GPIO_ResetBits(GPIOD, GPIO_Pin_12); LCD_WriteReg(0x0000,0x0001); //打开晶振 LCD_WriteReg(0x0003,0xA8A4); //0xA8A4 LCD_WriteReg(0x000C,0x0000); LCD_WriteReg(0x000D,0x080C); LCD_WriteReg(0x000E,0x6800); LCD_WriteReg(0x001E,0x00B0); LCD_WriteReg(0x0001,0x6B3F); //驱动输出控制320*240 0x693F 0x2B3F 0x293F LCD_WriteReg(0x0002,0x0600); //LCD Driving Waveform control LCD_WriteReg(0x0010,0x0000); LCD_WriteReg(0x0011,0x6078); //0x4030 //定义数据格式 16位色 0x6070 横屏 0x6058 LCD_WriteReg(0x0005,0x0000); LCD_WriteReg(0x0006,0x0000); LCD_WriteReg(0x0016,0xEF1C); LCD_WriteReg(0x0017,0x0003); LCD_WriteReg(0x0007,0x0233); //0x0233 LCD_WriteReg(0x000B,0x0000); LCD_WriteReg(0x000F,0x0000); //扫描开始地址 LCD_WriteReg(0x0041,0x0000); LCD_WriteReg(0x0042,0x0000); LCD_WriteReg(0x0048,0x0000); LCD_WriteReg(0x0049,0x013F); LCD_WriteReg(0x004A,0x0000); LCD_WriteReg(0x004B,0x0000); LCD_WriteReg(0x0044,0xEF00); LCD_WriteReg(0x0045,0x0000); LCD_WriteReg(0x0046,0x013F); LCD_WriteReg(0x0030,0x0707); LCD_WriteReg(0x0031,0x0204); LCD_WriteReg(0x0032,0x0204); LCD_WriteReg(0x0033,0x0502); LCD_WriteReg(0x0034,0x0507); LCD_WriteReg(0x0035,0x0204); LCD_WriteReg(0x0036,0x0204); LCD_WriteReg(0x0037,0x0502); LCD_WriteReg(0x003A,0x0302); LCD_WriteReg(0x003B,0x0302); LCD_WriteReg(0x0023,0x0000); LCD_WriteReg(0x0024,0x0000); LCD_WriteReg(0x0025,0x8000); LCD_WriteReg(0x004e,0); //列(X)首址0 LCD_WriteReg(0x004f,0); //行(Y)首址0 } 、、、、、、、、、、、、、、这是LCD.H的、、、、、、、、、、、、、、、、、、、、、 #ifndef _LCD_H_ #define _LCD_H_ #include "include.h" /* Private define ------------------------------------------------------------*/ /* 挂载于不同的BANK,使用不同地址是自行换算 */ #define BANK1_LCD_REG (*((volatile unsigned short *) 0x60000000)) /*RS = 0 ,写寄存器值*/ #define BANK1_LCD_RAM (*((volatile unsigned short *) 0x60020000)) /*RS = 1 ,写寄存器索引*/ /* LCD Color */ #define LCD_COLOR_WHITE 0xFFFF #define LCD_COLOR_BLACK 0x0000 #define LCD_COLOR_GREY 0xF7DE #define LCD_COLOR_BLUE 0x001F #define LCD_COLOR_BLUE2 0x051F #define LCD_COLOR_RED 0xF800 #define LCD_COLOR_MAGENTA 0xF81F #define LCD_COLOR_GREEN 0x07E0 #define LCD_COLOR_CYAN 0x7FFF #define LCD_COLOR_YELLOW 0xFFE0 /** * @brief LCD Registers */ void FMSC_Init(void); void LCD_IOInit(void); void LCD_Init(void); __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue); void LCD_Clear(uint16_t Color); uint16_t LCD_GetPoint(uint16_t Xpos , uint16_t Ypos); void DispImag(const unsigned char *Image , unsigned int Lenth); #endif
这个程序错在哪了??求大神帮忙改正
#include<iostream> #include<cmath> using namespace std; class Point { public: Point(int xx=0,int yy=0) { x=xx; y=yy; } Point(Point &p); int GetX() {return x;} int GetY() {return y;} private: int x,y; }; Point::Point(Point &p) { x=p.x; y=p.y; cout<<"实现点的拷贝构造函数"<<endl; } class Line { public: Line() { len=0; cout<<"Line默认构造函数调用"<<endl; } Line(Point &pp1,Point &pp2); Line(int x1,int y1,int x2,int y2); Line(Line &l1); int Getlen() {return len;}; ~Line() {} private: Point p1,p2; int len; }; Line::Line(int x1,int y1,int x2,int y2):p1(x1,y1),p2(x2,y2) { cout<<"构造了一条线"<<endl; int x=static_cast<int>(p1.GetX()-p2.GetX()); int y=static_cast<int>(p1.GetY()-p2.GetY()); len=sqrt(x*x+y*y); } Line::Line(Line &l1):p1(l1.p1),p2(l1.p2) { cout<<"实现线的拷贝构造函数"<<endl; len=l1.len; } int main() { Point p1(3,7),p2(9,4); Line line(p1,p2); Line line2(line); cout<<"The length of the line is:"; cout<<line.Getlen()<<endl; cout<<"The length of the line2 is:"; cout<<line2.Getlen()<<endl; return 0; }
matlab ssim怎么运行?
想用个ssim比较两个图片相似度,报错“脚本中的所有函数都必须以 'end' 结束。”初学不懂,求大神指教 调用代码如下: img1= imread('E:\paperanddata\127\1.jpg'); img2= imread('E:\paperanddata\127\2.jpg'); ssim(img1,img2); 源代码如下: function [mssim, ssim_map] = ssim(img1, img2, K, window, L) %======================================================================== %SSIM Index, Version 1.0 %Copyright(c) 2003 Zhou Wang %All Rights Reserved. % %The author is with Howard Hughes Medical Institute, and Laboratory %for Computational Vision at Center for Neural Science and Courant %Institute of Mathematical Sciences, New York University. % %---------------------------------------------------------------------- %Permission to use, copy, or modify this software and its documentation %for educational and research purposes only and without fee is hereby %granted, provided that this copyright notice and the original authors' %names ap pearon all copies and supporting documentation. This program %shall not be used, rewritten, or adapted as the basis of a commercial %software or hardware product without first obtaining permission of the %authors. The authors make no representations about the suitability of %this software for any purpose. It is provided "as is" without express %or implied warranty. %---------------------------------------------------------------------- % %This is an implementation of the algorithm for calculating the %Structural SIMilarity (SSIM) index between two images. Please refer %to the following paper: % %Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image %quality assessment: From error visibility to structural similarity" %IEEE Transactios on Image Processing, vol. 13, no. 4, pp.600-612, %Apr. 2004. % %Kindly report any suggestions or corrections to zhouwang@ieee.org % %---------------------------------------------------------------------- % %Input : (1) img1: the first image being compared % (2) img2: the second image being compared % (3) K: constants in the SSIM index formula (see the above % reference). defualt value: K = [0.01 0.03] % (4) window: local window for statistics (see the above % reference). default widnow is Gaussian given by % window = fspecial('gaussian', 11, 1.5); % (5) L: dynamic range of the images. default: L = 255 % %Output: (1) mssim: the mean SSIM index value between 2 images. % If one of the images being compared is regarded as % perfect quality, then mssim can be considered as the % quality measure of the other image. % If img1 = img2, then mssim = 1. % (2) ssim_map: the SSIM index map of the test image. The map % has a smaller size than the input images. The actual size: % size(img1) - size(window) + 1. % %Default Usage: % Given 2 test images img1 and img2, whose dynamic range is 0-255 % % [mssim ssim_map] = ssim_index(img1, img2); % %Advanced Usage: % User defined parameters. For example % % K = [0.05 0.05]; % window = ones(8); % L = 100; % [mssim ssim_map] = ssim_index(img1, img2, K, window, L); % %See the results: % % mssim %Gives the mssim value % imshow(max(0, ssim_map).^4) %Shows the SSIM index map % %======================================================================== if (nargin < 2 | nargin > 5) ssim_index = -Inf; ssim_map = -Inf; return; end if (size(img1) ~= size(img2)) ssim_index = -Inf; ssim_map = -Inf; return; end [M N] = size(img1); if (nargin == 2) if ((M < 11) | (N < 11)) % 图像大小过小,则没有意义。 ssim_index = -Inf; ssim_map = -Inf; return end window = fspecial('gaussian', 11, 1.5); % 参数一个标准偏差1.5,11*11的高斯低通滤波。 K(1) = 0.01; % default settings K(2) = 0.03; L = 255; end if (nargin == 3) if ((M < 11) | (N < 11)) ssim_index = -Inf; ssim_map = -Inf; return end window = fspecial('gaussian', 11, 1.5); L = 255; if (length(K) == 2) if (K(1) < 0 | K(2) < 0) ssim_index = -Inf; ssim_map = -Inf; return; end else ssim_index = -Inf; ssim_map = -Inf; return; end end if (nargin == 4) [H W] = size(window); if ((H*W) < 4 | (H > M) | (W > N)) ssim_index = -Inf; ssim_map = -Inf; return end L = 255; if (length(K) == 2) if (K(1) < 0 | K(2) < 0) ssim_index = -Inf; ssim_map = -Inf; return; end else ssim_index = -Inf; ssim_map = -Inf; return; end end if (nargin == 5) [H W] = size(window); if ((H*W) < 4 | (H > M) | (W > N)) ssim_index = -Inf; ssim_map = -Inf; return end if (length(K) == 2) if (K(1) < 0 | K(2) < 0) ssim_index = -Inf; ssim_map = -Inf; return; end else ssim_index = -Inf; ssim_map = -Inf; return; end end if size(img1,3)~=1 %判断图像时不是彩色图,如果是,结果为3,否则为1 org=rgb2ycbcr(img1); test=rgb2ycbcr(img2); y1=org(:,:,1); y2=test(:,:,1); y1=double(y1); y2=double(y2); else y1=double(img1); y2=double(img2); end img1 = double(y1); img2 = double(y2); % automatic downsampling %f = max(1,round(min(M,N)/256)); %downsampling by f %use a simple low-pass filter % if(f>1) % lpf = ones(f,f); % lpf = lpf/sum(lpf(:)); % img1 = imfilter(img1,lpf,'symmetric','same'); % img2 = imfilter(img2,lpf,'symmetric','same'); % img1 = img1(1:f:end,1:f:end); % img2 = img2(1:f:end,1:f:end); % end C1 = (K(1)*L)^2; % 计算C1参数,给亮度L(x,y)用。 C1=6.502500 C2 = (K(2)*L)^2; % 计算C2参数,给对比度C(x,y)用。 C2=58.522500 window = window/sum(sum(window)); %滤波器归一化操作。 mu1 = filter2(window, img1, 'valid'); % 对图像进行滤波因子加权 valid改成same结果会低一丢丢 mu2 = filter2(window, img2, 'valid'); % 对图像进行滤波因子加权 mu1_sq = mu1.*mu1; % 计算出Ux平方值。 mu2_sq = mu2.*mu2; % 计算出Uy平方值。 mu1_mu2 = mu1.*mu2; % 计算Ux*Uy值。 sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq; % 计算sigmax (标准差) sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq; % 计算sigmay (标准差) sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2; % 计算sigmaxy(标准差) if (C1 > 0 & C2 > 0) ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2)); else numerator1 = 2*mu1_mu2 + C1; numerator2 = 2*sigma12 + C2; denominator1 = mu1_sq + mu2_sq + C1; denominator2 = sigma1_sq + sigma2_sq + C2; ssim_map = ones(size(mu1)); index = (denominator1.*denominator2 > 0); ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index)); index = (denominator1 ~= 0) & (denominator2 == 0); ssim_map(index) = numerator1(index)./denominator1(index); end mssim = mean2(ssim_map); return 报错错误: 文件:ssim.m 行:223 列:1 脚本中的所有函数都必须以 'end' 结束。 不知道怎么解决求指教
在STM32上做SPI方式的ADXL345程序,无法读出ID,全是FF?
![图片说明](https://img-ask.csdn.net/upload/201906/27/1561593720_113653.jpg) 我用的ADXL345在淘宝上买的,型号是GY291 #ifndef __SPI_H #define __SPI_H #include "sys.h" void SPI1_Init(void); //初始化SPI1口 void SPI1_SetSpeed(u8 SpeedSet); //设置SPI1速度 u8 SPI1_ReadWriteByte(u8 TxData);//SPI1总线读写一个字节 #endif #include "spi.h" #include "delay.h" //以下是SPI模块的初始化代码,配置成主机模式 //SPI口初始化 //这里针是对SPI1的初始化 void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟 //GPIOFA5,6,7初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_4;//PA4片选 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1); //PB3复用为 SPI1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1); //PB4复用为 SPI1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1); //PB5复用为 SPI1 //这里只针对SPI口初始化 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 GPIO_SetBits(GPIOA,GPIO_Pin_4); SPI_Cmd(SPI1, ENABLE); //使能SPI外设 // SPI1_ReadWriteByte(0xff);//启动传输 } //SPI1速度设置函数 //SPI速度=fAPB2/分频系数 //@ref SPI_BaudRate_Prescaler:SPI_BaudRatePrescaler_2~SPI_BaudRatePrescaler_256 //fAPB2时钟一般为84Mhz: /* 初始化包括了spi速度在内的各种参数,而速度设置函数,则只设置SPI的速度,方便在代码里面调用. 比如sd卡例程,在SD卡初始化的时候,SPI频率必须比较低,但是初始化成功以后,就可以设置到很高了. 这个时候调用SPI速度设置函数,就比较方便. */ void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler) { assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性 SPI1->CR1&=0XFFC7;//位3-5清零,用来设置波特率 SPI1->CR1|=SPI_BaudRatePrescaler; //设置SPI1速度 SPI_Cmd(SPI1,ENABLE); //使能SPI1 } //SPI1 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 u8 SPI1_ReadWriteByte(u8 TxData) { u8 val,val1; GPIO_ResetBits(GPIOA,GPIO_Pin_4); delay_ms(2); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte val1=SPI_I2S_ReceiveData(SPI1); GPIO_SetBits(GPIOA,GPIO_Pin_4); delay_ms(2); GPIO_ResetBits(GPIOA,GPIO_Pin_4); delay_ms(2); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 SPI_I2S_SendData(SPI1, 0XFF); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte val=SPI_I2S_ReceiveData(SPI1); GPIO_SetBits(GPIOA,GPIO_Pin_4); return val+val1; //返回通过SPIx最近接收的数据 } #ifndef __ADXL345_H #define __ADXL345_H #include "spi.h" #define DEVICE_ID 0X00 //器件ID,0XE5 #define THRESH_TAP 0X1D //敲击阀值 #define OFSX 0X1E #define OFSY 0X1F #define OFSZ 0X20 #define DUR 0X21 #define Latent 0X22 #define Window 0X23 #define THRESH_ACK 0X24 //有误,THRESH_ACT #define THRESH_INACT 0X25 #define TIME_INACT 0X26 #define ACT_INACT_CTL 0X27 #define THRESH_FF 0X28 #define TIME_FF 0X29 #define TAP_AXES 0X2A #define ACT_TAP_STATUS 0X2B #define BW_RATE 0X2C #define POWER_CTL 0X2D #define INT_ENABLE 0X2E #define INT_MAP 0X2F #define INT_SOURCE 0X30 #define DATA_FORMAT 0X31 #define DATA_X0 0X32 #define DATA_X1 0X33 #define DATA_Y0 0X34 #define DATA_Y1 0X35 #define DATA_Z0 0X36 #define DATA_Z1 0X37 #define FIFO_CTL 0X38 #define FIFO_STATUS 0X39 u8 ADXL345_Init(void); //初始化ADXL345 u8 SPI1_ReadWriteByte(u8 TxData);//SPI1总线读写一个字节 #endif #include "adxl345.h" #include "sys.h" #include "delay.h" #include "math.h" #include "usart.h" //初始化ADXL345. //返回值:0,初始化成功;1,初始化失败. u8 ADXL345_Init(void) { u8 ID; SPI1_Init(); //初始化IIC总线 if(SPI1_ReadWriteByte(DEVICE_ID)==0XE5) //读取器件ID { printf("\r\nDEVICE_ID=%0x",ID); return 0; } printf("\r\n失败DEVICE_ID=%0x",ID); return 1; } //读ADXL345寄存器 //addr:寄存器地址 //返回值:读到的值 #include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "lcd.h" #include "adxl345.h" #include "math.h" int main(void) { delay_init(168); //初始化延时函数 uart_init(115200); //初始化串口波特率为115200 LED_Init(); //初始化与LED连接的硬件接口 while(1) { while(ADXL345_Init()) //3D加速度传感器初始化 { delay_ms(1000); } } } ```
一元稀疏多项式的的计算程序,加减乘的算法应该无错,最后结果如图系数输出却为0求解。
![图片说明](https://img-ask.csdn.net/upload/201904/01/1554122853_280423.jpg) ```#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<math.h> typedef struct ploy { float coef; //系数部分 int expn; //指数部分 struct ploy *next; }ploy,*Ploy; //结点类型,指针类型 void InsertPloyNode(Ploy p,Ploy q) //插入链表算法 { if(p->coef==0) delete p; else{ Ploy q1,q2; q1=q; q2=q->next; while(q2&&p->expn<q2->expn) { q1=q2; q2=q2->next; } if(q2&&p->expn==q2->expn) { q2->coef+=p->coef; delete p; if(!q2->coef) { q1->next=q2->next; delete q2; } } else { p->next=q2; q1->next=p; } } } Ploy CreatPloyNode(Ploy head,int m) //创建表示一元多项式 { int i; Ploy p; p=head=(Ploy)malloc(sizeof(struct ploy)); head->next=NULL; for(i=0;i<m;i++){ p=(Ploy)malloc(sizeof(struct ploy)); printf("请输入第%d项的系数",i+1); scanf("%f",&p->coef); printf(" 指数:"); scanf("%d",&p->expn); InsertPloyNode(p,head); } return head; } void FreePolyNode(Ploy p) //释放多项式内存空间 { Ploy p1; while(p!=NULL) { p1=p; p=p->next; delete p1; } } void PrintPoly(Ploy pf) //输出多项式算法 { Ploy qa=pf->next; while (qa) { if(qa->coef!=1&&qa->coef!=-1) { printf("<%d",qa->coef); if(qa->expn==1) printf(",1>"); else if(qa->expn) printf(",%d>",qa->expn); } else { if(qa->coef==1) { if(!qa->expn) printf("<1,0>"); else if(qa->expn==1) printf("<1,1>"); else printf("<1,%d>",qa->expn); } if(qa->coef==-1) { if(!qa->expn) printf("<-1,0>"); else if(qa->expn==1) printf("<-1,1>"); else printf("-1,-%d>",qa->expn); } } qa=qa->next; } printf("\n"); } int SortPloy(Ploy a,Ploy b) //链表进行降序序排序算法 { if(a&&b) { if(!b||a->expn>b->expn) return 1; else if(!a||a->expn<b->expn) return -1; else return 0; } else if(!a&&b) return -1; else return 1; } Ploy Add_Poly_Item( Ploy pa,Ploy pb)//多项式相加运算 { Ploy qa=pa->next; Ploy qb=pb->next; Ploy head,q1,sum; q1=new ploy; q1->next=NULL; head=q1; while(qa||qb) { sum=new ploy; switch(SortPloy(qa,qb)) { case 1: { sum->coef=qa->coef; sum->expn=qa->expn; qa=qa->next; break; } case 0: { sum->coef=qa->coef+qb->coef; sum->expn=qa->expn; qa=qa->next; qb=qb->next; break; } case -1: { sum->coef=qb->coef; sum->expn=qb->expn; qb=qb->next; break; } } if(sum->coef!=0) { sum->next=q1->next; q1->next=sum; q1=sum; } else delete sum; } return head; } Ploy Subtract_Poly_Item( Ploy pa, Ploy pb)//多项式相减运算 { Ploy pc=pb; Ploy p=pb->next; Ploy pp; while(p) { p->coef*=-1; p=p->next; } pp=Add_Poly_Item(pa,pc); for(p=pc->next;p;p=p->next) p->coef*=-1; return pp; } Ploy Multiply_Poly_Item( Ploy pa,Ploy pb)//多项式相乘运算 { Ploy p1,p2;// Ploy qa=pa->next; //pa的后继结点 Ploy qb=pb->next; //pb的后继结点 p2=new ploy; p2->next=NULL; while(qa) //项式的每一项都运算 { qb=pb->next; while(qb) { p1=new ploy; p1->coef=qa->coef*qb->coef; p1->expn=qa->expn+qb->expn; InsertPloyNode(p1,p2); //调用插入函数,合并同类项 qb=qb->next; } qa=qa->next; } return p2;//返回所得链表的头指针 } Ploy PA,PB; void input(){ int m,n; printf("请输入多项式A的项数:"); scanf("%d",&m); PA=CreatPloyNode(PA,m); printf("\n"); printf("请输入多项式B的项数:"); scanf("%d",&n); PB=CreatPloyNode(PB,n);} void main() { int num; printf("1.多项式相加操作 \n"); printf("2.多项式相减操作 \n"); printf("3.多项式相乘操作 \n"); printf("4.退出\n"); printf("请输入要进行的操作:"); printf("\n"); scanf("%d",&num); switch(num) { case 1: printf("多项式加法\n"); input(); printf("多项式A:"); PrintPoly(PA); printf("多项式B:"); PrintPoly(PB); printf("多项式A+B:"); PrintPoly(Add_Poly_Item(PA,PB)); break; case 2: printf("多项式减法\n"); input(); printf("多项式A:"); PrintPoly(PA); printf("多项式B:"); PrintPoly(PB); printf("多项式A-B:"); PrintPoly( Subtract_Poly_Item(PA,PB)); break; case 3: printf("多项式乘法\n"); input(); printf("多项式A:"); PrintPoly(PA); printf("多项式B:"); PrintPoly(PB); printf("多项式A*B:"); PrintPoly(Multiply_Poly_Item(PA,PB)); break; case 4: printf("您已退出此系统\n"); FreePolyNode(PA); FreePolyNode(PB); exit(0); break; default: printf("输入错误\n"); } system("pause"); }![图片说明](https://img-ask.csdn.net/upload/201904/01/1554117681_312012.jpg) ```
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
我在支付宝花了1分钟,查到了女朋友的开房记录!
在大数据时代下,不管你做什么都会留下蛛丝马迹,只要学会把各种软件运用到极致,捉奸简直轻而易举。今天就来给大家分享一下,什么叫大数据抓出轨。据史料证明,马爸爸年轻时曾被...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
最全最强!世界大学计算机专业排名总结!
我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您! (为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!) 目录 泰晤士高等教育世界大学排名 QS 世界大学排名 US News 世界大学排名 世界大学学术排名(Academic Ranking of World Universities) 泰晤士高等教育世界大学排名 中国共...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
使用 Python 和百度语音识别生成视频字幕
文章目录从视频中提取音频根据静音对音频分段使用百度语音识别获取 Access Token使用 Raw 数据进行合成生成字幕总结 从视频中提取音频 安装 moviepy pip install moviepy 相关代码: audio_file = work_path + '\\out.wav' video = VideoFileClip(video_file) video.audio.write_...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
Python全栈 Linux基础之3.Linux常用命令
Linux对文件(包括目录)有很多常用命令,可以加快开发效率:ls是列出当前目录下的文件列表,选项有-a、-l、-h,还可以使用通配符;c功能是跳转目录,可以使用相对路径和绝对路径;mkdir命令创建一个新的目录,有-p选项,rm删除文件或目录,有-f、-r选项;cp用于复制文件,有-i、-r选项,tree命令可以将目录结构显示出来(树状显示),有-d选项,mv用来移动文件/目录,有-i选项;cat查看文件内容,more分屏显示文件内容,grep搜索内容;>、>>将执行结果重定向到一个文件;|用于管道输出。
​两年前不知如何编写代码的我,现在是一名人工智能工程师
全文共3526字,预计学习时长11分钟 图源:Unsplash 经常有小伙伴私信给小芯,我没有编程基础,不会写代码,如何进入AI行业呢?还能赶上AI浪潮吗? 任何时候努力都不算晚。 下面,小芯就给大家讲一个朋友的真实故事,希望能给那些处于迷茫与徘徊中的小伙伴们一丝启发。(下文以第一人称叙述) 图源:Unsplash 正如Elsa所说,职业转换是...
强烈推荐10本程序员必读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
立即提问