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问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
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"
求解释为什么**注释的那段代码出现错误但是/*注释的那段代码把他代替以后程序就可以运行了,看着没问题啊?
``` #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
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; } 仿真后一直在空闲函数中运行 有大神知道是为什么吗
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
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
在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); } } } ```
这个程序错在哪了??求大神帮忙改正
#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' 结束。 不知道怎么解决求指教
一元稀疏多项式的的计算程序,加减乘的算法应该无错,最后结果如图系数输出却为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) ```
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...
【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。欢迎 Star!)。 另外推荐一篇原创:终极推荐!可能是最适合你的Java学习路线 方法 网站 书籍推荐! Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 进程是程...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
神经⽹络可以计算任何函数的可视化证明
《Neural Networks and Deep Learning》读书笔记第四篇本章其实和前面章节的关联性不大,所以大可将本章作为小短文来阅读,当然基本的深度学习基础还是要有的。主要介绍了神经⽹络拥有的⼀种普遍性,比如说不管目标函数是怎样的,神经网络总是能够对任何可能的输入,其值(或者说近似值)是网络的输出,哪怕是多输入和多输出也是如此,我们大可直接得出一个结论:不论我们想要计算什么样的函数,...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
互联网公司的裁员,能玩出多少种花样?
裁员,也是一门学问,可谓博大精深!以下,是互联网公司的裁员的多种方法:-正文开始-135岁+不予续签的理由:千禧一代网感更强。95后不予通过试用期的理由:已婚已育员工更有责任心。2通知接下来要过苦日子,让一部分不肯同甘共苦的员工自己走人,以“兄弟”和“非兄弟”来区别员工。3强制996。员工如果平衡不了工作和家庭,可在离婚或离职里二选一。4不布置任何工作,但下班前必须提交千字工作日报。5不给活干+...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
活到老,学到老,程序员也该如此
全文共2763字,预计学习时长8分钟 图片来源:Pixabay 此前,“网传阿里巴巴要求尽快实现P8全员35周岁以内”的消息闹得沸沸扬扬。虽然很快被阿里辟谣,但苍蝇不叮无缝的蛋,无蜜不招彩蝶蜂。消息从何而来?真相究竟怎样?我们无从而知。我们只知道一个事实:不知从何时开始,程序猿也被划在了“吃青春饭”行业之列。 饱受“996ICU”摧残后,好不容易“头秃了变强了”,即将步入为“高...
Vue快速实现通用表单验证
本文开篇第一句话,想引用鲁迅先生《祝福》里的一句话,那便是:“我真傻,真的,我单单知道后端整天都是CRUD,我没想到前端整天都是Form表单”。这句话要从哪里说起呢?大概要从最近半个月的“全栈工程师”说起。项目上需要做一个城市配载的功能,顾名思义,就是通过框选和拖拽的方式在地图上完成配载。博主选择了前后端分离的方式,在这个过程中发现:首先,只要有依赖jQuery的组件,譬如Kendoui,即使使用...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
关于裁员几点看法及建议
最近网易裁员事件引起广泛关注,昨天网易针对此事,也发了声明,到底谁对谁错,孰是孰非?我们作为吃瓜观众实在是知之甚少,所以不敢妄下定论。身处软件开发这个行业,近一两年来,对...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
程序员需要了解的硬核知识之汇编语言(一)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。 汇编语言和本地代码 我们在之前的文章中探讨过,计算机 CPU 只能运行本地代码(机器语言)程序,用 C 语言等高级语...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
java知识体系整理,学会了,月入过万不是梦
欢迎关注个人公众号:程序猿学社 前言: 一转眼,工作4年了,正式写博客也有一年多了,之前就有整理和总结的习惯,只是都记录在有道云,感觉知识点都是很凌乱,花时间系统整理下,该文会一直同步更新,有不足之处,希望各位同行指正,既然,选择做技术这行,就得有分享的精神,而不是抱着别人会超过你的心理。希望各位博友们互相交流,互相进步。 目录 java系统学习 小白也能...
2020年去一线大厂面试先过SSM框架源码这一关!
SSM框架介绍 (1)持久层(Mybatis):Dao层(mapper) DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此。 DAO层的设计首先是设计DAO的接口。 然后在Spring的配置文件中定义此接口的实现类。 然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰。 DAO层的数据源配置,以及有...
教你一键快速生成后台代码,这样和测试小姐姐聊天的时间又多了
教你一键快速生成后台代码,咋们作为开发人员,应该把时间精力放在业务逻辑的实现上面。
Java程序员必备基础:内部类解析
前言 整理了一下内部类的相关知识,算是比较全,比较基础的,希望大家一起学习进步。 一、什么是内部类? 在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性 定义方式一致。 一个内部类的例子: public class Outer { private int radius = 1; public static int co...
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问