C语言 static定义变量的问题

static定义一个变量到底需不需要加上数据类型呢?这里没加也没出错
#include
int main()
{

int i;
static a=1;
for(i=0;i<5;i++)
a=a+i;
printf("%d\n",a);
}

图片说明

4个回答

应该是报错了,static是修饰变量的,int是定义变量的数据类型的,你这里可能是编译器Bug了吧

FH_ZQ
FH_ZQ 我看到谭浩强C语言第四版那本书有个例子也是这么定义的,没有给类型。
2 年多之前 回复

static 需要加上数据类型

严谨的是要加上数据类型的方便阅读,但是有些编程软件是可以允许你不填的 ,就像VS允许C#中使用中文命名对象的

默认整型,但是严谨的还是要申明类型

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
有关C语言定义变量并初始化问题
inline u_int16 Hex_Conversion(u_int16 Data_Len, u_int16 Cur_Len, u_int16 Offset) { memcpy(&Data_Len, &pHead->ui8APP_Data[Cur_Len + Offset], 2); u_int16 Temp = 0; Temp = Data_Len>>8; Data_Len = Data_Len<<8; Data_Len = Data_Len + Temp; return Data_Len; } static u_int16 App_MNG_Len = Hex_Conversion(App_MNG_Len, Cur_Len1, XM_LOGO_OFFSET_APP_MPLEN); 这样定义并初始化App_MNG_Len变量可以么?它即为函数的入参又为出参。
一个C语言的语法问题。。。。。。。。(凑字数)
今天在看apue的时候发现了一个奇怪的代码,因为这个代码实在是有点长,所以我把我有所困惑的几个语句截取下来进行提问。 ``` //第一句是定义了个函数类型 typedef int Myfunc (const char *,const struct stat *,int); //第二句应该是定义了一个Myfunc类型的函数对象,看起来有点像C++里面的//函数重载 static Myfunc myfunc; //myftw函数声明 static int myftw(char *,Myfunc *); . . . //这里是我的问题所在,我明明上面定义的是一个函数变量,在myftw的声 //明中,第二个参数理应传的是一个函数类型的指针,但是在下面的语句中 //我传入了一个函数类型的变量,编译并没有报错,请问是为什么呢? myftw(pathname,myfunc); ```
结构体指针成员变量在赋值后被篡改了是怎么回事?
结构体指针地址没变,值被篡改了什么情况,有没有大神知道啊 // ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" #include "string.h" using namespace std; struct STU_LIST { char name[40]; int num; char sex[4]; int clas; struct STU_LIST *nex; }; /******************************************************************************************************************/ /*------------------------------------ -----数字提取------------ ---------------------------------------------*/ /******************************************************************************************************************/ int strEint(const char *str) { int len = strlen(str),i,num; char *tepnum,*tep; tepnum = new char[40]; tep=tepnum; i=len-1; *(tepnum+len) = '\0'; while (i>=0) { if (*(str+i)>='0'&&*(str+i)<='9') { *(tepnum+i)=*(str+i); } else { tepnum=tepnum+i+1; i=0; } i--; } num = atoi(tepnum); delete[] tep; return num; } struct STU_LIST *STU_insirt(struct STU_LIST *head,int n); struct STU_LIST *PRESENT_class; /******************************************************************************************************************/ /*------------------------------------ -----主程序------------ -------------------------------------------------*/ /******************************************************************************************************************/ int _tmain(int argc, _TCHAR* argv[]) { char *comad; int lep = -1; bool state = true,create_sign = false; comad = new char; cout<<"欢迎使用学生名单录入工具,请输入命令命令进行操作。\n输入help查询可用命令。"<<endl; PRESENT_class = new struct STU_LIST; PRESENT_class->clas = 10; PRESENT_class->num = 0; PRESENT_class->nex = NULL; while (state) { cin>>comad; int nums; struct STU_LIST *temp; nums = strEint(comad); if (nums <= 0) { cout<<"您的操作命令缺少有效参数或参数类型有误!!!"<<endl; cout<<"您可以输入help来查询可用操作命令,及使用格式和方法。"<<endl; } else { if(PRESENT_class != NULL) { temp = STU_insirt(PRESENT_class,nums); cout<<"temp->nex->"<<static_cast<const void *>(temp->nex)<<endl; cout<<"temp->nex->num->"<<static_cast<const void *>(&temp->nex->num)<<endl; cout<<temp->clas<<"班"<<temp->name<<"的信息记录已添加。"<<endl; if (temp->nex == NULL) { cout<<"本节点是尾结点"<<endl; } else { cout<<"头节点的学号是"<<temp->num<<endl; cout<<"第二个节点的学号是"<<temp->nex->num<<endl; } } else { cout<<"您要往哪个班级添加学生信息,请在添加信息前先选择一个班级的登记表。"<<endl; cout<<"您可以输入help来查询可用操作命令,及使用格式和方法。"<<endl; } } if (strstr(comad,"exit")!=NULL) { state = false; } } return 0; } /******************************************************************************************************************/ /*-----------------------------------------插入学生条目-----------------------------------------------------------*/ /******************************************************************************************************************/ struct STU_LIST *STU_insirt(struct STU_LIST *head,int n) { struct STU_LIST *temp,*stp1,*lastsp; temp = head; lastsp = NULL; bool sign = true; while (sign) { cout<<"当前节点学号是"<<temp->num<<endl; if(temp->num >= n) //假如要插入的学号不大于当前节点学号 { if(temp->num > n ) //假如要插入的学号小于当前节点学号,那么在当前节点前面创建新节点并录入学生数据 { stp1=(struct STU_LIST*) alloca(sizeof(struct STU_LIST)); stp1->num = n; stp1->clas = head->clas; cout<<"请输入学生姓名:"; cin >>stp1->name; cout<<"请输入学生性别:"; cin >>stp1->sex; stp1->nex = temp; if(temp == head ) //假如当前节点是头结点,那么设置新节点为表头 { head = stp1; sign = false; } else //假如当前节点不是头结点,将上一个节点的指针指向新节点,跳出循环结束命令 { lastsp->nex = stp1; sign = false; } } else //假如要插入的学号等于当前节点学号,那么更新该节点学生数据。 { cout<<"请输入学生姓名:"; cin >>temp->name; cout<<"请输入学生性别:"; cin >>temp->sex; sign = false; } } else //假如要插入的学号大于当前节点学号 { cout<<"要插入的节点大于当前节点"<<endl; if(temp->num == 0) //假如当前节点学号等于0,意味着当前节点没有录入过数据,那么将本节点作为插入的节点录入学生数据。 { temp->num = n; cout<<"请输入学生姓名:"; cin >>temp->name; cout<<"请输入学生性别:"; cin >>temp->sex; temp->nex = NULL; sign = false; } else //假如当前节点的学号不等于0。 { if(temp->nex == NULL) //假如当前节点是尾结点,那么在当前节点之后创建新节点 { stp1 = (struct STU_LIST*) alloca(sizeof(struct STU_LIST)); cout<<"stp1 -> "<<static_cast<const void *>(stp1)<<endl; stp1->num = n; cout<<"新节点的学号是"<<stp1->num<<endl; stp1->clas = head->clas; stp1->nex = NULL; cout<<"请输入学生姓名:"; cin >>stp1->name; cout<<"请输入学生性别:"; cin >>stp1->sex; temp->nex = stp1; cout<<"temp->nex->num="<<temp->nex->num<<endl; cout<<"temp->nex->num->"<<static_cast<const void *>(&temp->nex->num)<<endl; sign = false; } else //假如当前节点不是尾结点,那么将当前节点设置为下个节点 { lastsp = temp; temp = temp->nex; } } } } if(head->nex != NULL) { cout<<"head->nex->num="<<head->nex->num<<endl; cout<<"head->nex->num->"<<static_cast<const void *>(&head->nex->num)<<endl; } return head; } ![图片说明](https://img-ask.csdn.net/upload/201912/28/1577541877_870062.png) 在函数内部时候值不变,一出函数内存里的值就变了这是什么道理。
stm32延时函数可行和不可行
# 1. 可行的延时 #MeLED.c ``` include "MELED.h" void LED_TIM_Config(void) { TIM_TimeBaseInitTypeDef LED_TIM_Struct; TIM_OCInitTypeDef TIM_OCInitConfig; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_DeInit(TIM4); //GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); TIM_OCInitConfig.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitConfig.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitConfig.TIM_OCPolarity = TIM_OCPolarity_Low; LED_TIM_Struct.TIM_Prescaler = (36000 - 1); LED_TIM_Struct.TIM_Period = 2 - 1; LED_TIM_Struct.TIM_ClockDivision = TIM_CKD_DIV1; LED_TIM_Struct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &LED_TIM_Struct); TIM_ClearFlag(TIM4, TIM_FLAG_Update); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); TIM_OC1PreloadConfig(TIM4, ENABLE); TIM_Cmd(TIM4, ENABLE); } ``` ``` void LED_NVIC_Config(void) { NVIC_InitTypeDef LED_NVIC_Struct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); LED_NVIC_Struct.NVIC_IRQChannel = TIM4_IRQn; LED_NVIC_Struct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 LED_NVIC_Struct.NVIC_IRQChannelSubPriority = 0;//响应优先级 LED_NVIC_Struct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&LED_NVIC_Struct); } ``` int i = 0;//注意该变量是定义在MeLED.c文件中的 ``` void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); i++; } } ``` ``` void My_Systick_Delay(uint32_t nTime) { i = 0; while(nTime != i); } ``` #MeLED.h ``` #ifndef __MELED_H #define __MELED_H #include "stm32f10x.h" #include "led.h" #include "Oper_System_Delay.h" void MELED_Init(void); void MELED_PWM_Init(void); void LED_TIM_Config(void); void LED_NVIC_Config(void); void TIM4_IRQHandler(void); void My_Systick_Delay(uint32_t nTime); #endif ``` #main.c ``` #include "stm32f10x.h" #include "usart.h" #include "led.h" #include "RTC_Time.h" #include <stdio.h> #include "MeLED.h" #include "Delay.h" ``` ``` int main(void) { while(1) { My_Systick_Delay(1000); printf("Delay over\n"); } } ``` #2.不可行的延时(我想知道为什么不可行?) #Delay.c ``` #include "Delay.h" void My_Systick_Delay(uint32_t nTime) { Attain_delay = 0; while(nTime != Attain_delay);//程序会不停的在这里循环 } ``` #Delay.h ``` #ifndef __Delay_H #define __Delay_H #include "stm32f10x.h" #include "stm32f10x_tim.h" #include "stm32f10x_it.h" #include "core_cm3.h" #include "Oper_System_Delay.h" #endif ``` #Oper_System_Delay.h ``` #ifndef __Oper_System_Delay_H #define __Oper_System_Delay_H #include "stm32f10x.h" #include "stm32f10x_tim.h" #include "stm32f10x_it.h" static uint32_t Attain_delay; //void Oper_System_Delay(); #endif ``` #MeLED.c ``` void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); Attain_delay++; } } ``` 所以第2点有人知道为什么不可行吗?最好可以提供第1和第2的差别在哪?
问下大神定时器T0中断导致串口通信无法正常进行的问题。
这是我的代码,将之烧入51单片机时,串口通信本来是让led显示,但是可能由于红外遥控的中断函数干扰了串口通信,导致红外遥控工作正常,串口通信无法进行,led无法显示。 #include<reg51.h> #include<intrins.h> #include"lcd.h" #include"temp.h" #define uint unsigned int #define uchar unsigned char sbit moto=P1^0; uchar CNCHAR[6] = "摄氏度"; void LcdDisplay(int); void UsartConfiguration(); /******************************************************************************* * 函数名 : main * 函数功能 : 主函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void UsartConfiguration() { SCON=0X50; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,注意波特率是4800的 TL1=0XF3; //ES=1; //打开接收中断 //EA=1; //打开总中断 TR1=1; //打开计数器 } uchar time0; bit IRok;//33数据位处理完成标志位 bit handle_ok; uchar IRcode[4];//4个字节 uchar IRdata[33];//33位数据 void InitUART() //定时器初始化 { TMOD=0x02;//定时器重装初值 TH0=0; TL0=0; EA=1; EX0=1; TCON=0X01; ET0=1; TR0=1;//启动定时器 } void t0() interrupt 1 { time0++;//一次中断为277.76us } void int0() interrupt 0 { static uchar i; static bit flag; if(flag) { ES=0; if((time0<54)&&(time0>32)) i=0; IRdata[i]=time0; time0=0; i++; if(i==33) { i=0; IRok=1; } } else { time0=0; flag=1; } } void handle_data() { uchar i;//处理四个字节 uchar j;//处理八位 uchar k;//处理三十三个数据 k=1; for(i=0;i<4;i++) { for(j=0;j<8;j++) { if(IRdata[k]>5) IRcode[i]|=0x80; k++; if(j<7) IRcode[i]>>=1; } } handle_ok=1; } void work() { uchar j; j=0x01; switch (IRcode[2]) { case 0x0c:moto=0;break;//1 数字一按键停止(修改这里更改控制按键) case 0x18:moto=1;break;//2数字二按键启动 default:break; } } but() { while(1) { if(IRok) { handle_data(); IRok=0; } if(handle_ok)//如果处理完成处理遥控器相关程序 { work(); handle_ok=0; } } } void main() { InitUART(); UsartConfiguration(); LcdInit(); //初始化LCD1602 LcdWriteCom(0x88); //写地址 80表示初始地址 LcdWriteData('C'); while(1) { but(); LcdDisplay(Ds18b20ReadTemp()); } } /******************************************************************************* * 函数名 : LcdDisplay() * 函数功能 : LCD显示读取到的温度 * 输入 : v * 输出 : 无 *******************************************************************************/ void LcdDisplay(int temp) //lcd显示 { unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组 float tp; if(temp< 0) //当温度值为负数 { LcdWriteCom(0x80); //写地址 80表示初始地址 SBUF='-';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 LcdWriteData('-'); //显示负 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算由?.5,还是在小数点后面。 } else { LcdWriteCom(0x80); //写地址 80表示初始地址 LcdWriteData('+'); //显示正 SBUF='+';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } if(temp>=2900) { moto=1; //开启电机 } else { moto=0; //关闭电机 } datas[0] = temp / 10000; datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10; LcdWriteCom(0x82); //写地址 80表示初始地址 LcdWriteData('0'+datas[0]); //百位 SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器 while (!TI) ; //等待发送数据完成 TI = 0; LcdWriteCom(0x83); //写地址 80表示初始地址 LcdWriteData('0'+datas[1]); //十位 SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x84); //写地址 80表示初始地址 LcdWriteData('0'+datas[2]); //个位 SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x85); //写地址 80表示初始地址 LcdWriteData('.'); //显示 ‘.’ SBUF = '.';//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x86); //写地址 80表示初始地址 LcdWriteData('0'+datas[3]); //显示小数点 SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x87); //写地址 80表示初始地址 LcdWriteData('0'+datas[4]); //显示小数点 SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; for(i=0; i<6; i++) { SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; } }
关于模板类里的静态函数指针变量
template <typename T> class RedBlack{ protected: …… static int (*compareKey)(T *k1, T *k2); //可以这样定义么,可以的话如何初始化它? …… };
如何把c语言转化成java语言?
#include<opencv2/imgproc/imgproc.hpp> #include<opencv2/highgui/highgui.hpp> #include<iostream> using namespace cv; using namespace std; //宏定义 #define WINDOW_NAME "image[procedure window]" //全局变量声明 Mat g_srcImage,g_maskImage; Point prevPt(-1,-1); //全局函数声明 static void on_Mouse(int event,int x,int y,int flags,void*); //主函数 int main() { //载入源图像 g_srcImage=imread("/Users/new/Desktop/1.jpg"); if(!g_srcImage.data){printf("读取源图像srcImage错误~!\n");return false;} //显示源图像 imshow(WINDOW_NAME,g_srcImage); Mat srcImage,grayImage; g_srcImage.copyTo(srcImage); //灰度化 cvtColor(srcImage, g_maskImage, COLOR_BGR2GRAY); //imshow("image[mask]",g_maskImage); cvtColor(g_maskImage, grayImage, COLOR_GRAY2BGR); //imshow("image[gray]",grayImage); //掩膜图像初始化为0 g_maskImage=Scalar::all(0); //设置鼠标回调函数 setMouseCallback(WINDOW_NAME, on_Mouse,0); //轮询按键处理 while(1) { //获取键值 int c=waitKey(0); //若按键为ESC时,退出 if((char)c == 27) break; //若按键为2时,恢复原图 if((char)c=='2') { g_maskImage=Scalar::all(0); srcImage.copyTo(g_srcImage); imshow("image",g_srcImage); } //若按键为1,则进行处理 if((char)c=='1') { //定义一些参数 int i,j,compCount=0; vector<vector<Point>>contours; vector<Vec4i> hierarchy; //寻找轮廓 findContours(g_maskImage, contours, hierarchy, CV_RETR_CCOMP, CHAIN_APPROX_SIMPLE); //轮廓为空时的处理 if(contours.empty()) continue; //复制掩膜 Mat maskImage(g_maskImage.size(),CV_32S); maskImage=Scalar::all(0); //循环绘制轮廓 for(int index=0;index>=0;index=hierarchy[index][0],++compCount) drawContours(maskImage, contours, index, Scalar::all(compCount+1),-1,8,hierarchy,INT_MAX); //compCount为零时的处理 if(compCount==0) continue; //生成随机颜色 vector<Vec3b>colorTab; for(int i=0;i<compCount;++i) { int b=theRNG().uniform(0, 255); int g=theRNG().uniform(0, 255); int r=theRNG().uniform(0, 255); colorTab.push_back(Vec3b((uchar)b,(uchar)g,(uchar)r)); } //计算处理时间并输出到窗口中 double dTime=(double)getTickCount(); //进行分水岭算法 watershed(srcImage, maskImage); dTime=(double)getTickCount()-dTime; printf("\t 处理时间=%gms\n",dTime*1000./getTickFrequency()); //双层循环,将分水岭图像遍历存入watershedImage中 Mat watershedImage(maskImage.size(),CV_8UC3); for(i=0;i<maskImage.rows;++i) for(j=0;j<maskImage.cols;++j) { int index=maskImage.at<int>(i,j); if(index==-1) watershedImage.at<Vec3b>(i,j)=Vec3b(255,255,255);//图像变白色 else if(index<=0||index>compCount) watershedImage.at<Vec3b>(i,j)=Vec3b(0,0,0);//图像变黑色 else watershedImage.at<Vec3b>(i,j)=colorTab[index-1]; } //混合灰度图和分水岭效果图并显示最终的窗口 watershedImage=watershedImage*0.5+grayImage*0.5; imshow("image[watershed]",watershedImage); } } return 0; } //回调函数定义 void on_Mouse(int event,int x,int y,int flags,void*) { //处理鼠标不在窗口中的情况 if(x<0||x>=g_srcImage.cols||y<0||y>=g_srcImage.rows) return; //处理鼠标左键相关消息 if(event==EVENT_LBUTTONUP||!(flags & EVENT_FLAG_LBUTTON))//按下左键 prevPt=Point(-1,-1); else if(event==EVENT_LBUTTONDOWN)//松开左键 prevPt=Point(x,y);//鼠标所指的位置 //鼠标左键按下并移动,绘制出白色线条 else if(event==EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)) { Point pt(x,y); if(prevPt.x<0)//如果指出去了,返回 prevPt=pt; line(g_maskImage, prevPt, pt, Scalar::all(255),2,8,0);//画白线 line(g_srcImage,prevPt,pt,Scalar::all(255),2,8,0);//画白线 prevPt=pt; imshow(WINDOW_NAME, g_srcImage); } }
c语言数据结构问题 代码相似性度量
我的思路:对要进行比较的所有代码段进行词法分析,并转化为特定的标记(token)串,自己制定一个转换规则。接着,通过两两比较标记(token)串来确定代码之间的相似性,并由此确定代码之间抄袭的程度。 将这两个代码分别转换为token串后,基于算法RKR-GST( running-karp-rabin greedy-string-tiling)算法思想,循环求取两个标记串中未被匹配部分的最大公共子串,将其用空格代替,并根据公式求出两个token串A,B的相似度 源代码 #include <stdio.h> #include <string.h> #include <ctype.h> #include <conio.h> #include <malloc.h> #include <stdlib.h> #include <windows.h> #define N 10000 #define M 10000 #define MAXSTRLEN 10000 //定义最大串长 typedef int status; typedef unsigned char SString[MAXSTRLEN+1]; //串的定长顺序存储表示 SString a[3]={"int","long","short"}; SString b[2]={"float","double"}; SString c[15]={"&&","||","++","--","+","-","*","/","=",">=","<=","==","!=",">","<"}; SString d[12]={"[","]","{","}","(",")",",",";","'","#",";","."}; SString e[29]={"auto","break","case","char","const","continue","default","do","else","enum", "extern","for","goto","if","main","printf","register","return","signed","sizeof", "static","struct","switch","typedef","union","unsigned","void","while","volatile"}; HANDLE hOut; DWORD written; void ShadowWindowLine(char *str); char type(char *str); void token(char name[],char list[],char token[],FILE *table); void simple(int MinMatchLen,FILE *fp1,FILE *fp2); status replace(SString s,int pos,int len,int Ls); int copy(float n); void ShadowWindowLine(char *str) { SMALL_RECT rc; CONSOLE_SCREEN_BUFFER_INFO bInfo; // 窗口缓冲区信息 WORD att0,att1,attBack; int i, chNum = strlen(str); GetConsoleScreenBufferInfo( hOut, &bInfo ); // 获取窗口缓冲区信息 // 计算显示窗口大小和位置 rc.Left = (bInfo.dwSize.X - chNum)/2 - 2; rc.Top = 8; // 原代码段中此处为bInfo.dwSize.Y/2 - 2,但是如果您的DOS屏幕有垂直滚动条的话,还需要把滚动条下拉才能看到,为了方便就把它改为10 rc.Right = rc.Left + chNum + 4; rc.Bottom = rc.Top + 4; att0 = BACKGROUND_RED |BACKGROUND_BLUE; // 阴影属性 att1 = FOREGROUND_RED |FOREGROUND_GREEN |FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY;// 文本属性 attBack = BACKGROUND_RED |BACKGROUND_GREEN |BACKGROUND_BLUE | BACKGROUND_INTENSITY; // 背景属性 // 设置阴影然后填充 COORD posShadow = {rc.Left+1, rc.Top+1}, posText = {rc.Left, rc.Top},posBack={0,0}; for (i=0;i<25;i++) { FillConsoleOutputAttribute(hOut, attBack,80, posBack, &written); posBack.Y++; } for (i=0; i<5; i++) { FillConsoleOutputAttribute(hOut, att0, chNum + 4, posShadow, &written); posShadow.Y++; } for (i=0;i<5;i++) { FillConsoleOutputAttribute(hOut, att1,chNum + 4, posText, &written); posText.Y++; } // 写文本和边框 posText.X = rc.Left + 2; posText.Y = rc.Top + 2; WriteConsoleOutputCharacter(hOut, str, strlen(str), posText, &written); SetConsoleTextAttribute(hOut, bInfo.wAttributes); // 恢复原来的属性 } char type(char *str) //此函数判断单词类型 { int i; for(i=0;i<3;i++) //a中的关键字 { if(strcmp(str,a[i])==0) return 'K'; } for(i=0;i<2;i++) //b中的关键字 { if(strcmp(str,b[i])==0) return 'E'; } for(i=0;i<15;i++) //c中的符号 { if(strcmp(str,c[i])==0) return 'A'; } for(i=0;i<12;i++) //d中符号 { if(strcmp(str,d[i])==0) return 'R'; } for(i=0;i<29;i++) //e中的关键字 { if(strcmp(str,e[i])==0) return 'Y'; } if(isdigit(str[0])) //0-9是数字 { return 'N'; } //一般的变量与字符 if(!isalnum(str[0])) return 'H'; else return 'C';//变量 } void token(char name[],char list[],char token[],FILE *table) //将两个文件中的字符串分别切割转换为token串 {    FILE *in,*out; char ch,c,buffer[N],*link[M]; int i=0,j=0,k=0,LenLink=0; if((in=fopen(name,"r+"))==NULL) { printf("源文件无法打开!\n"); exit(0); } if((out=fopen(list,"w+"))==NULL) { printf("文件写入失败!\n"); exit(0); } if((table=fopen(token,"w+"))==NULL) { printf("文件写入失败!\n"); exit(0); } while(!feof(in)) //逐字读取文件 { ch=fgetc(in); if(ch=='\t' || ch==' ' || ch== '\n') //去掉空格、制表符、回车 continue; if(isalpha(ch)) //如果首字符是字母 { while(isalnum(ch)&&(i<N)) //其他位是字母或数字 { buffer[i++]=ch; ch=fgetc(in); } buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1)); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); //在文件当中定位 } else if(isdigit(ch)) //如果首字符是数字 { while(isalnum(ch)&&(i<N)) //其他位是字母或数字 { buffer[i++]=ch; ch=fgetc(in); } buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1)); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); } else if(!isalnum(ch)) //如果首字符既不是数字也不是字母 { if(ch!='\n'&&ch!=' '&&ch!='\t') { if(ch=='>'||ch=='<'||ch=='!') //以下代码实现超前搜索 { if((c=fgetc(in))=='=') //>=,<=,!=这些需被认为是一个符号 { buffer[i++]=ch; buffer[i++]=c; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*3); strcpy(link[j-1],buffer); i=0; } else { buffer[i++]=ch; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*2); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); } } else if(ch=='+'||ch=='-'||ch=='&'||ch=='|'||ch=='=') { if((c=fgetc(in))==ch) //++,--,&&,||,==这些需被认为是一个符号 { buffer[i++]=ch; buffer[i++]=c; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*3); strcpy(link[j-1],buffer); i=0; } else { buffer[i++]=ch; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*2); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); } } else //其他符号 { buffer[i++]=ch; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*2); strcpy(link[j-1],buffer); i=0; } } } } LenLink = j-1; //存到link中的总长度 for(i=0;i<LenLink;i++) //打印token中的内容 { c=type(link[i]); // if(c=='N'||c=='A'||c=='R')//数字,符号在表中保留 fputs(link[i],table); if(c=='C') //变量均替换为id fputs("id",table); if(c=='K')//关键字int,short,long替换为zh fputs("zh",table); if(c=='E')//关键字float,double替换为fu fputs("fu",table); if(c=='Y')//其他关键字不变 fputs(link[i],table); if(c=='H')//汉字删掉 fputs("\0",table); } fclose(table); fprintf(out,"\t***** 单词类型观察表 *****\n");//打印list中的内容 fprintf(out,"\t K --int,short,long \n"); fprintf(out,"\t E --float,double\n"); fprintf(out,"\t Y --其他关键字\n"); fprintf(out,"\t A --运算符号\n"); fprintf(out,"\t R --语言符号\n"); fprintf(out,"\t N --数字\n"); fprintf(out,"\t H --汉字\n"); fprintf(out,"\t C --一般变量或标识符\n"); fprintf(out,"\t*****************************\n"); for(i=0;i<LenLink;i++) { c=type(link[i]); //判断单词的类型 fputc('(',out); fputc(c,out); fputc(',',out); fputs(link[i],out); fputc(',',out); fprintf(out,"%d",i); fputc(')',out); fputc('\n',out); } } void simple(int MinMatchLen,FILE *fp1,FILE *fp2)//此函数计算相似度,MinMatchLen: 公共子串要达到的最小长度 { SString A,B; char ch,h; int i=0,j=0,k,t,s,a=1,La,Lb,lena,lenb,x,y; float n; int MatchLen=0;//所有公共子串的总长度 int maxmatch;//当前最大公共子串长度 if ((fp1=fopen("f:\\token1.txt","r"))==NULL)//设定文件位于当前目录下,可更改为绝对路径 { printf("文件打开失败!"); getch(); exit(0); } A[++i]=fgetc(fp1); while(!feof(fp1)) A[++i]=fgetc(fp1); fclose(fp1); La=i-1; printf("token串1长度为%d,",La); if ((fp2=fopen("f:\\token2.txt","r"))==NULL)//设定文件位于当前目录下,可更改为绝对路径 { printf("文件打开失败!"); getch(); exit(0); } B[++j]=fgetc(fp2); while(!feof(fp2)) B[++j]=fgetc(fp2); fclose(fp2); Lb=j-1; printf("token串2长度为%d\n",Lb); printf("是否要查看这两个token串?Y/N "); h=getchar(); if(h=='Y'||h=='y') { ShellExecute(NULL,"open","F:\\token1.txt",NULL,NULL,SW_SHOWNORMAL); ShellExecute(NULL,"open","F:\\token2.txt",NULL,NULL,SW_SHOWNORMAL); } getchar(); printf("\n将超过指定长度的公共子串用空格替换,是否要查看细节?Y/N "); ch=getchar(); lena=i-1; lenb=j-1; do { maxmatch=MinMatchLen; for(i=1;i<=La;i++) { for(j=1;j<=Lb;j++) { k=0; while((k<=La-i)&&(k<=Lb-j)&&(A[i+k]==B[j+k])&&((A[i+k]!='\0')||(B[j+k]!='\0'))&&(A[i+k]!=' ')&&(B[j+k]!=' ')) //串A的第i+k个字符与串B的第j+k个字符是否相等 k++; if(k>maxmatch) { maxmatch=k; x=i; y=j; } } } if(maxmatch>MinMatchLen) { replace(A,x,maxmatch,La); replace(B,y,maxmatch,Lb); La=La-maxmatch+1; Lb=Lb-maxmatch+1; MatchLen+=maxmatch; } if(ch=='Y'||ch=='y') { printf("第%d次检查两串中的匹配串\n",a); a++; for(s=1;s<=La;s++) printf("%c",A[s]); printf("\n"); for(s=1;s<=Lb;s++) printf("%c",B[s]); printf("\n"); } } while(maxmatch>MinMatchLen); printf("\n已经没有能够匹配的公共子串了\n"); n=(2.0*MatchLen)/(lena+lenb); printf("公共子串的总长为%d,",MatchLen); printf("根据公式\n"); printf("\t\t ——————————————————————————\n"); printf("\t\t| 相似度=(2×公共子串长度)÷(串A长度+串B长度) |\n"); printf("\t\t ——————————————————————————\n"); printf("这两串代码的相似度为%f\n",n); copy(n); } status replace(SString s,int pos,int len,int Ls) //用空格来代替两个token串中的最大匹配子串 { int i; if(pos<1||pos>Ls-len+1||len<0) return 0; s[pos]=' '; for(i=pos+len;i<=Ls;i++) { s[i-len+1]=s[i]; } return 1; } int copy(float n) //此函数判断是否抄袭 { printf("\n相似度超过0.8,则认为是抄袭"); if(n>=0.8) printf("\n这两个代码有抄袭嫌疑,请做进一步检查"); else printf("\n这两个代码没有抄袭嫌疑"); return 0; } void main(void) { hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄 SetConsoleOutputCP(936); // 设置代码页,此为中文简体 ShadowWindowLine(" 欢迎使用C语言代码复制/相似度检测软件 "); getchar(); system("cls"); //清屏 char name1[50]; char name2[50]; //存储输入的文件路径字符串 FILE *f1,*f2; system("color F3"); printf("\n代码1:"); scanf("%s",name1); token(name1,"f:\\list1.txt","f:\\token1.txt",f1); printf("代码2:"); scanf("%s",name2); token(name2,"f:\\list2.txt","f:\\token2.txt",f2); printf("\ntoken串已生成成功,"); getchar(); simple(3,f1,f2); }
一段c语言程序,不理解运行出的结果,求帮忙解释下这段程序的运行
![图片说明](https://img-ask.csdn.net/upload/201703/06/1488803321_72724.png) #include <stdio.h> void fn() { static int x = 1; //定义静态局部变量 x*=2; printf("x=%d\n",x); } int main() { int i; for(i=0;i<5;i++) { fn(); } extern int x; //调用外部变量 printf("x=%d\n",x); return 0; } int x=100;
C语言分奖励等级,抽奖代码
**本问题我已经自我解决,代码如下我已改,求推荐好代码,关于九格抽奖的,像老虎机那样,还有转盘抽奖,求网址看,看大神的代码,越标准,越正式越好** 题目是我自己想的:今有抽奖活动,一共有N张抽奖券,一等奖1名奖金一个亿,二等奖2名奖励宝马一辆,三等奖3名一百万,勉励奖10名***酒店1000元优惠券,特等奖N/100名一个屁 我的思路 1,先给两个总量N的数组,赋值1到N;两个数组内容一样, 2设置好变量或数组,用以储存从数组一中随机选取出的数; 3,在数组一中随机选取一个数,把值传递给先前2中设置好的储存位置,分别进行好一等奖二等奖等等的号码选取,选取一个 后再将数组一中已选取的数组删去,方便下次随机不会随机到一样的数字; 4,在数组二中随机选取一个数,分别与步骤二中各个变量和数组的值比较是否相同,若与一等奖值相同则输出恭喜获得一等奖,以此类推,选取一个删除一个,防止重复 #include<stdio.h> #include<time.h> #include<stdlib.h> #define N 10000 //定义抽奖总量 #define ONE 1 //一等奖数 #define TWO 2 //二等奖数 #define THREE 3 //三等奖数 #define TEN 10 //勉励奖数 static int count=0; //每次循环选出后取余减少 static int count1=0; //每次循环后减去a数组的已选出的 void input(int *p,int *q,int index); //声明输入函数 void choice(int n,int *p,int *q); //声明选出中奖号码 int select (int n,int *p,int number); //声明抽奖 main() { int a[N],b[N],first,second[2],third[3],encourage[10],special[N/100]; //储存所有抽奖券,一等奖,二等奖,三等奖, int i; int *p,*q,*one,*two,*three,*encourage_,*special_; //指针 int number; //抽奖抽得号码 p=a,q=b; input(p,q,1); //输入 // for(i=0;i<N;i++) printf("%6d",p[i]); //检验输入 srand(time(NULL)); one=&first; two=second; three=third; encourage_=encourage; special_=special; choice(ONE,p,one); //选取一等奖 choice(TWO,p,two); //选取二等奖 choice(THREE,p,three); //选取三等奖 choice(TEN,p,encourage_); //选取勉励奖 choice(N/100,p,special_); // printf("%d\n",first); // for(i=0;i<2;i++) printf("two:%d",*(two+i)); // for(i=0;i<3;i++) printf("three:%d",*(three+i)); // for(i=0;i<10;i++) printf("encourage_:%d",*(encourage_+i)); // for(i=0;i<(N/100);i++) printf("special_:%d",*(special_+i)); for(i=0;i<3;i++) { printf("请输入你想抽取的号码(1~10000)\n"); //选取特等奖 printf("你还有%d次机会\n",3-i); scanf("%d",&number); if(number==0) break; if(select(ONE,one,number)==1) printf("恭喜你得了一等奖\n"); else if(select(TWO,two,number)==1) printf("恭喜你得二等奖\n"); else if(select(THREE,three,number)==1) printf("恭喜你得了三等奖\n"); else if(select(TEN,encourage_,number)==1) printf("恭喜你得了勉励奖\n"); else if(select(N/100,special_,number)==1) printf("恭喜你得了特等奖\n"); else printf("很遗憾,您与奖励插肩而过\n"); } if(i==3) printf("很抱歉,您的机会已用完,请重新打开程序"); } void input(int *p,int *q,int index) { for(;index<=N;index++) { *(p+index-1)=index; *(q+index-1)=index; } /* *(p+index-1)=index; *(q+index-1)=index; if(index<N) { input(p,q,index+1); }*/ } void choice(int n,int *p,int *w) { int l; //储蓄下标 while(n) { int m=N-count; l=rand()%m; /*printf("p%d:%d\n",n,*(p+l));*/ w[n-1]=*(p+l); /* printf("w:%d\n",w[n-1]);*/ count1++; if(l==N-1) *(p+N)='\0'; else { for(;l<N;l++) //循环删去已用的 { p[l]=p[l+1]; } p[n-count1]='\0'; } n--; count++; } } int select (int n,int *p,int number) { int count2=0; //判断是否和中奖数列某数相同 while(n) { if(*(p+n-1)==number) count2++; n--; } // printf("count2=%d\n",count2); if(count2==1) return 1; else return 0; }
小菜鸟快哭了。error C2365: “free”: 重定义;以前的定义是“函数”
![图片说明](https://img-ask.csdn.net/upload/201904/13/1555146461_40362.png) ``` 下面贴个完整的程序段 int i,j,k,n; //循环变量 void BacktoHome(); void Introduction(); void SpecialOne(); void SpecialMost(); void SpecialLeast(); void PrintAll(); void Away(); void Initial(void) { cout<<endl<<endl<<endl; cout<<" 八 皇 后 问 题 \n"<<flush; cout<<" -------------------------------------------------------------------------\n"<<flush; cout<<" 制作人:lzh \n\n\n"<<flush; cout<<" 请选择以下功能: \n\n"<<flush; cout<<" 1.问题简介 \n\n"<<flush; cout<<" 2.指定第一个皇后的位置情况下有几种方案 \n\n"<<flush; cout<<" 3.在什么位置固定一个皇后,方案的数量最多?具体有哪些方案? \n\n"<<flush; cout<<" 4.在什么位置固定一个皇后,方案的数量最少?具体有哪些方案? \n\n"<<flush; cout<<" 5.八皇后问题共有几种解决方案? \n\n"<<flush; cout<<" 6.退出 \n\n"<<flush; cout<<" 请输入你的选择:"; int choice,check=-1; do{ cin>>choice;cin.ignore(80,'\n'); switch(choice){ case 1: Introduction(); break; case 2: SpecialOne(); break; case 3: SpecialMost(); break; case 4: SpecialLeast(); break; case 5: PrintAll(); break; case 6: Away(); break; default: cout<<"你的输入有误,请重新输入!\n"; } }while(check); } enum States { used, free }; class Stack { int data[8]; int Top; public: Stack() { Top = 0; } ~Stack() { } int Size() { return Top; } bool Push(int); bool Pop(int &); bool StackTop(int &); friend void Empty(Stack &); //置空栈内数据, 在Solve函数执行前使用 }rowStack; bool Stack::Push(int d) { if (Top == 8) return false; else { data[Top] = d; Top++; return true; } } bool Stack::Pop(int &d) { if (!Top) return false; else { Top--; d = data[Top]; return true; } } bool Stack::StackTop(int &d) { if (!Top) return false; else { d = data[Top-1]; return true; } } class Board //一盘棋8*8 { char board[8][8]; States Rows[8], DiagsLR[15], DiagsRL[15]; //行,左右斜线 char PrintBoard[100][8][8]; //输出的棋盘 public: int nNum; //保存一组解的数目 static int AllNum; //保存所有方案的数目 Board(); bool isAttacked(int, int); //处理冲突 void PlaceQueen(int, int); void RemoveQueen(int, int); void Print(int,int); //前一个参数保存一行输出解的个数,后一个参数保存共输出解的数目 void SaveBoard(); //解决一组解后保存到PrintBoard数组中 void SaveAll(); //保存所有八皇后问题的解 friend void Empty(Board &); //置空栈内数据, 在Solve函数执行前使用 }myBoard; int Board::AllNum; Board::Board() //构造函数,初始化为空 { for(int i=0; i<8; i++) { Rows[i] = free; for(int j=0; j<8; j++) board[i][j] = '.'; } for(int k=0; k<15; k++) DiagsLR[k] = DiagsRL[k] = free; } bool Board::isAttacked(int row, int col) //是否冲突,是返回TRUE,否返回FALSE { int diagLR = col-row+7; int diagRL = row+col; if (Rows[row] == used || DiagsLR[diagLR] == used || DiagsRL[diagRL] == used) return true; return false; } void Board::PlaceQueen(int row, int col) //放皇后 { int diagLR = col-row+7; //左对角线元素 int diagRL = row+col; //右对角线元素 board[row][col] = 'Q'; Rows[row] = used; DiagsLR[diagLR] = used; DiagsRL[diagRL] = used; } void Board::RemoveQueen(int row, int col) //移去皇后 { int diagLR = col-row+7; int diagRL = row+col; board[row][col] = '.'; Rows[row] = free; DiagsLR[diagLR] = free; DiagsRL[diagRL] = free; } void Board::Print(int c,int num) { if(c==N){ //输出对应的所有解,一行排列五组 for(i=0;i<num;i++){ if(num-i<N) break; //当剩余解数大于五组可以并排显示时 for(j=0;j<8;j++){ for(n=0;n<N;n++){ for(k=0;k<8;k++) cout<<PrintBoard[i+n][j][k]<<' '<<flush; cout<<'\t'; } cout<<'\n'; } //至此已经完成输出一排五组解 i+=N-1; //跳过已输出的五组解 cout<<"按任意键继续. . .\n"<<flush; getch(); } if(num-i<N&&(num-i)!=0) //当剩余方案不足五个且多于零个时 { int n=i; for(j=0;j<8;j++){ while(n!=num) { for(k=0;k<8;k++) cout<<PrintBoard[n][j][k]<<' '<<flush; cout<<'\t'; n++; } cout<<'\n'; n=i; //使n指向第i个解的位置 } } cout<<"输出完毕,共输出了"<<num<<"组方案\n"<<flush; cout<<"按任意键返回\n"<<flush; getch(); BacktoHome(); } if(c==1){ for(i=0;i<num;i++){ for(j=0;j<8;j++){ for(k=0;k<8;k++) cout<<PrintBoard[i][j][k]<<' '; cout<<'\n'; } cout<<"按任意键继续\n"; getch(); } cout<<"输出完毕,共输出了"<<num<<"组方案\n"; cout<<"按任意键返回\n"; getch(); BacktoHome(); } } void Empty(Board &myBoard) //置空栈内数据,以便下一次Solve函数的执行 { for(int i=0; i<8; i++) { myBoard.Rows[i] = free; for(int j=0; j<8; j++) myBoard.board[i][j] = '.'; } for(int k=0; k<15; k++) myBoard.DiagsLR[k] = myBoard.DiagsRL[k] = free; } void Empty(Stack &rowStack) //置空栈内数据,以便下一次Solve函数的执行 { rowStack.Top = 0; } void Board::SaveBoard() { for(int i=0;i<8;i++) for(int j=0;j<8;j++) PrintBoard[nNum][i][j]=board[i][j]; nNum++; } void Board::SaveAll() { for(int i=0;i<8;i++) for(int j=0;j<8;j++) PrintBoard[Board::AllNum][i][j]=board[i][j]; Board::AllNum++; } void Solve(int qRow,int qCol) //实际处理八皇后置放问题 { int row,col,exitLoop,attacked; myBoard.nNum=0; //每执行一次Solve函数,先将nNum置空,并在函数执行后及时保存nNum的值 Empty(myBoard); Empty(rowStack);//置空栈内数据,以便下一次Solve函数的执行 myBoard.PlaceQueen(qRow,qCol); if (qCol == 0) col = 1; else col = 0; row = 0; do { while(row < 8) //超界 { exitLoop = 0; if (!(attacked = myBoard.isAttacked(row,col))) //若无皇后,条件成立 { myBoard.PlaceQueen(row,col); //放皇后 rowStack.Push(row); //入栈 row = 0; col++; if (col == qCol) col++; exitLoop = 1; } if (exitLoop) break; //找到退出本层循环 else row++; // 到下一行 } if (col == 8) { myBoard.SaveBoard(); row = 8; } if (row == 8) { rowStack.Pop(row); col--; //到前一列 if (col == qCol) col--; myBoard.RemoveQueen(row,col); //移去皇后 row++; //找下一个位置 } }while(col>=0); } void SolveAll() { for(i=0;i<7;i++){ int row=i,col=0,exitLoop,attacked; Empty(myBoard); Empty(rowStack);//置空栈内数据,以便下一次Solve函数的执行 do { while(row < 8) //超界 { exitLoop = 0; if (!(attacked = myBoard.isAttacked(row,col))) //若无皇后,条件成立 { myBoard.PlaceQueen(row,col); //放皇后 rowStack.Push(row); //入栈 row = 0; col++; exitLoop = 1; } if (exitLoop) break; //找到退出本层循环 else row++; // 到下一行 } if (col == 8) { myBoard.SaveAll(); row = 8; } if (row == 8) { rowStack.Pop(row); col--; //到前一列 myBoard.RemoveQueen(row,col); //移去皇后 row++; //找下一个位置 } }while(col>=0); } } void BacktoHome() { // system("cls"); Initial(); } void SpecialOne() { // system("cls"); int row,col; do{ cout<<"输入第一个皇后的位置(1~8):\n行坐标:"; cin>>row; cout<<"列坐标:"; cin>>col; if(!(row<=8&&row>=1&&col<=8&&col>=1)) cout<<"你的输入有误,请重新输入:\n"; }while(!(row<=8&&row>=1&&col<=8&&col>=1)); Solve(row-1,col-1); cout<<"固定该位置的皇后后共有"<<myBoard.nNum<<"组方案\n"; cout<<"是否输出所有这些方案?(Y/N)"; char c='a'; while(c){ cin>>c;cin.ignore(80,'\n'); if(c=='y'||'Y'){ myBoard.Print(N,myBoard.nNum); break; } else if(c=='n'||'N'){ BacktoHome(); break; } else cout<<"你的输入有误,请重新输入!\n"; } } void SpecialMost() { // system("cls"); int qRow,qCol; //储存最多方案解皇后的位置 int row,col=-1; int max=0; //储存最多方案解的个数 cout<<"可以把皇后固定在某一列上来查找最多解\n"; cout<<"把皇后固定在哪一列?"; do{ cin>>col; cin.ignore(80,'\n'); if(!(col<=8&&col>=1)) cout<<"你的输入有误,请重新输入!"; }while(!(col<=8&&col>=1)); for(row=0;row<8;row++){ Solve(row,col-1); if(max<myBoard.nNum){ max=myBoard.nNum; qRow=row;qCol=col; } } cout<<"\n在你输入的这一列位置上,八皇后问题方案解最多的有"<<max<<"种\n"<<flush; cout<<"它的位置在第"<<qRow+1<<"行,"<<"第"<<qCol<<"列\n"<<flush; cout<<"是否输出该情况下的所有方案?(Y/N)"<<flush; char c; do{ cin>>c;//cin.ignore(80,'\n'); if(c=='Y'||'y'){ myBoard.Print(N,max); break; } else if(c=='N'||'n'){ BacktoHome(); break; } else cout<<"你的输入有误,请重新输入!"; }while(c); } void SpecialLeast() { // system("cls"); int qRow,qCol; //储存最少方案解皇后的位置 int row,col=-1; int min=100; //储存最少方案解的个数 cout<<"可以把皇后固定在某一列上来查找最少解\n"; cout<<"把皇后固定在哪一列?"; do{ cin>>col; //cin.ignore(80,'\n'); if(!(col<=8&&col>=1)) cout<<"你的输入有误,请重新输入!"; }while(!(col<=8&&col>=1)); for(row=0;row<8;row++){ Solve(row,col-1); if(min>myBoard.nNum){ min=myBoard.nNum; qRow=row;qCol=col; } } cout<<"在你输入的这一列位置上,八皇后问题方案解最少的有"<<min<<"种\n"<<flush; cout<<"它的位置在第"<<qRow+1<<"行,"<<"第"<<qCol<<"列\n"<<flush; cout<<"是否输出该情况下的所有方案?(Y/N)"<<flush; char c; do{ cin>>c;//cin.ignore(80,'\n'); if(c=='Y'||'y'){ myBoard.Print(N,min); break; } else if(c=='N'||'n'){ BacktoHome(); break; } else cout<<"你的输入有误,请重新输入!"; }while(c); } void PrintAll() { SolveAll(); cout<<"八皇后问题共有"<<Board::AllNum<<"种解方案"<<endl<<flush; cout<<"是否输出所有这些解?(Y/N)"<<flush; char c; do{ cin>>c; if(c=='Y'||'y') myBoard.Print(N,Board::AllNum); else if(c=='N'||'n') break; else cout<<"你的输入有误,请重新输入!"; }while(c); cout<<"按任意键返回"; getch(); BacktoHome(); } void Introduction() { cout<<"输出关于八皇后问题的介绍"<<flush; cout<<"按任意键返回\n"<<flush; getch(); BacktoHome(); } void Away() { // system("cls"); cout<<endl<<endl<<endl; cout<<" 八 皇 后 问 题 \n"<<flush; cout<<" -------------------------------------------------------------------------\n"<<flush; cout<<" 制作人:lzh \n\n\n"<<flush; cout<<endl<<flush; cout<<" "<<endl<<flush; cout<<" ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ "<<endl<<flush; cout<<" * * "<<endl<<flush; cout<<" * 谢谢你对本软件的支持 欢迎再次使用 * "<<endl<<flush; cout<<" * * "<<endl<<flush; cout<<" ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ "<<endl<<flush; cout<<"\n\n\n\n\n\n\n\n\n"<<flush; } void main() { Initial(); } ``` ```
【c-WinAPI】 程序运行崩溃(自己写的函数出错),求大神帮忙!!!
# !!!各位这个问题不用看了,c币给错了,我重投了另一个问题,给了40币,大家可以用我的这个标题找到(只要在后面再填一个感叹号就是新的),抱歉!!! # 先行说明: ## 工程简要说明 说明下,这个工程一共5个文件(两个头文件,三个资源文件): 头文件中,一个是宏定义用文件【WinMacro.h】,另一个是函数声明用文件【WinHead.h】; 资源文件中,一个是窗口注册文件(基本可以忽略)【WinMain.c】,第二个是窗口过程文件【WinProc.c】,最后一个里是函数定义文件(主要出错的地方)【WinSupport.c】。 ## 编译器介绍 这里我用的是Dev c++ (v.5.11)编译器,有段时间入了学生联赛的坑,然后现在就有点停不下来,对VC没什么好感,emmm。 ## 对于ERROR的探索 我本来是希望用TextOut函数做一个模拟DrawText函数的新函数:TextPrint,后续还想给它添加一些独特的输出特效,不过现在看来都运行不了(一运行就立即报错,但是编译没问题),尴尬。 万恶的Dev c++调试功能有问题,找了很长时间解决办法之后,就调试了一下,结果就...完全看不懂了。 在下面我标注的【图6】第27行(WinSupport.c)这里单步调试会终止,并弹出显示: > program received signal SIGFPE, Airthmetic expection 然后会显示 Windows CPU 运行表(大概是这个叫法...),但还是看不懂。所以我后面修改了代码,把27、28行都改成了将那两个变量赋值为常数2,而不是即时计算。 顺便改了一下74行,把pcText换成了pChar (74行这里是自己发现的逻辑错误)。 现在各位看到的代码是最初的版本,上面的修改在下面附的代码里都未体现。不是说我懒的修改,而是因为我想把这里弄明白,到底是什么原因。 修改后的代码其实也有问题,那就是虽然可以运行,但是假如在一个矩形内输出了n(n>1)行,那么只有第一行能被保留(啊啊啊,要疯了!!!) ## 最终预期功能 嗯,这里在重申一下,那个TextPrint函数是低配版的DrawText函数,功能就是指定一个矩形,然后向矩形范围内输出(每行填满后自动换行)(假如要输出的内容填满了整个矩形都没有输出完,那就停止输出)。 ## 一些个人看法 自己也试了许多次,但就是不太清楚其中机理,只好劳烦各位“达人”了。 我是直接看书自学的WinAPI,没什么耐性,就先用刚学的新函数TextOut练练手, 所以...挖了个大坑。 个人感觉应该是WinAPI"可重入"的锅,但是实在是没有接触过面向对象的编程(只会一点C),so...... ## 致谢 (.-..-.)刚刚注册的号,学生党一枚,初次提问,言谢在先! # 源代码: 【WinMacro.h】: ```c #define CLASSNAME "Program: Get Seated" #define APPNAME "Tiny Spotlessness: The Seats" #define SIZE_101 SIZEOFSTRING #define SIZEOFSTRING 100 #define EMPTY INITIAL #define INITIAL 0 #define CXSCREEN GetSystemMetrics (SM_CXSCREEN) #define CYSCREEN GetSystemMetrics (SM_CYSCREEN) #define FAULTMSG_101 FAULTMSG_WNDNTNEEDED #define FAULTMSG_WNDNTNEEDED "Fault 101: WindowsNTneeded!" ``` 【图1】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562392986_229499.png) 【WinHead.h】: ```c /*---------------------------------------------------------------- Supporting Header Files -----------------------------------------------------------------*/ #include <windows.h> #include <stdbool.h> #include "WinMacro.h" /*---------------------------------------------------------------- Supporting Value Structions -----------------------------------------------------------------*/ /*---------------------------------------------------------------- Supporting Function Statements -----------------------------------------------------------------*/ LRESULT CALLBACK WndProc ( /*--------------------------------------*/ HWND hwnd, /* Stating the Main Window Process, */ UINT message, /* a special function with four para- */ WPARAM wParam, /* meters, using the other functions. */ LPARAM lParam /*--------------------------------------*/ ); int TextPrint( /*--------------------------------------*/ HDC hdc, /* Print on any place of rect, using */ RECT *pRect, /* a pointer to rect and a pointer to */ const TEXTMETRIC *pTm, /* the text metric, a string with */ const TCHAR *pcText, /* its length, and return the number */ int iLenth /* of the characters outputted. */ ); ``` 【图2】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393250_936313.png) 【图3】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393275_813852.png) 【WinMain.c】: ```c /*-------------------------------------- WinMain.c, (c) Shen Pengfei, 2019 --------------------------------------*/ #include "WinHead.h" int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { TCHAR szClassName[] = TEXT (CLASSNAME); TCHAR szAppName[] = TEXT (APPNAME); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = EMPTY; wndclass.cbWndExtra = EMPTY; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszClassName = szClassName; wndclass.lpszMenuName = NULL; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT (FAULTMSG_WNDNTNEEDED), szAppName, MB_ICONERROR ); return EMPTY; } hwnd = CreateWindow ( szClassName, /* window class name */ szAppName, /* window caption name */ WS_OVERLAPPEDWINDOW | WS_VSCROLL, /* window style */ INITIAL, /* initial x position */ INITIAL, /* initial y position */ CXSCREEN, /* initial x size */ CYSCREEN, /* initial y size */ NULL, /* parent window handle */ NULL, /* window menu handle */ hInstance, /* program instance handle */ NULL /* creation parameters */ ); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); while (GetMessage (&msg, NULL, EMPTY, EMPTY)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } ``` 【图4】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393472_122237.png) 【图5】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393485_726445.png) 【WinSupport.c】: ```c /*------------------------------------------------ (c) Shen PengFei, 2019 A file to set up some functions to complite some special tasks. -------------------------------------------------*/ #include "WinHead.h" int TextPrint ( HDC hdc, RECT *pRect, const TEXTMETRIC *pTm, const TCHAR *pcText, int iLenth ) { static int iLine; static int iRaw; static int iCount; static const TCHAR *pChar; /*-------------------------------------------- Count the width and the Height of the screen, by the way, creating a pointer copying the address of initial string ---------------------------------------------*/ iLine = (pRect->right - pRect->left) / pTm->tmAveCharWidth; iRaw = (pRect->bottom - pRect->top) / (pTm->tmHeight + pTm->tmExternalLeading); pChar = pcText; for ( iCount = INITIAL; /*------------------------------------------------ To prevent the number of charaters outputt -ed on the screen from overring the string's, check if the result value of [PCHAR minus PCTEXT] was not larger than the length of the string. And also, to prevent the strin -g's overring the initial rect, check if the raw number over the max value counted and called IRAW. -------------------------------------------------*/ pChar - pcText < iLenth && iCount <= iRaw; /*------------------------------------------------ Change the outputting address of each raw, the position of the changed pointer to the string and Add the cyclelatte times value in turn each time, to end the running in time. -------------------------------------------------*/ pRect->top += pTm->tmHeight + pTm->tmExternalLeading, pChar += iLine, iCount ++ ) { /*----------------------------------------------- Solve the special condition that outputted characters' last raw is not enough to make the whole raw full, while may cause that the stuffs behind the address of the string fluent the system running. ------------------------------------------------*/ if ( iLenth % iLine != EMPTY && iCount == iLenth / iLine ) iLine = iLenth % iLine; TextOut ( hdc, pRect->left, pRect->top, pcText, iLine ); } /* Return the initial value used in turn */ pRect->left = pRect->top = INITIAL; return pChar - pcText; } ``` 【图6】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393526_633017.png) 【图7】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393538_23024.png) 【图8】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393576_200998.png) 【WinProc.c】: ```c /*----------------------------------------------- (c) Shen Pengfei, 2019 A file to create a series of windows, used by WINMAIN.C . ------------------------------------------------*/ #include "WinHead.h" LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { static int cxChar; static int cyChar; static RECT rectPrint; static TCHAR szText [SIZEOFSTRING]; HDC hdc; RECT rect; PAINTSTRUCT ps; TEXTMETRIC tm; switch (message) { case WM_CREATE: rectPrint.left = INITIAL; rectPrint.top = INITIAL; rectPrint.right = CXSCREEN; rectPrint.bottom = CYSCREEN; hdc = GetDC (hwnd); /*----------------------------------------- To get the text parameters on its width and height (may with the external leading). ------------------------------------------*/ GetTextMetrics (hdc, &tm); cxChar = tm.tmAveCharWidth; cyChar = tm.tmHeight + tm.tmExternalLeading; ReleaseDC (hwnd, hdc); return EMPTY; case WM_SIZE : rectPrint.right = LOWORD (lParam); rectPrint.bottom = HIWORD (lParam); return EMPTY; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); /* Debugging part */ TextPrint ( hdc, &rectPrint, &tm, szText, wsprintf ( szText, TEXT ("sdaf") ) ); EndPaint (hwnd, &ps); return EMPTY; case WM_DESTROY: PostQuitMessage (EMPTY); return EMPTY; } return DefWindowProc (hwnd, message, wParam, lParam); } ``` 【图9】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393610_312365.png) 【图10】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393619_968385.png)
oracle连接异常:“System.Data.OracleClient.OracleConnection”的类型初始值设定项引发异常。
定义了一个变量: public static string connString1 = "User Id=ap;Password=**********;Data Source=10.5.1.56/prad"; 定义了一个连接对象:protected static OracleConnection con;//连接对象 在执行下面语句的时候引发异常:(“System.Data.OracleClient.OracleConnection”的类型初始值设定项引发异常。) con = new System.Data.OracleClient.OracleConnection(connString1); 但是在新建项目中只测试这段代码可以连接数据库。不知道为什么,
C++代码改成C语言代码,没学过C++好多看不懂啊(泪奔······)求大神指点,我用的VC6.0
代码如下, #include "winsock2.h" #include "Winsnmp.h" #include <string>这里是string以下都要用 < 和 > 括起来(不知为何不显示=,=) #include <vector>vector #include <algorithm>algorithm #include <iostream>iostream #pragma comment(lib,"wsnmp32.lib") #pragma comment(lib,"ws2_32.lib") using namespace std; typedef vector<string> strvec; typedef vector<strvec> strvec_vec; class CManager {public: CManager(string strIP,string strCommunity); //构造函数 ~CManager(); //析构函数 string ValueToString(smiVALUE sValue); //返回值转换 bool InitSnmp(); //用于加载SNMP bool Send(const strvec& strOIDArray,smiINT sPDUType=SNMP_PDU_GETNEXT); bool Receive(HSNMP_VBL& hVbl); //接收应答包 bool GetAValue(const string& strOID,string& strResult); //获取ObjectID值 bool GetTable(strvec strOIDArray,strvec_vec& strResultTable); string GetLocalIP(); //获取本机IP地址 void ErrorMessage(string strMessage); //输出错误信息 void SetEvent(); protected: HSNMP_SESSION m_hSession; //会话句柄 HSNMP_CONTEXT m_hContext; //上下文句柄 static SNMPAPI_STATUS CALLBACK Callback ( HSNMP_SESSION hSession, //WinSNMP会话句柄 HWND hWnd, //处理通知窗口的句柄 UINT wMsg, //窗口消息通知码 WPARAM wParam, //消息类型 LPARAM lParam, //PDU的请求标识符 LPVOID lpClientData //可选的自定义数据 ); private: smiUINT32 m_nMajorVersion; //WinSNMP API主版本 smiUINT32 m_nMinorVersion; //WinSNMP API副版本 smiUINT32 m_nLevel; //支持最高的操作标准 smiUINT32 m_nTranslateMode; //默认实体/上下文模式 smiUINT32 m_nRetransmitMode; //默认的重发机制 string m_IP; //IP地址 smiOCTETS m_Community; //团体名 HANDLE m_hEvent; }; // 构造函数 CManager::CManager(string strIP,string strCommunity): m_nMajorVersion(0), m_nMinorVersion(0), m_nLevel(0), m_nTranslateMode(0), m_nRetransmitMode(0), m_IP(strIP) {m_Community.len=strCommunity.length(); m_Community.ptr=new smiBYTE[strCommunity.length()]; memcpy(m_Community.ptr,strCommunity.c_str(),strCommunity.length()); m_hEvent=CreateEvent(NULL,true,false,NULL); } //析构函数 CManager::~CManager() {SnmpFreeContext(m_hContext); SnmpClose(m_hSession); SnmpCleanup(); delete[] m_Community.ptr; } //SNMP初始化函数 bool CManager::InitSnmp() { //加载SNMP if(SnmpStartup(&m_nMajorVersion,&m_nMinorVersion,&m_nLevel,&m_nTranslateMode,&m_nRetransmitMode)==SNMPAPI_FAILURE) {ErrorMessage("startup SNMP error!"); return false; } //设置传输模式 if (SnmpSetTranslateMode(m_nTranslateMode)==SNMPAPI_FAILURE) {ErrorMessage("Set transfer mode error!"); return false; } //设置重传模式 if (SnmpSetRetransmitMode(m_nRetransmitMode)==SNMPAPI_FAILURE) {ErrorMessage("Set retransmission mode error!"); return false; } //建立会话 m_hSession=SnmpCreateSession(NULL,NULL,CManager::Callback,(LPVOID)this); if(m_hSession==SNMPAPI_FAILURE) {ErrorMessage("Set conversation error!"); return false; } //建立实体 HSNMP_ENTITY hEntity; if((hEntity=SnmpStrToEntity(m_hSession,m_IP.c_str()))==SNMPAPI_FAILURE) {ErrorMessage("Creat entity error!!"); return false; } //建立上下文句柄 if((m_hContext=SnmpStrToContext(m_hSession,&m_Community))==SNMPAPI_FAILURE) {ErrorMessage("Create context handle error!!"); return false; } //设置超时时间 if (SnmpSetTimeout(hEntity,10)==SNMPAPI_FAILURE) {ErrorMessage("Set timeout error!"); return false; } //设置重传次数 if (SnmpSetRetry(hEntity,1)==SNMPAPI_FAILURE) {ErrorMessage("Set retransmissions error!"); return false; } return true; } //SNMP消息发送函数 bool CManager::Send(const strvec& strOIDArray,smiINT sPDUType) {HSNMP_VBL hVbl; HSNMP_PDU hPdu; smiOID sOid; HSNMP_ENTITY hSrcEntity,hDestEntity; //创建源主机和目的主机实体句柄 hSrcEntity = SnmpStrToEntity(m_hSession,GetLocalIP().c_str()); hDestEntity = SnmpStrToEntity(m_hSession,m_IP.c_str()); //创建变量绑定列表 if((hVbl = SnmpCreateVbl(m_hSession,NULL,NULL)) == SNMPAPI_FAILURE) return false; //点分十进制串转换成二进制格式 for(strvec::const_iterator it=strOIDArray.begin();it!=strOIDArray.end();it++) {SnmpStrToOid((*it).c_str(),&sOid); SnmpSetVb(hVbl,0,&sOid,NULL); } //将数据转换成特定PDU格式 if((hPdu = SnmpCreatePdu(m_hSession,sPDUType,0,NULL,NULL,hVbl)) == SNMPAPI_FAILURE) return false; //发送PDU if(SnmpSendMsg(m_hSession,hSrcEntity,hDestEntity,m_hContext,hPdu) == SNMPAPI_FAILURE) return false; //释放句柄 SnmpFreeEntity(hSrcEntity); SnmpFreeEntity(hDestEntity); SnmpFreePdu(hPdu); SnmpFreePdu(hVbl); return true; } //SNMP消息接收函数 bool CManager::Receive(HSNMP_VBL& hVbl) {WaitForSingleObject(m_hEvent,INFINITE); ResetEvent(m_hEvent); HSNMP_ENTITY hSrcEntity; HSNMP_ENTITY hDestEntity; HSNMP_CONTEXT hContext; HSNMP_PDU hPdu; //接收到消息 if(SnmpRecvMsg(m_hSession,&hSrcEntity,&hDestEntity,&hContext,&hPdu) == SNMPAPI_FAILURE) return false; smiINT PDU_type; smiINT error_status; smiINT error_index; //提取PDU中的数据 if(SnmpGetPduData(hPdu,&PDU_type,NULL,&error_status,&error_index,&hVbl) == SNMPAPI_FAILURE) return false; return true; } //SNMP数值转换函数 string CManager::ValueToString(smiVALUE sValue) {char cBuffer[1500]; memset(cBuffer,0,1500); switch(sValue.syntax) {case SNMP_SYNTAX_NSAPADDR: case SNMP_SYNTAX_IPADDR: sprintf(cBuffer,"%d.%d.%d.%d",sValue.value.string.ptr[0],sValue.value.string.ptr[1],sValue.value.string.ptr[2],sValue.value.string.ptr[3]); break; case SNMP_SYNTAX_OPAQUE: case SNMP_SYNTAX_OCTETS: if(sValue.value.string.len==0) sprintf(cBuffer,"OCTETS NULL"); else {memset(sValue.value.string.ptr+sValue.value.string.len,0,1); sprintf(cBuffer,"%s",sValue.value.string.ptr); } break; case SNMP_SYNTAX_TIMETICKS: int iHours,iMinutes,iSeconds; long lUptime; lUptime=sValue.value.uNumber/100; iHours=(int)(lUptime/3600); iMinutes=(int)((lUptime%3600)/60); iSeconds=(int)((lUptime%60)); sprintf(cBuffer,"%d时,%d分,%d秒",iHours,iMinutes,iSeconds); break; case SNMP_SYNTAX_INT: sprintf(cBuffer,"%d",sValue.value.sNumber); break; case SNMP_SYNTAX_UINT32: case SNMP_SYNTAX_CNTR32: case SNMP_SYNTAX_GAUGE32: sprintf(cBuffer,"%U",sValue.value.uNumber); break; default: sprintf(cBuffer,"NULL"); break; } return string(cBuffer); } //获得路由器信息函数 bool CManager::GetAValue(const string& strOID,string& strResult) {HSNMP_VBL hVbl; smiOID sOIDRecv; smiVALUE sValue; int iCount; strvec strOIDArray; strOIDArray.push_back(strOID+".0"); //发送请求列表string没有成功 if(!Send(strOIDArray,SNMP_PDU_GET)) return false; //没有接收到应答 if(!Receive(hVbl)) return false; //计算返回Vbl的行数 iCount = SnmpCountVbl(hVbl); if(iCount!=1) {strResult="SnmpCounVbl error!"; return false; } //取返回结果 if(SnmpGetVb(hVbl,1,&sOIDRecv,&sValue) == SNMPAPI_FAILURE) {strResult="SnmpGetVb error!"; return false; } strResult=ValueToString(sValue); SnmpFreeVbl(hVbl); return true; } //获得路由表信息函数 bool CManager::GetTable(strvec strOIDArray, strvec_vec& strResultTable) { long lIfEnd; HSNMP_VBL hVbl; smiOID sOIDSend; smiOID sOIDRecv; smiVALUE sValue; int iCount,iOIDLen; char cBuffer[100]; if (strOIDArray.empty()) return false; //计算OID标识符的长度 iOIDLen=count((strOIDArray[0]).begin(),(strOIDArray[0]).end(),'.')+1; while(true) {//发送请求列表string没有成功 if(!Send(strOIDArray)) return false; //没有接收到应答 if(!Receive (hVbl)) return false; //计算返回Vbl的行数 iCount = SnmpCountVbl(hVbl); for(int i=0;i<iCount;i++) {//取返回结果 if(SnmpGetVb(hVbl,i+1,&sOIDRecv,&sValue)==SNMPAPI_FAILURE) {ErrorMessage("获取结果失败!"); return false; } memset(cBuffer,0,100); SnmpStrToOid(strOIDArray[i].c_str(),&sOIDSend); SnmpOidToStr(&sOIDRecv,100,cBuffer); strOIDArray[i]=string(cBuffer); //判断格式是否一致,决定是否继续循环 SnmpOidCompare(&sOIDSend,&sOIDRecv,iOIDLen,&lIfEnd); if(lIfEnd !=0) break; strResultTable[i].push_back(ValueToString(sValue)); } if(lIfEnd !=0) break; } SnmpFreeVbl(hVbl); return true; } //获得本机地址函数 string CManager::GetLocalIP() {char cHost[512]; PHOSTENT pHostIP; string HostIP; if (gethostname(cHost, sizeof(cHost))==0) {pHostIP = gethostbyname(cHost); if(pHostIP !=NULL) HostIP = inet_ntoa(*(struct in_addr *)(pHostIP->h_addr_list[0])); } return HostIP; } //错误信息函数 void CManager::ErrorMessage(string strMessage) {cout<<strMessage<<endl; } //事件处理函数 void CManager::SetEvent() {::SetEvent(m_hEvent); } //事件回调函数 SNMPAPI_STATUS CALLBACK CManager::Callback(HSNMP_SESSION hSession, HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData) {((CManager*)lpClientData)->SetEvent(); return 1; } // Main.CPP: 主函数的实现 //#include "Manager.h" void main(int argc,char *argv[]) {//检查输入命令格式 if(argc!=3) {cout<<"Please input command:SnmpManager ip_address community"<<endl; return; } //初始化CManger对象 CManager cManger(argv[1],argv[2]); bool Status=cManger.InitSnmp(); //输出路由器的基本信息 cout<<"----------------------GetValue Text------------------------"<<endl; string Result; if((Status=cManger.GetAValue("1.3.6.1.2.1.1.1",Result))==false) cout<<"GetAnValue error!"<<endl; else cout<<Result<<endl; //输出路由器的路由表信息 cout<<"----------------------GetTable Test------------------------"<<endl; strvec RouteOidArray; RouteOidArray.push_back ("1.3.6.1.2.1.4.21.1.1"); RouteOidArray.push_back ("1.3.6.1.2.1.4.21.1.2"); RouteOidArray.push_back ("1.3.6.1.2.1.4.21.1.7"); RouteOidArray.push_back ("1.3.6.1.2.1.4.21.1.8"); RouteOidArray.push_back ("1.3.6.1.2.1.4.21.1.11"); strvec_vec IpResultTable(RouteOidArray.size()); if (Status=cManger.GetTable(RouteOidArray,IpResultTable)==false) cout<<"GetTable error"<<endl; else {for(strvec_vec::iterator it1=IpResultTable.begin();it1!=IpResultTable.end();it1++) {strvec AGroup=*it1; for(strvec::iterator it2=AGroup.begin();it2!=AGroup.end();it2++) {cout<<"*it2"<<" ";} cout<<endl; } } }
main.java:3: 错误: 类Point是公共的, 应在名为 Point.java 的文件中声明,这是什么错误
public static class Point { public double x; public double y; //定义一个点方法(函数),其表示为自然语言中的平面坐标点 public Point(double x, double y) { //定义点的横轴坐标值 this.x=x; //定义点的纵轴坐标值 this.y=y; } //根据已知点计算两点间的距离 public double getDistance(Point p) { //定义一个双精度的参数x放两点横轴坐标差值的绝对值 double x=Math.abs(this.x-p.x); //定义一个双精度的参数y放两点纵轴坐标差值的绝对值 double y=Math.abs(this.y-p.y); //根据正弦定理计算出一个双精度的两点坐标距离的值,并将其作为该方法(计算两点间坐标距离)的返回值 return Math.sqrt(x*x+y*y); } //根据已知点计算方位角 public double getAngle(Point p) { //定义一个双精度的参数x放两点横轴坐标差值的绝对值 double x=Math.abs(this.x-p.x); //定义一个双精度的参数y放两点纵轴坐标差值的绝对值 double y=Math.abs(this.y-p.y); //定义一个双精度的参数z放y/x的绝对值 double z=Math.abs(y/x); //计算出两点的坐标方位角,并将其作为该方法(计算已知两点构成的边的坐标方位角)的返回值 return (1/Math.atan(z))/Math.PI*180; } } public interface Check { public static final int Rou=206265; double check(Point P1, Point P2); } //前方交会测量计算 public static class Front_Intersection implements Check { public Point pointA = null; public Point pointB = null; public double angleA = 0; public double angleB = 0; public Point QFJH() { // 定义待定淀P的横轴坐标和纵轴坐标 double x_P = 0; double y_P = 0; int sign = 1; /* * 求出P点的坐标算法,根据余切定理式子的程序化,只需将对应点按逆时针顺序放入即可求出待定点,具体算法如下 */ double sAcB = Math.sin(angleA) * Math.cos(angleB); double cAsB = Math.cos(angleA) * Math.sin(angleB); double sAsB = Math.sin(angleA) * Math.sin(angleB); x_P = (pointA.x * sAcB + pointB.x * cAsB + sign * (pointA.y - pointB.y) * sAsB) / (sAcB + cAsB); y_P = (pointA.y * sAcB + pointB.y * cAsB + sign * (pointB.x - pointA.x) * sAsB) / (sAcB + cAsB); return new Point(x_P, y_P);// 返回P点的坐标值 } /* * 前方交会检核,返回值为求得的两点的横向位移之差的绝对值。 * */ @Override public double check(Point P1, Point P2) { // TODO Auto-generated method stub return P1.getDistance(P2); } } //侧方交会测量计算 public static class Side_Intersection implements Check { public Point pointA = null; public Point pointB = null; public Point pointC = null; public Point pointP = null; public double angleA = 0; public double angleP = 0; public double angleB = 180 - ( angleA + angleP ); public Point CFJH(){ //定义待定淀P的横轴坐标和纵轴坐标 double x_P =0; double y_P =0; int sign = 1; //求出P点的坐标算法 double sAcB = Math.sin(angleA)*Math.cos(angleB); double cAsB = Math.cos(angleA)*Math.sin(angleB); double sAsB = Math.sin(angleA)*Math.sin(angleB); x_P = (pointA.x*sAcB + pointB.x*cAsB + sign*(pointA.y - pointB.y)*sAsB) /(sAcB + cAsB); y_P = (pointA.y*sAcB + pointB.y*cAsB + sign*(pointB.x - pointA.x)*sAsB) /(sAcB + cAsB); return new Point(x_P, y_P);//返回P点的坐标值 } /* * 侧方交会检测方法,返回的是AP的方位角,由于基本的集合知识可以知道AP方位角正弦值的倒数即为观测∠APC的弧度 * */ @Override public double check(Point P1, Point P2) { // TODO Auto-generated method stub return P1.getAngle(P2); } } //主函数 public static class Main { public static void main(String[] args) { // TODO Auto-generated method stub /* * 前方交会测量实现以及对测量值的检核 * */ Point pC1 = new Point(0, 200); Point pB1 = new Point(0, 100); Point pA1 = new Point(0,0); double angleC1 = 44.992/180*Math.PI; double angleB11 = 89.999/180*Math.PI; double angleB12 = 90.001/180*Math.PI; double angleA1 = 45.0/180*Math.PI; //建立前方测量的第一次测量对象test Front_Intersection test = new Front_Intersection(); //依次按逆时针放入对应的点和参数值 test.pointA = pC1; test.pointB = pB1; test.angleA = angleC1; test.angleB = angleB11; Point ret = test.QFJH(); //建立前方测量的第二次测量对象test1 Front_Intersection test1 = new Front_Intersection(); //依次按逆时针放入对应的点和参数值 test1.pointA = pB1; test1.pointB = pA1; test1.angleA = angleB12; test1.angleB = angleA1; Point ret0 = test1.QFJH(); //第一次测量出来的点P的坐标 Point pP11 = new Point (ret.x , ret.y); //第二次测量出来的点P的坐标 Point pP12 = new Point (ret0.x , ret0.y); /* * * 以下为输出语句 * */ System.out.println("根据点C、B,以及∠C和∠CBP求得点P的第一次测量值:"); System.out.println("第一次测量出的点P :"+"(" + ret.x + ", " + ret.y +")"); System.out.println("根据点B、A,以及∠PBA和∠BAP求得点P的第二次测量值:"); System.out.println("第二次测量出的点P :"+"(" + ret0.x + ", " + ret0.y +")"); //实现检测方法 System.out.println("下面进行测量检测:"); double m = test.check(ret, ret0); if(m <= 0.2) { System.out.println("检测合格"); System.out.println("为了更精确P点,取两次测量的平均值:"); Point AVGP1 = new Point ((ret.x + ret0.x)/2 , (ret.y + ret0.y)/2); System.out.println("点P的综合测量值为 :" + "(" + AVGP1.x + ", " + AVGP1.y +")"); System.out.println("点P到点A的距离为:" + AVGP1.getDistance(pA1)); System.out.println("点P到点B的距离为:" + AVGP1.getDistance(pB1)); System.out.println("点P到点C的距离为:" + AVGP1.getDistance(pC1)); System.out.println("AP的方位角为:" + AVGP1.getAngle(pA1)); System.out.println("BP的方位角为:" + AVGP1.getAngle(pB1)); System.out.println("CP的方位角为:" + AVGP1.getAngle(pC1)); } else System.out.println("检测不合格 , 需要重新检测!!!"); /* * * 以下为侧方交会的实现以及对测量值的检核 * */ //侧方交会的参数值 Point pC2 = new Point(100, 0); Point pB2 = new Point(0, 100); Point pA2 = new Point(0, 0); double angleP2 = 45.002/180*Math.PI; double anglePO = 45.005/180*Math.PI; double angleA2 = 44.995/180*Math.PI; double angleB2 = (90.0 - angleP2 + angleA2)/180*Math.PI; //侧方交会的测量对象Test Side_Intersection Test= new Side_Intersection(); //按逆时针顺序依次放入参数 Test.pointA = pB2; Test.pointB = pA2; Test.angleA = angleB2; Test.angleP = angleP2; Point ret1 = Test.CFJH(); //求得的P点值 Point pP2 = new Point (ret1.x , ret1.y); //定义一个双精度变量n放置测量出来的P点到A的方位角正切值得倒数,即∠APC的测量值 double n = 1/Math.atan(Test.check(ret1, Test.pointA)); //定义一个双精度变量l放置点∠APC和观测值和测量值之差的绝对值 double l = Math.abs(anglePO - n); //进行检核判断 if(l <= 40){ System.out.println("检测合格"); System.out.println("点P的综合测量值为 :" + "(" + ret1.x + ", " + ret1.y +")"); System.out.println("点P到点A的距离为:" + pP2.getDistance(pA2)); System.out.println("点P到点B的距离为:" + pP2.getDistance(pB2)); System.out.println("点P到点C的距离为:" + pP2.getDistance(pC2)); System.out.println("AP的方位角为:" + pP2.getAngle(pA2)); System.out.println("BP的方位角为:" + pP2.getAngle(pB2)); System.out.println("CP的方位角为:" + pP2.getAngle(pC2)); } else System.out.println("检测不合格 , 需要重新检测!!!"); } }
关于flex与java交互的问题
各位前辈好! 本人最近在做一个关于输气管网计算界面的项目,要用到Flex与java通信。我在java里面定义了static变量,然后在flex里面向java传值(传的值有数组类型,也有double类型),然后在java里面实现计算并返回(能不能返回数组?如何做到?在flex里输入到什么组件比较好?)到flex。现在我经过测试发现传值的过程没什么问题,但是返回到flex里老出问题,百思不得其解,请求各位援助。 下面是我的调用的java类: (注:程序运行没有什么问题的,只是没法被flex调用返回值,我是想调用Final()或者calculation()来返回getP()等) package danxiang; import java.sql.ResultSet; import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List; import domain.Model; import domain.Result; import flex.messaging.io.ArrayList; public class SectionCalculationwj { static double d[]; static int start[]; public static double deta ; public static double Z; static int end[]; static double l[]; static double qq[]; static double Q0[]; static double section[]; public static int point; public static int ss; static double P0[] ; static double T0[]; public static double Th ; static double K[] ; public static double rog ; public static double cpg ; public static double Di; //下面这一部分是在flex里面调用的,从flex里面往这传值 public String initiateqq(double init[]) { qq=init; return "qq"; } public String initiatepoint(int i) { point=i; return "point"; } public String initiateSection(double init[]) { section=init; return "section"; } public String initiateStart(int init[]) { start=init; return "start"; } public String initiateEnd(int init[]) { end=init; return "end::"+end[1]; } public String initiated(double init[]) { d=init; return "D:::"+d[1]; } public String initiatel(double init[]) { l=init; return "L:::"+l[1]; } public String initiateT0(double init[]) { T0=init; return "T0"; } public String initiateQ0(double init[]) { Q0=init; return "Q0"; } public String initiateP(double init[]) { P0=init; return "P0"; } public String initiateK(double init[]) { K=init; return "K"; } public double initiatedeta(double DETA) { deta=DETA; return deta; } public double initiatess(int S) { ss=S; return ss; } public double initiaterog(double ROG) { rog=ROG; return rog; } public double initiatecpg(double C) { cpg=C; return cpg; } public double initiateDi(double di) { Di=di; return Di; } public double initiateTh(double th) { Th=th; return Th; } public double initiateZ(double zz) { Z=zz; return Z; } // // //下面是我希望调用的,并返回到flex里面。。 // public String Final() { // SectionCalculationwj aa = new SectionCalculationwj(); // aa.calculation(); // return "Hello,成功了!"; // // } public double[] calculation() { int step = 0; Result result = new Result(); //第一步,取初值 Model model = getInitValue(); //节点数 int n = model.getPoint(); //管道数 int m = model.getSection().length; //计算出A,Azz result.setA(A(model)); result.setAzz(Azz(result.getA())); result.setP(model.getP0()); result.setAverageP(averageP(model, result)); double condition; result.setQx(model.getQ0()); result.setT(model.getT0()); result.setBw(bw(result)); do { result.setSj(Sj(model, result)); double[] tempQ = {}; //算AGA之前先求出G result.setG(G(result.getSj(), result.getQx())); result.setAGA(AGA(result)); fenkuai kf = new fenkuai(); result.setP(kf.fk(result.getAGA(), model.getSs(), result.getP(), model.getQq())); result.setAverageP(averageP(model, result)); result.setDetap(detap(result)); tempQ = Qnew(result); condition = condition(tempQ, result.getQx()); for (int k = 0; k < tempQ.length; k++) { tempQ[k] = (result.getQx()[k] + tempQ[k]) / 2; } result.setQx(tempQ); // 温降 水 result.setAa(aa(model, result)); result.setT(resetT(model, result)); // 水的析出 result.setBw(bw(result)); result.setDetabw(detabw(model,result)); step += 1; } while (condition > 0.001); System.out.println(step); for (int i = 0; i < 12; i++) { System.out.println("" + result.getP()[i]); } for (int i = 0; i < 12; i++) { System.out.println("" + result.getT()[i]); } for (int i = 0; i < 11; i++) { System.out.println("" + result.getDetabw()[i]); } return result.getP(); } public double[][] A(Model model) { int[] start = model.getStart(); int[] end = model.getEnd(); double[] section = model.getSection(); int n = model.getPoint(); int m = section.length; double[][] A = new double[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (i + 1 == start[j]) { A[i][j] = -1; } if (i + 1 == end[j]) { A[i][j] = 1; } else if (i + 1 != start[j] && i + 1 != end[j]) { A[i][j] = 0; } } } return A; } //将A矩阵转置 public double[][] Azz(double[][] A) { int n = A.length; int m = A[0].length; double[][] Azz = new double[m][n]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { Azz[j][i] = A[i][j]; } } return Azz; } // 计算Sj public double[] Sj(Model model, Result result) { double[] section = model.getSection(); double[] D = model.getD(); double[] L = model.getL(); double[] T = result.getT(); double deta = model.getDeta(); double Z = model.getZ(); double[] averageP = result.getAverageP(); //第一步,计算lam的值 int m = section.length; double[] lam = new double[m]; double[] Sj = new double[m]; for (int i = 0; i < m; i++) { lam[i] = 0.009407 / Math.pow(D[i], (1.0 / 3)); } //第二步,计算Sj for (int i = 0; i < m; i++) { Sj[i] = -675.3515 * lam[i] * deta * Z * T[i] * L[i] / Math.pow(D[i], 5) / (2 * averageP[i]); } return Sj; } // 计算G public double[][] G(double[] Sj, double[] Q) { int m = Sj.length; double[][] G = new double[m][m]; for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { if (i == j) { G[i][j] = 1 / Sj[i] / Math.abs(Q[i]); } else { G[i][j] = 0; } } } return G; } //计算AGA public double[][] AGA(Result result) { double[][] G = result.getG(); double[][] A = result.getA(); double[][] Azz = result.getAzz(); int n = A.length; int m = A[0].length; double AG[][] = new double[n][m]; double AGA[][] = new double[n][n]; for (int i = 0; i < A.length; i++) { for (int j = 0; j < G[0].length; j++) { for (int k = 0; k < G.length; k++) { AG[i][j] += A[i][k] * G[k][j]; } } } for (int i = 0; i < AG.length; i++) { for (int j = 0; j < Azz[0].length; j++) { for (int k = 0; k < Azz.length; k++) { AGA[i][j] += AG[i][k] * Azz[k][j]; } } } return AGA; } public double[] detap(Result result) { double[][] Azz = result.getAzz(); double[] p = result.getP(); int m = Azz.length; int n = Azz[0].length; double[] detap = new double[m]; //计算压力降 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { detap[i] += Azz[i][j] * p[j]; } } return detap; } public double[] averageP(Model model, Result result) { double[] P = result.getP(); int[] start = model.getStart(); int[] end = model.getEnd(); int m = start.length; double[] averageP = new double[m]; for (int j = 0; j < m; j++) { averageP[j] = 0.5 * (P[start[j] - 1] + P[end[j] - 1]); } return averageP; } public double[] Qnew(Result result) { //计算新流量 double[][] G = result.getG(); double[] detap = result.getDetap(); int m = G.length; double[] Qnew = new double[m]; for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { Qnew[i] += G[i][j] * detap[j]; } } return Qnew; } public double condition(double[] tempQ, double[] Q) { int m = tempQ.length; double condition = 0.0; for (int i = 0; i < m; i++) { condition += Math.pow((tempQ[i] - Q[i]), 2); } condition = Math.pow(condition, 0.5); return condition; } //单相温降计算 public double[] aa(Model model, Result result) { double[] Q = result.getQx(); double[] D = model.getD(); double[] K = model.getK(); double rog = model.getRog(); double cpg = model.getCpg(); double[] bw=result.getBw(); int m = Q.length; double[] aa = new double[m]; for (int i = 0; i < m; i++) { aa[i] = K[i] * Math.PI * D[i] / ((rog+bw[i]) * Q[i] * cpg )/1000000; } return aa; } public double[] resetT(Model model, Result result) { double Th = model.getTh(); int[] start = model.getStart(); int[] end = model.getEnd(); double[] T = result.getT(); double[] aa = result.getAa(); double[] l = model.getL(); double Di = model.getDi(); double[] detap = result.getDetap(); int m = aa.length; for (int i = 0; i < m; i++) { T[end[i] - 1] = Th + ((T[start[i] - 1]) - Th) * Math.exp(-aa[i] * l[i]) + Di * detap[i] / 1000000 * (1 - Math.exp(-aa[i] * l[i])) / aa[i] / l[i]; } return T; } //饱和水的计算kg/m3直接加在气体密度上 public double[] bw(Result result) { double[] T = result.getT(); double[] P=result.getP(); int m = P.length; double[] pb=new double[m];//饱和蒸汽压 double[] bw = new double[m]; // y = 0.06233 x3 + 0.60057 x2 + 46.27664 x + 643.34653 xOC,ypa for (int j = 0; j < m; j++) { pb[j] = 0.06233*Math.pow(T[j]-273.15,3)+0.60057*Math.pow(T[j]-273.15,2)+46.27664*(T[j]-273.15)+643.34653; bw[j]=803*pb[j]/(P[j]-pb[j])*0.001; } return bw; } //起终点水量变化计算 >0进水,<0析出水 单位kg public double[] detabw(Model model,Result result) { double[] bw = result.getBw(); int[] start=model.getStart(); int[] end=model.getEnd(); double[]d=model.getD(); double[]L=model.getL(); int m = start.length; double[] detabw = new double[m]; for (int j = 0; j < m; j++) { detabw[j] = (bw[end[j]-1] - bw[start[j]-1])*(Math.PI*Math.pow(d[j], 2)/4)*L[j]; } return detabw; } }
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
相关热词 c# clr dll c# 如何orm c# 固定大小的字符数组 c#框架设计 c# 删除数据库 c# 中文文字 图片转 c# 成员属性 接口 c#如何将程序封装 16进制负数转换 c# c#练手项目
立即提问