c++main函数的命令行参数问题

int main(int argc,char *argv[]);
函数从命令行读取参数
1.是不是只有生成了test.exe文件之后才能从命令行读取参数(因为我看见 好多都是在命令行输入test.exe后面再加一些参数这样子的),也就是说 我还在调试阶段就不能从命令行输入参数?
2.没有从命令行输入参数的时候,argc=1,*argv[0]是程序的路径的名称,如果main后面的括号里面没有东西,是不是意味着我不能在命令行里运行他,因为找不到路径?

3个回答

1.如果你是在DOS窗口下运行程序下的话,需要你生成.exe程序后,执行,形如:*.exe arg1 arg2,这是一种从主函数中读取命令行参数的方法。其实你也可以直接在项目属性中设置,设置主函数要接收的参数,以vs2013为例,工程-》属性-》配置属性-》调试,在右侧有一个命令参数,你可以将主函数要接收的参数,写进行,中间以空格分开。注意,这里的参数没有*.exe。直接写arg1,arg2。
2.如果你的main函数没有写成int main(int argc,char *argv[]);这种形式,那么主函数就不能接收函数参数。
总之,如果要接收函数参数,则必须要这么写int main(int argc,char *argv[]);

很多时候我们的程序需要从外部获取一些运行时的参数,比如我的主程序 去调用另外一个exe或者其他的程序,在调用外部可执行程序的时候,一般我们都需要传入一些参数。 那么在我们的外部程序 如何来获取传入的参数呢?
   下面我们来看一下: 
   在WinMain函数的主函数中,已经传入了一个参数 LPTSTR    ......
答案就在这里:关于Main函数的命令行参数
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

调试的时候,你可以在编译器的debug选项中填上你希望的调试参数,这样调试的时候,就会收到这个参数给你来调试

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++main函数的命令行参数问题
int main(int argc,char *argv[]); 函数从命令行读取参数 1.是不是只有生成了test.exe文件之后才能从命令行读取参数(因为我看见 好多都是在命令行输入test.exe后面再加一些参数这样子的),也就是说 我还在调试阶段就不能从命令行输入参数? 2.没有从命令行输入参数的时候,argc=1,*argv[0]是程序的路径的名称,如果main后面的括号里面没有东西,是不是意味着我不能在命令行里运行他,因为找不到路径?
C语言使用命令行参数问题
在C语言中,为了使用命令行参数,main函数的第一行一般形式为void main(int argc,char*argv[]),如果命令行为“test a 3 data”,则argv[0]表示的是:A)test B)a C)3 D)data===答案是A,求大侠解释?
函数名做函数参数 无法解析的外部命令
#include<stdio.h> int main() { float average(float array[10]); float score[10], aver; int i; printf("input 10 score:\n"); for (i = 0; i < 10; i++) scanf("%f",&score[i]); printf("\n"); aver = average(score); printf("average score is %5.2f", aver); } float averge(float array[10]) { int i; float aver,sum = array[0]; for (i = 1; i < 10; i++) sum = sum + array[i]; aver = sum / 10; return(aver); }![图片说明](https://img-ask.csdn.net/upload/201512/20/1450576354_542954.png)我是编程菜鸟,不明白错误的意思,求各位大神帮忙
类的定义和它的成员函数的实现分开放会报错
为什么将类的定义和它的成员函数的实现分别放在.h和.cpp中就会报错: LNK2019: 无法解析的外部符号 "public: void __cdecl YtPlc_Mitsubishi_Mc::InitParam(void)" (?InitParam@YtPlc_Mitsubishi_Mc@@QEAAXXZ),该符号在函数 main 中被引用 PLC_test D:\zhoujy\prj\PLC_test\PLC_test\PLC_test.obj .h中的代码如下: ``` class YtPlc_Mitsubishi_Mc // : public YtPlc { public: YtPlc_Mitsubishi_Mc(); //初始化参数 void InitParam(); }; ``` .cpp中的实现如下: ``` #include "ytplc_mitsubishi_mc.h" YtPlc_Mitsubishi_Mc::YtPlc_Mitsubishi_Mc() { } void YtPlc_Mitsubishi_Mc::InitParam() { //发送命令 write_buff_[0] = 0x50; // 副头部 write_buff_[1] = 0x00; // 副头部 write_buff_[2] = 0x00; // 网络编号 write_buff_[3] = (char)0xff; // 可编程控制器编号 write_buff_[4] = (char)0xff; // 请求目标模块I/O编号L write_buff_[5] = 0x03; // 请求目标模块I/O编号H write_buff_[6] = 0x00; // 请求目标模块站号 // 长度从CPU监视定时器L到指令结束 write_buff_[7] = 0x00; //请求数据长度L write_buff_[8] = 0x00; //请求数据长度H //CPU 监视定时器 0:无限等待 0001~FFFF H (1~65535): 等待时间(单位 250ms) @《三菱Q_L系列通信协议参考》3.1.3 P73 write_buff_[9] = 0x01; // CPU监视定时器L write_buff_[10] = 0x00; // CPU监视定时器H // 指令1401 @《三菱Q_L系列通信协议参考》3.3.7 P154 write_buff_[11] = 0x01; // 指令L write_buff_[12] = 0x14; // 指令H write_buff_[13] = 0x00; // 子指令L write_buff_[14] = 0x00; // 子指令H // 字单位的批量写入 write_buff_[15] = 0x00; // 起始软元件 write_buff_[16] = 0x00; // 起始软元件 write_buff_[17] = 0x00; // 起始软元件 write_buff_[18] = 0x00; // 软元件代码 write_buff_[19] = 0x00; // 软元件点数 write_buff_[20] = 0x00; // 软元件点数 // 软元件点数的范围 // e.g 1995H 1202H 1130H -> {95H 19H 02H 12H 30H 12H} for (int i = 0; i < 20; i++) { write_buff_[21 + i * 2] = 0x00; write_buff_[21 + i * 2 + 1] = 0x00; } //读取命令 read_buff_[0] = 0x50; // 副头部 read_buff_[1] = 0x00; // 副头部 read_buff_[2] = 0x00; // 网络编号 read_buff_[3] = (char)0xff; // 可编程控制器编号 read_buff_[4] = (char)0xff; // 请求目标模块I/O编号L read_buff_[5] = 0x03; // 请求目标模块I/O编号H read_buff_[6] = 0x00; // 请求目标模块站号 read_buff_[7] = 0x0c; //请求数据长度L read_buff_[8] = 0x00; //请求数据长度H //CPU 监视定时器 0:无限等待 0001~FFFF H (1~65535): 等待时间(单位 250ms) @《三菱Q_L系列通信协议参考》3.1.3 P73 read_buff_[9] = 0x01; // CPU监视定时器L read_buff_[10] = 0x00; // CPU监视定时器H // 0401 T寄存器读取 @《三菱Q_L系列通信协议参考》3.3.6 P150 // WARNING: M寄存器读取 send_buff_[18] = 0x90 待确认 read_buff_[11] = 0x01; // 指令L read_buff_[12] = 0x04; // 指令H read_buff_[13] = 0x00; // 子指令L read_buff_[14] = 0x00; // 子指令H // 字单位的批量写入 read_buff_[15] = 0x00; // 起始软元件 read_buff_[16] = 0x00; // 起始软元件 read_buff_[17] = 0x00; // 起始软元件 read_buff_[18] = 0x00; // 软元件代码 read_buff_[19] = 0x00; // 软元件点数 read_buff_[20] = 0x00; // 软元件点数 } ``` 但如果把它们都放到头文件中,即把成员函数和构造函数的实现和类的定义放到一起,就不会有这个问题了
一个c语言的改错题 应该第二个空不会
程序D1069.c的功能是逆序输出所有命令行参数(不包括命令本身),要求main函数的形参名称必须使用标准的argc与argv。 代码如下 在found下找错 #include <stdio.h> /* 要求main函数的形参名称必须使用标准的argc与argv */ /*********Found************/ int main(______________) { while (argc > 1) { /*********Found************/ printf("%s\n", ______________); --argc; } return 0; }
qt 运行出来的框图有残缺
# cpp文件 ``` #include "vsbak.h" #include "ui_vsbak.h" #include <QSettings> #include <QFileDialog> #include<QTime> #include<QtDebug> #include <QMessageBox> #define CONFIG_FILE "config.ini" const QString EXCLUDE_FILE = "/home/hu/project2";// 這個文件沒啥用 Vsbak::Vsbak(QWidget *parent) : QWidget(parent) , ui(new Ui::Vsbak) { ui->setupUi(this); QSettings *configIniRead = new QSettings(CONFIG_FILE, QSettings::IniFormat); dir_src = configIniRead->value("/main/bak_src").toString(); dir_dest = configIniRead->value("/main/bak_dest").toString(); // 配置文件里面有目标地址 gpg_key = configIniRead->value("/main/gpg_key").toString(); exclude_from = configIniRead->value("exclude/exclude").toString(); delete configIniRead; // init bash terminal //QProcess可以用于启动外部程序 cmd = new QProcess(this);// 因为与父类直接释放内存 // Sets the working directory to dir. QProcess will start the process in this directory. //The default behavior is to start the process in the working directory of the calling process. cmd->setWorkingDirectory(dir_src); //This signal is emitted when the process has made new data available //through its standard output channel (stdout). It is emitted regardless of the current read channel. connect(cmd, &QProcess::readyReadStandardOutput, this, &Vsbak::on_readyReadStandardOutput); connect(cmd, &QProcess::readyReadStandardError, this, &Vsbak::on_readyReadStandardError); ui->lineEdit->setText(dir_src); ui->lineEdit_2->setText(dir_dest); // 在ui里直接设置这个地址 // init comboBox init_comboBox(); // init radiobutton: choice full ui->radioButton->setChecked(true); ui->checkBox->setChecked(false); ui->checkBox_2->setEnabled(false); ui->checkBox_3->setEnabled(false); } /* * 设置最大可见数目为5,是不是不合理? */ void Vsbak::init_comboBox() // 找压缩好的文件 Combobox 下拉菜单 { /* * 1. 用一个对象进入dir-dest目录下 * 2. 过滤掉包含后追的文件 * 3. 获取被过滤的文件理解 */ // find all backup.tar.gz files //The QDir class provides access to directory structures and their contents. 不仅能看到结构,还可以看到目录 QDir *curDir = new QDir(dir_dest); //The QStringList class provides a list of strings. //可以让你提取一个新的列表只包含这些字符串包含一个特定的字符串(或匹配特定正则表达式) QStringList filter; // 过渡成一个目录 filter << "*.tar.gz" << "*.tar.gz.gpg"; curDir->setNameFilters(filter); // 过滤掉特定的目录下的文件 //Returns a list of QFileInfo objects for all the files and directories in the directory //QDir::entryInfoList()会获取该目录下所有目录和文件的QFileInfo对象的列表 QList<QFileInfo> *tarFileInfo = new QList<QFileInfo>(curDir->entryInfoList(filter)); /* * dir_dest 里面存放的其实都是被压缩的文件,所以用上面的后缀直接进行过滤 * 1. 设置最大的可见数目为5 * 2. 看目录里面有多少,然后放入这个comboBox * 3. 获取被过滤的文件 * 4. 按照顺序放入到combobox中 */ ui->comboBox->clear(); ui->comboBox->setMaxVisibleItems(5); // 最大可见数目 5 //The string will be inserted as the first item in the combobox. ui->comboBox->setInsertPolicy(QComboBox::InsertAtTop); for (int i=0; i< tarFileInfo->count(); i++)// count()只是计算里面的数量,tarFileinfo实际上是一个文件列表 ui->comboBox->addItem(tarFileInfo->at(i).fileName()); } Vsbak::~Vsbak() { delete ui; // 有何作用 if(cmd->state() == QProcess::Running){ cmd->terminate(); cmd->waitForFinished(); } } void Vsbak::on_readyReadStandardOutput() { // QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput()); // ui->label_4->setText(out); } void Vsbak::on_readyReadStandardError() { QMessageBox::information(0, "Error", cmd->readAllStandardError()); } // change dir_src void Vsbak::on_toolButton_clicked() { /* * 1. 或许dir_src的文件目录名称 * 2. 将dir_src的文件目录名写到lineEdit上面 * 3. 更新配置文件里面的信息 * 4. 设置工作目录 * */ QString dirname; dirname = QFileDialog::getExistingDirectory(this, tr("Open Directory"), dir_src, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(dirname.isEmpty()) return; else { dir_src = dirname; ui->lineEdit->setText(dir_src); QSettings *configIniWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); configIniWrite->setValue("/main/bak_src", dir_src); delete configIniWrite; cmd->setWorkingDirectory(dir_src); ui->label_4->setText("change source dir sucess!"); } } // change dir_dest void Vsbak::on_toolButton_2_clicked() { QString dirname; // getExistingDirectory 只获取文件夹 dirname = QFileDialog::getExistingDirectory(this, tr("Open Directory"), dir_dest, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(dirname.isEmpty()) return; else { dir_dest = dirname; ui->lineEdit_2->setText(dir_dest); QSettings *configIniWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); configIniWrite->setValue("/main/bak_dest", dir_dest); delete configIniWrite; ui->label_4->setText("change dest dir sucess!"); } } int Vsbak::get_min(QDateTime curTime) { QSettings *configIniReadWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); int lastTime = configIniReadWrite->value("/main/last_time").toInt();// 将值转化成整形 configIniReadWrite->setValue("/main/last_time", curTime.toTime_t()); delete configIniReadWrite; int minDiff = (curTime.toTime_t()-lastTime) / 60 + 1; return minDiff; } void Vsbak::on_checkBox_clicked() { if(ui->checkBox->isChecked()){ ui->checkBox_2->setEnabled(true); ui->checkBox_3->setEnabled(true); } else{ ui->checkBox_2->setEnabled(false); ui->checkBox_3->setEnabled(false); } } /* * 3 个 String类型 * targz:time + full.tar.gz * cmd_find:find ./ -type f | grep -v \'Permission denied\' > TEPLIST * cmd_tar *目录列表 * * * */ void Vsbak::on_pushButton_clicked(){ // The QDateTime class provides date and time functions. // 调用QDatetime里面的一个函数,赋给另一个QDatetime的类型 QDateTime current_date_time = QDateTime::currentDateTime(); // 初始化三个String类型 QString targz, cmd_find, cmd_tar; //RadioButton presents an option button that can be toggled on (checked) or off (unchecked). //Radio buttons are typically used to select one option from a set of options. //Use isChecked() to see if a particular button is selected. if(ui->radioButton->isChecked()){ // 如果radiobutton 被选择了,那么就进行备份,如果没有就只输出时间 // Linux find命令用来在指定目录下查找文件。 // 将目前目录其其下子目录中所有一般文件列出 # find . -type f // Linux grep 命令用于查找文件里符合条件的字符串。 // -v 或 --revert-match : 显示不包含匹配文本的所有行。 // 反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。 // ./ 表示当前目录的全路径 当前目录的全路径 没有这个 \'Permission denied\'???? //linux的命令,查找文件然后设置权限 // 这个是不管修改不修改,全部列出来 cmd_find = "find ./ -type f | grep -v \'Permission denied\' > TEPLIST";// 这个功能是什么呢 targz = current_date_time.toString("yyyy-MM-dd_hh.mm.ss") + ".full.tar.gz"; }else{ // 会替换掉前面的百分之1,替换规则是从小到大 //get_min是一个函数,看它具体怎么实现的,应该是循环遍历了current_date_time,找到最小???? int minDiff = get_min(current_date_time); // 获得是最小的查值 // 完成命令,把距离最新一次全部修改的文件单独列出来 cmd_find = QString("find ./ -mmin -%1 -type f | grep -v \'Permission denied\' > TEPLIST").arg(minDiff); targz = current_date_time.toString("yyyy-MM-dd_hh.mm.ss") + ".inc.tar.gz"; } // exclude from 是一个配置目录 // tar命令 //-v或--verbose 显示指令执行过程 // --totals 备份文件建立后,列出文件大小 //cmd_tar这是压缩tar的linux命令,将exclude里面的文件全部列出来,进行压缩 cmd_tar = QString("tar --verbose --totals --exclude-vcs %1 --files-from=TEPLIST -czf %2/%3").arg(exclude_from).arg(dir_dest).arg(targz);//?5 // 向调试器输出命令的执行结果,方便调试排错 qDebug()<< cmd_find << endl << cmd_tar<< endl; // 下面整个过程就是执行这个命令 QStringList cmd_pipe;// 初始化了一个String目录 cmd_pipe << "-c" << cmd_find; // 说明这个cmd-pipe已经变成了一个linux的cmd命令了 cmd->start("/bin/bash",cmd_pipe); // 开始一个程序 cmd->waitForFinished(); cmd->close(); cmd->start(cmd_tar);// cmd_tar 也变成了一个程序 cmd->waitForFinished(); cmd->close(); cmd->start("rm -f TEPLIST");// 强制删除teplist, teplist 就是临时文件 cmd->waitForFinished(); /*********** Encrypting*************/ // gpg-k 增加公共钥匙 if(ui->checkBox->isChecked()){ QString cmd_enc; QString cmd_isKey = "gpg -k " + gpg_key; cmd->start(cmd_isKey); cmd->waitForFinished(); QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput());// 这个输出就不是很理解为什么 if(out.isEmpty()) // -o, --output FILE write output to FILE // c 说是使用对称加密,看起来很奇怪 cmd_enc = QString("gpg -c -o %1/%2.gpg %1/%2").arg(dir_dest).arg(targz); else // e 是加密数据 , 针对 用户 id 进行加密 cmd_enc = QString("gpg -e -r %1 -o %2/%3.gpg %2/%3").arg(gpg_key).arg(dir_dest).arg(targz); cmd->start(cmd_enc); cmd->waitForFinished(); if(false == ui->checkBox_2->isChecked()){ QString cmd_rm = QString("rm %1/%2.gpg").arg(dir_dest).arg(targz); cmd->start(cmd_rm); cmd->waitForFinished(); } if(false == ui->checkBox_3->isChecked()){ QString cmd_rm = QString("rm %1/%2").arg(dir_dest).arg(targz); cmd->start(cmd_rm); cmd->waitForFinished(); } /* * /home/hu/桌面/vsbak/backup/2019-11-13_19.38.57.full.tar.gz * */ // ui->comboBox->addItem(targz); init_comboBox(); } } void Vsbak::on_pushButton_2_clicked(){ QString targz = ui->comboBox->currentText(); if (targz.endsWith(".tar.gz.gpg")){ targz = targz.remove(".gpg"); QString cmd_enc; QString cmd_isKey = "gpg -k " + gpg_key; cmd->start(cmd_isKey); cmd->waitForFinished(); QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput()); if(out.isEmpty()) cmd_enc = QString("gpg -d -o %1/%2 %1/%2.gpg").arg(dir_dest).arg(targz); else cmd_enc = QString("gpg -d -r %1 -o %2/%3 %2/%3.gpg").arg(gpg_key).arg(dir_dest).arg(targz); cmd->start(cmd_enc); cmd->waitForFinished(); } QString cmd_str = QString("tar -xvf %1/%2").arg(dir_dest).arg(targz); qDebug() << cmd_str; cmd->start(cmd_str); cmd->waitForFinished(); } ``` 上面是cpp文件 下面是 # h文件 #ifndef VSBAK_H #define VSBAK_H #include <QWidget> #include<QProcess> QT_BEGIN_NAMESPACE namespace Ui { class Vsbak; } QT_END_NAMESPACE class Vsbak : public QWidget { Q_OBJECT public: Vsbak(QWidget *parent = nullptr); ~Vsbak(); private slots: void on_readyReadStandardOutput(); void on_readyReadStandardError(); void on_toolButton_clicked(); void on_toolButton_2_clicked(); void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_checkBox_clicked(); private: Ui::Vsbak *ui; QProcess *cmd; QString dir_dest; QString dir_src; QString gpg_key; QString exclude_from; void init_comboBox(); int get_min(QDateTime curTime);// 获得整形 }; #endif // VSBAK_H 我运行之后出来的qt界面,原本是可以下拉选择的,但是都没有反映,这是为啥
c++,用VC6与opencv目前只想把图像显示出来,语法没错但无法显示,有什么问题求教大神
实验5 类和对象 实验目的 掌握类和对象的创建 掌握构造函数、构造函数的重载,拷贝构造函数、析构函数的设计和使用 掌握成员函数的设计和使用 实验内容 下面的代码已经创建了图像类的框架,请完善该图像类。在该类中,实现图像的读入、保存、显示,并实现图像的翻转、缩放、裁剪等操作。在主程序中,读入某个图像文件(比如“fruits.jpg”) ,对其进行缩小,上下翻转,左右翻转,指定区域裁剪等操作。 [使用多文件结构设计该类,即类的声明代码在.h文件中,类的实现代码在.cpp文件中,main函数的代码在另一个.cpp文件中。] 请编程实现: 图像类: 1.创建图像类Image,实现各个重载的构造函数,拷贝构造函数(深拷贝),析构函数。 2.实现对图像的读入,保存,显示。即实现函数Read,Show,Write。 3.获取图像中某像素点的值。即实现函数At()。 4.将图像中给定像素点的像素值设置为某值,即实现函数Set。将图像所有像素的像素值设定为某值,即实现函数SetAll。 5.同一个函数实现图像的上下翻转、左右翻转。即实现函数Flip。 6.根据指定区域裁剪图像。 7.求图像的均值,方差。 8.图像的旋转,缩放。 9.定义友元函数交换两个Image对象的数据。 在函数中实现: 10.创建Image类对象img。 11.读入文件中的图像“fruits.jpg”,并显示。 12.利用Image类的成员函数,对图像进行翻转、旋转,并显示。 13.利用Image类的成员函数,将图像长宽缩小到1/2大小,并显示;将图像长宽放大2倍,并显示。 14.利用拷贝构造函数,创建新的对象new_img。 15.给定的两个点(Point):左上点(top_left)和右下点(bottom_right),将此指定区域内的new_img对象图像进行裁剪操作,并显示结果。 16.求图像的所有像素点的均值和方差,并输出。 17.交换两个Image对象的数据。 Image.h #ifndef IMAGE_H #define IMAGE_H class Image { public: Image(); //无参数的构造函数,创建行列都为零的Image对象 Image(int h, int w); //构造函数重载,创建h行,w列的Image对象 Image(int h, int w, unsigned char val); //构造函数重载,创建的图像像素值都为val; Image(char* ImageName); //构造函数重载,利用文件名从硬盘加载图像文件成为Image对象; Image(unsigned char *m, int rows, int cols); //构造函数重载,从一维静态数组创建Image对象,图像的行数和列数由后面两个参数给出; Image(unsigned char m[][100], int rows); //构造函数重载,从静态二维数组创建Image对象,图像的行数(二维数组的第一个维度)由第二个参数rows给出; Image(unsigned char **m, int h, int w); //构造函数重载,从动态数组(二级指针)创建Image对象,图像的行数和列数由后面两个参数给出; Image(const Image &im); //拷贝构造函数; ~Image(); //析构函数; void Read(char* ImageName); //从硬盘文件中读入图像数据; void Write(char* filename); //将图像数据保存为图像文件; void Show(char* winname); //显示图像; unsigned char& At(int row, int col); //获取第row行第col列的像素点的值; void Set(int row, int col, unsigned char value); //设置像素(row,col)为某值; void SetAll(unsigned char value); //设置图像所有像素为同一值; void Flip(int code); //图像的翻转; 根据code的值:0:左右翻转,1:上下翻转; void Resize(int code); //图像的缩放;根据code的值:0:缩小一倍,1:放大一倍; void Cut(int x1,int y1,int x2,int y2);//裁剪点(x1,y1)到点(x2,y2)的图像 void Rotate(int degree);//图像旋转的函数(简单起见,旋转角度为90度的整数倍) void Mean_Variance(float &m, float &var);//求图像的均值和方差,利用参数输出 friend void Swap(Image &a, Image &b);//使用友元函数交换两个Image对象的数据 private: unsigned char **data; int height; int width; }; #endif Image.cpp #include "cv.h" #include "highgui.h" #include "Image.h" //构造函数 Image::Image() { //write your code here } //构造函数重载 Image::Image(int h, int w) { //write your code here } // 其他重载构造函数的实现 // ...... //拷贝构造函数 Image::Image(const Image &im) { //write your code here } //析构函数 Image::~Image() { //write your code here } //从硬盘读入图像文件; void Image::Read(char* ImageName) { IplImage* img = cvLoadImage(ImageName, CV_LOAD_IMAGE_GRAYSCALE); unsigned char *img_data = (unsigned char *)(img->imageData); int widthstep = img->widthStep; //将一维指针img_data指向的内存中的值写入成员变量二维指针data所指的内存中 //write your code here cvReleaseImage(&img); } //保存图像; void Image::Write(char filename) { IplImage img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); unsigned char *img_data = (unsigned char *)(img->imageData); int widthstep = img->widthStep; //将成员变量二维指针data所指内存中的值写入一维指针img_data所指的内存 //write your code here cvSaveImage(filename, img); cvReleaseImage(&img); } //显示图像; void Image::Show(char *winname) { IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); unsigned char *img_data = (unsigned char *)(img->imageData); int widthstep = img->widthStep; //将data所指内存中的值写入img_data所指的内存 //write your code here cvNamedWindow(winname, CV_WINDOW_AUTOSIZE);//创建窗口 cvShowImage(winname, img); cvWaitKey(0); cvReleaseImage(&img); //释放图像; } //获取图像中指定点的值 unsigned char& Image::At(int row, int col) { //write your code here } //设置图像为同一值 void Image::Set(unsigned char value) { //write your code here } //false 左右,true 上下; void Image::Flip(int code) { //write your code here } //图像缩小,放大 void Image::Resize(int code) { //write your code here } //图像裁剪的函数 //图像旋转的函数 //write your code here //实现友元函数,交换两个Image对象的数据 void Swap(Image &a, Image &b) { } CppExp.cpp #include “Image.h” int main(int argc, char* argv[]) { Image img; //创建对象 img.Read("Fruits.jpg"); //img.Write("FruitsCopy.jpg"); cvNamedWindow("Image", CV_WINDOW_AUTOSIZE); img.Show("Image"); cvWaitKey(0); //等待按键 //write your code here //实现图像的左右翻转,如img.Flip(true);并显示 //实现图像的上下翻转,显示 //实现图像的缩放,显示 //获取图像的某点的像素值,并修改 //使用拷贝构造函数创建新的对象 Image new_img(img); //截取指定区域内的图像,并显示 //旋转图像并显示(简单起见,旋转角度为90度的整数倍) //求图像的均值和方差,并在命令行输出 //交换两个图像的数据 Image img1("Baboon.jpg"); Image img2("Lena.jpg"); img1.Show("Image1"); img2.Show("Image2"); cvWaitKey(0); //等待按键 Swap(img1, img2); img1.Show("Image1"); img2.Show("Image2"); cvWaitKey(0); //等待按键 return 0; } 实验要求 完成上述代码,并能显示正确的结果图像。 下面是我自己编写的代码: #include "cv.h" #include "highgui.h" #include "Image.h" #include<iostream.h> Image::Image() //无参数的构造函数,创建行列都为零的Image对象 { width=0; height=0; } Image::Image(int h, int w)//构造函数重载,创建h行,w列的Image对象 { height=h; width=w; } Image::Image(char* ImageName) { IplImage* img = cvLoadImage("Fruits.jpg", CV_LOAD_IMAGE_GRAYSCALE); } Image::DrawPixel(IplImage* img,int row, int col, unsigned char v) { unsigned char *img_data = (unsigned char *)(img->imageData); int width_step = img->widthStep; img_data[width_step * row + col] = v; } Image::Image(IplImage *img, int height, int width, unsigned char val) { int a,b; for(a=0;a<=height-1;a++) { for(b=0;b<=width-1;b++) { DrawPixel(img,a,b,val); } } return; } /*Image::Image(IplImage *img) { unsigned char *img_data = (unsigned char *)(img->imageData); int height=img->height; int width=img->width; int x; unsigned char **a; //动态声明一个二维数组 a=new unsigned char *[height]; a[0] =new unsigned char[height * width]; for (x=1;x<height;x++) { a[x]=a[x-1]+width; } }*/ void Image::Read(char* ImageName,unsigned char **a) { IplImage* img = cvLoadImage(ImageName, CV_LOAD_IMAGE_GRAYSCALE); unsigned char *img_data = (unsigned char *)(img->imageData); int widthstep = img->widthStep; int height=img->height; int width=img->width; cout<<height; //unsigned char **a; int x,y,z=0; for(x=0;x<width;x++) { for(y=0;y<height;y++) { a[x][y]=img_data[z]; z++; } } for(int i = 0;i < height;i++) { delete a[i]; a[i] = NULL; } delete [height]a; a = NULL; cvReleaseImage(&img); } void Image::Write(char *filename) { IplImage* img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); unsigned char *img_data = (unsigned char *)(img->imageData); int widthstep = img->widthStep; int height=img->height; int width=img->width; unsigned char **a; int x,y,z=0; for (x=0;x<width;x++) { for (y=0;y<height;y++) { img_data[z]=a[x][y]; z++; } } cvSaveImage(filename, img); cvReleaseImage(&img); } void Image::Show(char *winname) { IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); unsigned char *img_data = (unsigned char *)(img->imageData); int widthstep = img->widthStep; int height=img->height; int width=img->width; unsigned char **a; int x,y,z=0; for (x=0;x<width;x++) { for (y=0;y<height;y++) { img_data[z]=a[x][y]; z++; } } cvNamedWindow(winname, CV_WINDOW_AUTOSIZE);//创建窗口 cvShowImage(winname, img); cvWaitKey(0); cvReleaseImage(&img); //释放图像; }; Image::~Image() { //write your code here } int main(int argc, char* argv[]) { Image img; //创建对象 IplImage* img1 = cvLoadImage("Fruits.jpg", CV_LOAD_IMAGE_GRAYSCALE); unsigned char *img1_data = (unsigned char *)(img1->imageData); int height=img1->height; int width=img1->width; int x; unsigned char **a; //动态声明一个二维数组 a=new unsigned char *[height]; a[0] =new unsigned char[height * width]; for (x=1;x<height;x++) { a[x]=a[x-1]+width; } Image("Fruits.jpg"); img.Read("Fruits.jpg",a); //img.Write("FruitsCopy.jpg"); //cvNamedWindow("Image", CV_WINDOW_AUTOSIZE); //img.Show("Image"); //cvWaitKey(0); //等待按键 return 0; } 结果是这样的,为什么呢,我只想先把图像显示出来: ![图片说明](https://img-ask.csdn.net/upload/201604/30/1461986867_53649.png)
GregorianCalender类型的变量怎么传参??
自定义类Person,Person类定义3个private的属性(成员变量):姓名name,String类型;性别sex,char类型;生日birthday,GregorianCalender类型。类中定义构造方法如下:有3个参数的构造方法,初始化姓名、性别和生日;有2个参数的构造方法,调用有3个参数的构造方法,初始化姓名、性别和生日,默认初始化为图1第2行所示的值;无参数的构造方法,调用有3个参数的构造方法,姓名、性别和生日默认初始化为图1第1行所示的值。类中定义三个成员变量的setter和getter方法。类中覆盖父类的toString()方法,按图1每行的格式返回描述Person类信息的字符串。最后,类中增加main()方法,c方法如图1所示讲对象的信息显示在命令行的每一行。 ![图片说明](https://img-ask.csdn.net/upload/201602/16/1455608824_364900.jpg) 生日birthday,GregorianCalender类型 那生日这个变量怎么在有参构造函数里传参啊。一直出错啊不知道怎么办。谢谢。 ![图片说明](https://img-ask.csdn.net/upload/201602/16/1455609460_625542.jpg) ![图片说明](https://img-ask.csdn.net/upload/201602/16/1455609481_115985.jpg) 运行结果 ![图片说明](https://img-ask.csdn.net/upload/201602/16/1455609500_364658.jpg)
我想做一个类似于记事本的软件,但是该怎么办才能通过双击将文件名传到主函数?
我想要做一个类似于记事本的软件,先做到能写入,做到双击可以打开文件xxx.lg对其写入数据。但是现在在dos命令符中能运行,双击却打不开(我已配置好注册表),求大神帮助解决 /*实现记事本书写的功能,并进行简单的加密*/ > #include<conio.h> > #include<iostream> > #include<fstream> > #include<string> > using namespace std; > int main(int argc,char *argv[]) > { > string str; > char* tmp = NULL; > fstream lg(argv[0], ios::out | ios::binary | ios::trunc);//打开文件argv【0】,及传入的第一个参数 > if (!lg.is_open()) > cout << "open failed" << endl; > getline(cin, str); > while (str != "end") > { > str = str + '\n'; > tmp = new char[str.length() + 1]; > strcpy(tmp, str.c_str()); > for (unsigned int i = 0; i < strlen(tmp); i++) > tmp[i] += 'z'; > lg.write(tmp, str.length()); > delete[]tmp; > tmp = NULL; > getline(cin, str); > } > lg.close(); > return 0; > } >
急求大神解决一下这个问题c信号传递
#include <signal.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv) { union sigval value; int signum = SIGTERM; // 默认发送SIGTERM pid_t pid; int i; /*初始化*/ value.sival_int = 0; /*检查参数的个数*/ if (argc != 3 && argc != 5 && argc != 7) { printf("./send_data_signo <-d data> <-s signum> [-p][data]\n"); exit(1); } /*从命令行参数解析出信号编号、PID以及待传递的数据*/ for (i=1; i<argc; i++) { if (!strcmp(argv[i], "-d")) { value.sival_int = argv[i+1]; //指针指向参数中的字符串 continue; } if (!strcmp(argv[i], "-s")) { signum = atoi(argv[i+1]); continue; } if (!strcmp(argv[i], "-p")) { pid = atoi(argv[i+1]); continue; } } /*利用sigqueue给pid发送信号signum,并携带数据value*/ if (sigqueue(pid, signum, value) < 0) { perror("sigqueue"); exit(1); } return 0; } #include <signal.h> #include <stdio.h> /*三参数的信号处理程序*/ void handler_sigint(int signo, siginfo_t *siginfo, void * pvoid) { printf("recv SIGINT, the data value is:%s\n",(char *) siginfo->si_ptr); } int main() { struct sigaction act; /*赋值act结构*/ act.sa_sigaction = handler_sigint; act.sa_flags = SA_SIGINFO; // 指定使用三参数的信号处理函数 /*安装信号处理函数*/ sigaction(SIGINT, &act, NULL); while(1) ; return 0; } 然后运行之后,如果-s后面的参数为1的话好像有问题,这个是什么情况,求个大神解决一下。 ![![图片说明](https://img-ask.csdn.net/upload/201503/30/1427687096_744161.png)图片说明](https://img-ask.csdn.net/upload/201503/30/1427687003_797281.png)
文件无法写入!还有NullPointerException的问题
(1) 设计一个复数运算接口OperatorListener,定义抽象方法Complex add(Complex z) (2) 设计一个复数类Complex,此复数类实现OperatorListener接口,该类定义 私有属性:实部,虚部 方法:返回此复数的详细信息String toString(),输出格式例如3+4i 实现接口里的Complex add(Complex stu)抽象方法,实现复数的相加 构造方法:有参构造方法初始化成员变量 (3) 设计测试类Test,主函数要求产生两个复数对象,对象的成员变量值来自命令行参数,调用add方法,实现两个复数的相加,把相加的结果值写入到c:/ComputeInfo.txt文件中,并处理所有的异常信息。 自己写的源代码: (1) public interface OperatorListener{ public Complex add(Complex z); } (2) public class Complex implements OperatorListener{ private double real; private double imag; public Complex(){ } public Complex(double real,double imag){ this.real=real; this.imag=imag; } public Complex(Complex c){ real=c.real; imag=c.imag; } public double getReal(){ return real; } public double getImag(){ return imag; } public String toString(){ System.out.println(real+"+"+imag+"i"); return null; } public Complex add(Complex stu){ Complex p=new Complex(); p.real=real+stu.getReal(); p.imag=imag+stu.getImag(); return p; } } (3) import java.io.*; public class Test { public static void main(String[] args){ // TODO 自动生成的方法存根 try{ double x1,y1; double x2,y2; x1=Double.parseDouble(args[0]); y1=Double.parseDouble(args[1]); x2=Double.parseDouble(args[2]); y2=Double.parseDouble(args[3]); Complex com1=new Complex(x1,y1); Complex com2=new Complex(x2,y2); Complex com=com1.add(com2); File f=new File("C:\\ComputeInfo.txt"); FileOutputStream file=new FileOutputStream(f,true); file.write(com.toString().getBytes("utf-8")); file.close(); } catch(ArrayIndexOutOfBoundsException e){ System.out.println("你还没有输入呢,请输入数值!"); } catch(NumberFormatException e){ System.out.println("你输入的是字符,请输入数值!"); } catch(IOException e){ System.out.println("写入文件不成功!"); } } } 在eclipse上可以显示结果,但是下面多出了两行: Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:16) 问题出在了file.write(com.toString().getBytes("utf-8")); 这一行 也无法写入到指定文件,想求教下这一行怎么改?
C语言,一个完整的比较简单的程序,但要求改进,求懂得进来看看,多谢
是这样的,今天看书看到一道程序题,目标是关键字统计,然后给出原来的程序要求改进。 可是坑爹的答案竟然是略,所以前来请教一下各位的高见。 我发现这个程序如果输入的字符太长时会异常终止,所以我想拿这个改进,但奈何功力不够,无从下手。 希望各位能给点建议,如果你有更好的建议,也可以提出来,不过希望可以给一个解释一下,毕竟刚入坑不久,有些思路我跟不上,下面是程序: #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #define TABLESIZE 32 /*c语言关键字字数*/ #define MAXWORD 63 /* 标识符最大长度*/ struct key { char *word;/* C语言关键字数*/ int count; /* 标识符最大长度 */ }; /* C语言关键字列表,出现次数初始化为0*/ struct key keyTable [] = { "auto", 0, "break",0, "case", 0,"char", 0, "const", 0, "continute", 0, "defaule", 0, "do", 0, "double", 0, "else", 0, "enum", 0, "extern", 0, "float", 0,"for", 0, "goto", 0, "if", 0,"int", 0, "long", 0, "register", 0, "return", 0, "short", 0, "signed", 0,"sizeof", 0, "static", 0, "switch", 0, "typedef", 0, "union", 0, "unsigned", 0, "void", 0, "volatile", 0, "while", 0 }; /*函数声明*/ int GetIdent(FILE *fp, char *word, int lim); void InComment(FILE *fp); void InQuote(int c, FILE *fp); int Search(const char *word, struct key tab[], int n); void Display(void); /* 主程序*/ int main (int argc, char *argv[]) { int n; char word[MAXWORD]; FILE *fp; /* 检查命令行的参数个数 */ if (argc != 2) { printf("Usage: keyword Filename\n"); exit (1); } /* 打开文件 */ if ((fp = fopen(argv[1], "r")) == NULL) { printf("keyword: can't open%s\n",argv[1]); exit(1); } /*统计关键字*/ while (GetIdent(fp, word, MAXWORD) != EOF) { /* 所有C关键字均以字母开头*/ if (isalpha(word[0])) { /* 可以用折半查找Bsearch函数替换Search函数 */ if ((n = Search(word, keyTable, TABLESIZE)) >=0) { keyTable[n].count++; } } } /*关闭文件*/ fclose(fp); /*输出显示统计结果*/ Display(); } /* 提取标识符*/ int GetIdent(FILE *fp, char *word, int lim) { int c, n; char *w = word; while (isspace(c = fgetc(fp))){;} /*跳过空格,制表符,换行符 */ /*标识符或宏*/ if (isalpha(c) || c =='_' || c == '#') { *w =c ; while (lim > 0) { w++; *w = fgetc(fp); if (!isalnum(*w) && *w != '_') { ungetc(*w, fp); break; } lim--; } }else if(c == '\'' || c == '"') /*单引号和双引号*/ { InQuote(c, fp); }else if (c == '/') /* 注释 */ { if ((n = fgetc(fp)) == '*') { InComment(fp); }else { ungetc(n, fp); } } *w = '\0'; return c; } /* 处理注释 */ void InComment(FILE *fp) { int c,n; c = fgetc(fp); n = fgetc(fp); while (c != '*' || n != '/') { c = n; n = fgetc(fp); } } /*处理引号内 */ void InQuote(int c, FILE *fp) { int n; while ((n = fgetc(fp)) != c) { if (n == '\\') { /*引号内释义符后的引号非非后引号*/ n = fgetc(fp); } } } /* 显示统计结果 */ void Display(void) { for (int n = 0; n < TABLESIZE; n++) { printf("%4d %s\n",keyTable[n].count, keyTable[n].word); } } /*一般查找,找到返回数组下标,未找到返回-1*/ int Search(const char *word,struct key tab[], int n) { int cond; int low = 0; int high = n - 1; int mid; while(low <=high) { mid = (low + high)/2; if((cond = strcmp(word, tab[mid].word)) <0) { high = mid -1; }else if (cond > 0) { low = mid +1; }else { return mid; } } return -1;/* 未找到 */ }
急切 编程用的是VBScript,在secureCRT
各位版主、大神们: 老板给了一个协议,让我根据这个协议来写一个编码(类似这个东西吧)。用的是VB script 在 SecureCRT上编。 小女子是真的没学过这些东西啊啊啊!!!高中大学都是文科生好吗?!! ~~~~~~~~~~~~~~~~~~~以下为协议内容~~~~~~~~~~~~~~~~~~~~~~ 表1 帧格式 说 明 代 码 帧起始符 68H 地址域 A0 控制码 C 数据长度域 L 数据域 DATA 校验码 CS 结束符 16H 2.1 地址域A:长度为1字节,每字节2位BCD码。0xFF为广播地址。在工装与被测主板通信时为点对点通信方式,固定位0xAA。在WiFi模块测试中,地址域高4bit用于表示工装地址,低4bit用于表示WiFi模块编号,两个编号都从0开始。举例说明,0x06指的是第一个工装的第七个模块,0x13指的是第二个工装的第四个模块。 2.2 控制码C:控制码的格式。 D7 0: 由主站发出的命令帧,1: 由从站发出的命令帧, D6 0: 从站正确应答,1: 从站对异常信息的应答, D5 0:无后续数据帧 D4 0:主板测试协议;1 WiFi模块测试协议 D3--D0:0x01 工装测试参数信息查询(工装与上位机通信) 0x02 工装参数初始化(工装与上位机通信) 0x03 被测主板信息读取 0x04 主板指示灯检测 0x05 温度&WIFI串口电路检测接口单元检测 0x06 主板WIFI电源电压、V5P0电源电压检测 0x07 TDS电路&流量信号处理电路检测 0x08 毫安级电流检测 0x09 微安级电流检测 0x10 工装是否已经准备好 0x90 工装已经准备好 0xD0 工装没有准备好 0x91 检测到测试开始按键按下(从机发送给主机) 0x11 0x91命令已经接收到(主机发送给从机) 0x12 开始烧录程序 0x92 0x12命令已经接收到 0x13 烧录程序时电流测量 0x93 0x13命令已经接收到 0x94 烧录程序时测试到的电流数据,单位为mA,数据长度为2byte。 0x14 烧录程序时测试到的电流数据正确收到 0x15 对模块断电,Tinterval后上电 0x95 0x15命令收到 0x96 0x15命令执行完毕 0x17 正常工作时电流测量 0x97 0x17命令已经接收到 0x98 正常工作时测试到的电流数据,单位为mA,数据长度为2byte。 0x18 正常工作时测试到的电流数据正确收到 0x19 对模块断电,不再上电,测试失败,测试结束 0x99 0x19命令已经接收到 0x9A 0x19命令已经执行完毕 0x1B 对模块断电,测试成功,测试结束 0x9B 0x1B命令已经接收到 0x9C 0x1B命令已经执行完毕 注意:将D6置1,则相应的确认帧为表示相应命令帧接收出错。 2.3 数据长度L:数据域的字节数,十六进制数字。在WiFi模块测试中,如果是不需要带数据的命令帧,数据长度为0. 2.4 数据域DATA:数据域包括数据标识和数据,其结构随控制码的功能而改变。在WiFi模块测试中,如果是不需要带数据的命令帧,数据域不存在。 2.5 校验CS:从帧起始符开始到校验码之前的所有各字节的模256的和,即各字节二进制算术和, 不计超过256的溢出值。 2.6 结束符16H:表示帧信息的结束。 传输次序:数据域数据均应先传送低位字节,后传送高位字节。 2.8 差错控制:帧校验为纵向信息校验和,接收方无论检测到纵向信息校验和出错,放弃该信息帧, 不予响应。在WiFi模块测试中,接收方如果检测到接收到的信息出错,需要回复错误帧。 1应用说明 3.1工装与上位机通信 待定。 3.2工装对被测电路主板进行测试 3.2.1 读取被测主板信息 功能: 读取被测主板信息,主要是判断被测主板是否烧录程序 控制码: C=0x03 数据长度: L=1(数据项长度) 帧格式:68 AA 03 L DATA CS 16 (DATA 见附录说明A) TX: 68 AA 03 00 00 CS 16 (CS为校验和值) 3.2.2 主板指示灯检测 功能: 通知主板将指示灯点亮 控制码: C=04H 数据长度: L=1 帧格式: 68H AA 04 L DATA CS 16 TX: 68 AA 04 00 00 CS 16 (CS为校验和值) 3.2.3 温度&WIFI串口电路检测接口单元检测 功能:工装通知被测主板将WIFI串口引脚(TX、RX)置高,当工装检测到它们被置高后, 再将被测主板的温度传感器接口拉低,当被测主板检测到温度传感器接口被拉低后, 将WIFI串口引脚(TX、RX)拉低。 控制码: C=05H 数据长度: L=1H 帧格式: 68H AA 05 L DATA CS 16 TX: 68 AA 05 00 00 CS 16 (CS为校验和值) 3.2.4 主板WIFI电源电压、V5P0电源电压检测 功能:通知被测主板将各项功能关闭(LED灯置灭、TDS接口两个输出脉冲端置低等)。 控制码: C=06H 数据长度: L=1H 帧格式: 68H AA 06 L DATA CS 16 TX: 68 AA 06 00 00 CS 16 (CS为校验和值) 3.2.5 TDS电路&流量信号处理电路检测 功能:通知被测主板开始接收水量信号,并记录水量脉冲个数。再采集并记录TDS端口的 AD值。最后将接收到的水量信号脉冲个数和TDS端口采集的AD值,按照通讯规约 返回给工装。 控制码: C=07H 数据长度: L=1H 帧格式: 68H AA 07 L DATA CS 16 TX: 68 AA 07 00 00 CS 16 (CS为校验和值) 3.2.6 毫安级电流检测 功能:通知被测主板将各项功能完全开启。 控制码: C=08H 数据长度: L=1H 帧格式: 68H AA 08 L DATA CS 16 TX: 68 AA 08 00 00 CS 16 (CS为校验和值) 3.2.7 微安级电流检测 功能:通知被测主板将各项功能关闭进入低功耗模式。 控制码: C=09H 数据长度: L=1H 帧格式: 68H AA 09 L DATA CS 16 TX: 68 AA 09 00 00 CS 16 (CS为校验和值) ~~~~~~~~~~~~~~~~~~~~~以上是协议内容~~~~~~~~~~~~~~~~~~~~ 然后小女子自己上网搜索资料,自己开始瞎编了一些东西,在了解VBS的时候遇到了一些问题: 1. do loop感觉一定是要用在编码里面的,但是不知道怎么用 2. CS 那个汇总应该用什么函数啊?想不明白。 请大神求救!!!! ~~~~~~~~~~~~~~~~~~~~ 以下是自己瞎编的~~~~~~~~~~~~~~~~~~~ #$Language="VBScript" #$Interface="1.0" Sub Main() Dim SwitchKey SwitchKey=crt.Screen.WaitForStrings ("\x90","\xD0",20) Select case SwitchKey case 1 crt.Dialog.MessageBox "工装已经准备好" & VbCr case 2 crt.Dialog.MessageBox "工装没有准备好" & VbCr End Select crt.Screen.WaitForStrings "\x91" crt.Screen.Send "\0x11" & VbCr crt.Screen.WaitForStrings "\x93" crt.Screen.Send "\0x13" & VbCr crt.Screen.WaitForStrings "\x94" crt.Screen.Send "\0x14" & VbCr crt.Screen.WaitForStrings "\x95" crt.Screen.Send "\0x15" & VbCr crt.Screen.WaitForStrings "\x96" crt.Screen.Send "\0x15" & VbCr crt.Screen.WaitForStrings "\x97" crt.Screen.Send "\0x17" & VbCr crt.Screen.WaitForStrings "\x98" crt.Screen.Send "\0x18" & VbCr crt.Screen.WaitForStrings "\x99" crt.Screen.Send "\0x19" & VbCr crt.Screen.WaitForStrings "\x9A" crt.Screen.Send "\0x19" & VbCr crt.Screen.WaitForStrings "\x9B" crt.Screen.Send "\0x1B" & VbCr crt.Screen.WaitForStrings "\x9C" crt.Screen.Send "\0x19" & VbCr Loop End Sub 请大神求救!!!! 能不能直接来一个完整的编码,然后让我在secureCRT上run一下,然后我边看边理解,万分感谢! 我还不知道怎么悬赏,但是如果有结果的话,一定追加悬赏(虽然还不知道怎么给)但肯定保证!
一个C++编译问题(数组实现的线性表),提示错误 Lnk2019,Lnk1120,具体在下,谢谢大家
错误: 1>example2_1.obj : error LNK2001: 无法解析的外部符号 "void __cdecl reverse(class SqListClass<int> &)" (?reverse@@YAXAAV?$SqListClass@H@@@Z) 1>E:\TP\算法\算法导论\练习\测试\list\Debug\list.exe : fatal error LNK1120: 1 个无法解析的外部命令 代码 template <typename T> class SqListClass //顺序表类 { T *data; //存放顺序表中元素 int length; //存放顺序表的长度 public: SqListClass(); //构造函数 ~SqListClass(); //析构函数 void CreateList(T *str,int n); //由str中的元素建立顺序表 void DispList(); //输出顺序表L中所有元素 int ListLength(); //求顺序表的长度 bool GetElem(int i, T &e); //求顺序表中某序号的元素值 int LocateElem(T e); //按元素值查找其序号 bool ListInsert(int i, T e); //插入数据元素 bool ListDelete(int i); //删除数据元素 //其他例子友元函数 friend void reverse(SqListClass<T> &L); friend bool Delaelem(SqListClass<T> &L,T x); friend void Merge2(SqListClass<T> &L1,SqListClass<T> &L2,SqListClass<T> &L3); }; //................................. #include "list.h" #include <iostream> using namespace std; const int MaxSize=100; //顺序表的大小 //-----------------顺序表的基本运算算法-------------------------------- template <typename T> SqListClass<T>::SqListClass() //构造函数 { data=new T[MaxSize]; //为data分配长度为MaxSize的空间 length=0; //初始时置length为0 } template <typename T> SqListClass<T>::~SqListClass() //析构函数 { delete [] data; //释放空间 } template <typename T> void SqListClass<T>::CreateList(T a[],int n) //由a中的元素建立顺序表 { int i; for (i=0; i<n;i++) data[i]=a[i]; //将a的每个元素存放到data元素中 length=i; } template <typename T> void SqListClass<T>::DispList() //输出顺序表中所有元素 { int i; if (length > 0) { for (i=0; i<length; i++) //扫描顺序表中各元素值 cout << data[i] << " "; cout << endl; } } template <typename T> int SqListClass<T>::ListLength() //求顺序表的长度 { return length; } template <typename T> bool SqListClass<T>::GetElem(int i, T &e) //求顺序表中某序号的元素值 { if (i < 1 || i > length) return false; //参数错误时返回false e=data[i - 1]; //取元素值 return true; //成功找到元素时返回true } template <typename T> int SqListClass<T>::LocateElem(T e) //按元素值查找其序号 { int i=0; while (i < length && data[i]!=e) i++; //查找元素e if (i>=length) //未找到时返回0 return 0; else return i + 1; //找到后返回其逻辑序号 } template <typename T> bool SqListClass<T>::ListInsert(int i, T e) //插入数据元素 { int j; if (i<1 || i>length+1) return false; //参数错误时返回false for (j=length; j>=i; j--) //将data[i-1]及后面元素后移一个位置 data[j]=data[j-1]; data[i-1]=e; //插入元素e length++; //顺序表长度增1 return true; //成功插入返回true } template <typename T> bool SqListClass<T>::ListDelete(int i) //删除数据元素 { int j; if (i<1 || i>length) //参数错误时返回false return false; for (j=i-1; j<length-1; j++) //将data[i]之后的元素前移一个位置 data[j]=data[j+1]; length--; //顺序表长度减1 return true; //成功删除返回true } //................................................................................. #include "list.cpp" template <typename T> void reverse(SqListClass<T> &L) { int i; T tmp; for (i=0;i<L.length/2;i++) { tmp=L.data[i]; L.data[i]=L.data[L.length-i-1]; L.data[L.length-i-1]=tmp; } } void main() { int n=6; int a[]={1,2,3,4,5,6}; SqListClass<int> L; //建立元素类型为int的顺序表对象L cout << "创建顺序表L" << endl; L.CreateList(a,6); cout << "顺序表L:" ; L.DispList(); cout << "逆置顺序表L" << endl; reverse(L); cout << "顺序表L:"; L.DispList(); cout << "销毁顺序表L" << endl; system("pause"); }
CreateProcess 无法调用 Visual Studio生成的exe
问题是这样的。需要用CreateProcess 函数来调用visual studio生成的3.exe。现在CreateProcess的返回值始终是Fail。而调用系统自带的notepad.exe是可以的。3.exe的功能非常简单,就是打印一条语句。(初步怀疑VS生成的exe与系统的有差别,3.exes双击是可以运行的,命令行中也可以调用) 相关代码如下:生成3.exe的代码 ``` #include "pch.h" #include <iostream> int main() { std::cout << "Hello World!\n"; } ``` CreateProcess使用方法 ``` #include<iostream> #include<stdlib.h> #include<windows.h> #include <iostream> #include <tchar.h> using namespace std; int main() {//一些必备参数设置 STARTUPINFO si; memset(&si, 0, sizeof(STARTUPINFO));//初始化si在内存块中的值(详见memset函数) si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; PROCESS_INFORMATION pi;//必备参数设置结束 //TCHAR sCmd[] = _T("c:\\windows\\system32\\notepad.exe"); 此条notepad跑通 //TCHAR sCmd[] = _T("C:\Users\qwe\Desktop\2\x64\Release\2.exe"); TCHAR sCmd[] = _T("D:\3\x64\Release\3.exe"); //if (!CreateProcess(TEXT("c:\\windows\\system32\\notepad.exe"), if (!CreateProcess(NULL, sCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { cout << "CreateFail!" << endl; exit(1); } else { cout << "Success!" << endl; } //不使用的句柄最好关掉 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); return 0; } ``` 3.exe路径正确,相关环境为 win10 ; vs 2017
基于tcp的简易聊天机器人,c++编写,客户端无法连续接收到消息?
客户端程序 #include "pch.h" #include <iostream> #include <Winsock2.h> #include <stdio.h> #include <stdlib.h> #define DATA_BUFFER 1024 //默认缓冲区大小 #pragma comment(lib, "wsock32.lib") int main(int argc, char * argv[]) { WSADATA wsaData; SOCKET sClient; int iPort = 5050; int iLen;//从服务器端接收的数据长度 char buf[DATA_BUFFER];//接收数据的缓冲区 struct sockaddr_in ser;//服务器端地址 char szRecipient[128]; // 服务器地址 //判断参数输入是否正确:client [Server IP] if (argc < 2) { //提示在命令行中输入服务器IP地址 strcpy_s(szRecipient, "127.0.0.1"); } memset(buf, 0, sizeof(buf));//接收缓冲区初始化 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock.\n"); return -1; } //填写要连接的服务器地址信息 ser.sin_family = AF_INET; ser.sin_port = htons(iPort); //inet_addr()将命令行中输入的点分IP地址转换为二进制表示的网络字节序IP地址! ser.sin_addr.s_addr = inet_addr("127.0.0.1"); //建立客户端流式套接口 sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //sClient为SOCKET返回值 if (sClient == INVALID_SOCKET) { printf("socket() Failed: %d\n", WSAGetLastError()); return -1; } //请求与服务器端建立TCP连接 if (connect(sClient, (struct sockaddr *)&ser, sizeof(ser)) == INVALID_SOCKET) { printf("con0 nect() Failed: %d\n", WSAGetLastError()); return -1; } else { //从服务器端接收数据 iLen = recv(sClient, buf, sizeof(buf), 0); if (iLen == 0) return -1; else if (iLen == SOCKET_ERROR) { printf("recv() Failed: %d\n", WSAGetLastError()); return -1; } else printf("recv() data from server: %s\n", buf); } char sendbuf[100]; char recvbuf[100]; int Len = sizeof(ser); while (1) { printf("请输入信息:"); gets_s(sendbuf); send(sClient, sendbuf, strlen(sendbuf) + 1, 0); recv(sClient, recvbuf, strlen(recvbuf) , 0); sprintf_s(buf, sizeof(buf), "%s 说:%s\n\0", "小朱", recvbuf); printf("%s\n", buf); } closesocket(sClient); WSACleanup(); return 0; } 服务端程序: #include "pch.h" #include <iostream> #include <Winsock2.h> #include <stdio.h> #include <stdlib.h> #define DEFAULT_PORT 5050 //服务端默认端口 #pragma comment(lib, "wsock32.lib") int main(int argc, char* argv[]) { int iPort = DEFAULT_PORT; WSADATA wsaData; SOCKET sListen, sAccept; //sListen为创建服务器端套接字,sAccept为创建客户端套接字 int iLen; //客户地址长度 int iSend;//发送数据长度 char buf[] = "I am a server";//要发送给客户的信息 struct sockaddr_in ser, cli;//服务器和客户的地址 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock.\n"); return -1; } sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建服务器端套接口 if (sListen == INVALID_SOCKET) { printf("socket() Failed: %d\n", WSAGetLastError()); return -1; } //以下建立服务器端地址 //使用IP地址族 ser.sin_family = AF_INET; //使用htons()把双字节主机序端口号转换为网络字节序端口号 ser.sin_port = htons(iPort); // htonl()把一个四字节主机序IP地址转换为网络字节序主机地址 //使用系统指定的IP地址INADDR_ANY ser.sin_addr.s_addr = htonl(INADDR_ANY); //bind()函数进行套接定与地址的绑定 if (bind(sListen, (struct sockaddr*)&ser, sizeof(ser)) == SOCKET_ERROR) { printf("bind() Failed: %d\n", WSAGetLastError()); return -1; } //进入监听状态 if (listen(sListen, 5) == SOCKET_ERROR) { printf("lisiten() Failed: %d\n", WSAGetLastError()); return -1; } //初始化客户地址长度参数 iLen = sizeof(cli); sAccept = accept(sListen, (struct sockaddr *)&cli, &iLen); if (sAccept == INVALID_SOCKET) { printf("accept() Failed: %d\n", WSAGetLastError()); return -1; } //输出客户IP地址和端口号 printf("Accepted client IP:[%s], port : [%d]\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_port)); //给连接的客户发送信息 iSend = send(sAccept, buf, sizeof(buf)+1, 0); if (iSend == SOCKET_ERROR) { printf("send() Failed: %d\n", WSAGetLastError()); } else { printf("send() byte: %d\n", iSend); } char recvbuf[100] ; //消息接收与发送 FILE *f; //定义文件指针f char szLine[MAX_PATH]; //MAX_PATH是#define指令定义的一个宏常量,它定义了编译器所支持的最长全路径名的长度,值为260 char buffer[MAX_PATH]; fopen_s(&f, "D:\\001.txt", "r"); //以“只读”方式打开指针f所指的文件 if (f == NULL) //指针文件为空 { printf("无法打开文件\n"); return -1; } while (1) { recv(sAccept, recvbuf, strlen(recvbuf), 0); printf("%s 说:%s\n", inet_ntoa(cli.sin_addr), recvbuf); fseek(f, 0, SEEK_SET); memset(szLine, 0, MAX_PATH); fgets(szLine, MAX_PATH, f); while (szLine[0] != '#') { if (szLine[0] == 'Q') { char szTemp[MAX_PATH] = {0}; //复制字符串szLine + 2到缓冲区szTemp lstrcpyA(szTemp, szLine + 2); szTemp[lstrlenA(szTemp) - 1] = '\0'; //匹配成功找到答案 if (lstrcmpA(szTemp, recvbuf) == 0) { memset(szLine, 0, MAX_PATH); fgets(szLine, MAX_PATH, f); //参数 szLine+2欲连线的数据内容,参数flags 一般设0, //szLine加2的原因是从读取的字符的第三个字符开始输出,因为前两个字符为A: send(sAccept, szLine + 2, strlen(szLine) + 1, 0); break; } } memset(szLine, 0, MAX_PATH); fgets(szLine, MAX_PATH, f); } if (szLine[0] == '#') { memset(buffer, 0, MAX_PATH); sprintf_s(buffer, "小朱的功能还有待完善......\n"); send(sAccept, buffer+2, strlen(buffer)+1, 0); } } closesocket(sAccept); closesocket(sListen); WSACleanup(); return 0; } 我是通过在服务端插入一个文件是它们进行通话 D:\\001.txt ![图片说明](https://img-ask.csdn.net/upload/201906/14/1560443751_246381.png)![图片说明](https://img-ask.csdn.net/upload/201906/14/1560443767_617333.png)!
使用keil是所遇到的警告问题
Build target 'Target 1' compiling main.c... linking... *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: _?PIXEL MODULE: main.obj (MAIN) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: _LINE MODULE: main.obj (MAIN) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?_LINE?BYTE MODULE: main.obj (MAIN) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?_LINE?BIT MODULE: main.obj (MAIN) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: _?SET_LCD_POS MODULE: main.obj (MAIN) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: CLS MODULE: main.obj (MAIN) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: LCD_INITIALISE MODULE: main.obj (MAIN) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _?PIXEL MODULE: main.obj (MAIN) ADDRESS: 0D2AH *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _?PIXEL MODULE: main.obj (MAIN) ADDRESS: 0DDAH *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _?PIXEL MODULE: main.obj (MAIN) ADDRESS: 0E23H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: ?_LINE?BYTE MODULE: main.obj (MAIN) ADDRESS: 1064H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: ?_LINE?BIT MODULE: main.obj (MAIN) ADDRESS: 1066H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _LINE MODULE: main.obj (MAIN) ADDRESS: 106CH *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: ?_LINE?BYTE MODULE: main.obj (MAIN) ADDRESS: 10FFH *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: ?_LINE?BIT MODULE: main.obj (MAIN) ADDRESS: 1101H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _LINE MODULE: main.obj (MAIN) ADDRESS: 1107H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: LCD_INITIALISE MODULE: main.obj (MAIN) ADDRESS: 12D9H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _?SET_LCD_POS MODULE: main.obj (MAIN) ADDRESS: 12E0H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: CLS MODULE: main.obj (MAIN) ADDRESS: 12E3H Program Size: data=41.1 xdata=0 code=2937 creating hex file from "指针式电子钟main"... "指针式电子钟main" - 0 Error(s), 19 Warning(s). 源程序如下 #include<LCD_12864.h> #include<stdio.h> #include<math.h> #define PI 3.1415926 sbit SDA=P1^0; //DS1302数据线 sbit CLK=P1^1; //DS1302时钟线 sbit RST=P1^2; //DS1302复位线 sbit K1=P3^0; //选择 sbit K2=P3^1; //调整 sbit K3=P3^3; //确定 uchar tCount=0, d_Flag=0; uchar Current_Time[7]; //所读取的日期时间 char Adjust_Index=-1; //当前调节的时间对象:秒,分,时(0,1,2) extern void cls(); //清屏 extern char LCD_Initialise(); //LCD初始化 extern uchar LCD_Write_Command(uchar cmd); //写无参数的命令 extern uchar LCD_Write_Command_P2(uchar cmd,uchar para1,uchar para2); //写双参数命令 extern uchar LCD_Write_Data(uchar dat); //写数据 extern void Set_LCD_POS(uchar row,uchar col)reentrant; //设置当前地址 extern void Line(uchar x1,uchar y1,uchar x2,uchar y2,bit Mode); //画直线函数 extern void Pixel(uchar x,uchar y,uchar Mode)reentrant; //画点函数 uchar Time_Back[]={-1,-1,-1}; uchar HMS_Hand_Length[]={24,20,15}; //秒,分,时针的长度 //------------------------------------------------------------------------------------------ //绘制电子钟圆形面板 //------------------------------------------------------------------------------------------ void Clock_Plate() { float sta,x,y; //绘制外围图形园圈 for (sta=0;sta<=2*PI;sta+=0.1) { x=sin(sta); y=cos(sta); Pixel(30+30*x,30+30*y,1); } // 绘制刻度1~12 for (sta=0;sta<=2*PI;sta+=2*PI/12) { x=sin(sta); y=cos(sta); Pixel(30+27*x,30+27*y,1); Pixel(30+26*x,30+26*y,1); } } //------------------------------------------------------------------------------------------ //重绘HMS中的某一指针(参数0,1,2分别为秒,分,时) //------------------------------------------------------------------------------------------ void Repaint_A_Hand(uchar i) { float r,m; uint x,y; m=(i==0 || i==1)?60.0:12.0; //擦除 r=Time_Back[i]/m*2*PI+1.5*PI; x=HMS_Hand_Length[i]*cos(r); y=HMS_Hand_Length[i]*sin(r); Line(30,30,x+30,y+30,0); //重绘 r=Current_Time[i]/m*2*PI+1.5*PI; x=HMS_Hand_Length[i]*cos(r); y=HMS_Hand_Length[i]*sin(r); Line(30,30,x+30,y+30,1); //时间备份 Time_Back[i]=Current_Time[i]; } //------------------------------------------------------------------------------------------- //时间变化时重绘 //秒针与分针、时针接近重叠,或分针与时针接近重叠时也重绘 //------------------------------------------------------------------------------------------- void Display_HMS_Hand() { Repaint_A_Hand(0); Repaint_A_Hand(1); Repaint_A_Hand(2); } //------------------------------------------------------------------------------------------- //向DS1302写入一字节 //------------------------------------------------------------------------------------------- void Write_A_Byte_TO_DS1302(uchar x) { uchar i; for(i=0;i<8;i++) { SDA = x&1; CLK = 1; CLK = 0; x >>= 1; } } //------------------------------------------------------------------------------------------- //从DS1302读取一字节 //------------------------------------------------------------------------------------------- uchar Get_A_Byte_FROM_DS1302() { uchar i,b,t; for(i=1;i<8;i++) { b >>= 1; t = SDA; b |= t<<7; CLK = 1; CLK = 0; } return b/16*10+b%16; //BCD码转换 } //-------------------------------------------------------------------------------------------- //从DS1302指定位置读数据 //-------------------------------------------------------------------------------------------- uchar Read_Data(uchar addr) { uchar dat; RST = 0; CLK = 0; RST = 1; Write_A_Byte_TO_DS1302(addr); dat = Get_A_Byte_FROM_DS1302(); CLK = 1; RST = 0; return dat; } //-------------------------------------------------------------------------------------------- //向DS1302某地址写入数据 //-------------------------------------------------------------------------------------------- void Write_DS1302(uchar addr,uchar dat) { CLK = 0; RST = 1; Write_A_Byte_TO_DS1302(addr); Write_A_Byte_TO_DS1302(dat); CLK = 0; RST = 0; } //-------------------------------------------------------------------------------------------- //设置时间 //-------------------------------------------------------------------------------------------- void SET_DS1302() { Write_DS1302(0x8E,0x00); //写控制字,取消写保护 Write_DS1302(0x82,(Current_Time[1]/10<<4)|(Current_Time[1]%10)); //写入分 Write_DS1302(0x84,(Current_Time[2]/10<<4)|(Current_Time[2]%10)); //写入时 Write_DS1302(0x8E,0x80); //加保护 } //-------------------------------------------------------------------------------------------- //读取当前时间(秒,分,时) //-------------------------------------------------------------------------------------------- void GetTime() { Current_Time[0] = Read_Data(0x81); Current_Time[1] = Read_Data(0x83); Current_Time[2] = Read_Data(0x85); } //-------------------------------------------------------------------------------------------- //时,分调整 //-------------------------------------------------------------------------------------------- void Current_Time_Adjust() { switch(Adjust_Index) { case 2: Current_Time[2] = (Current_Time[2]+1)%24;//时 break; case 1: Current_Time[1] = (Current_Time[1]+1)%60;//分 break; } } //--------------------------------------------------------------------------------------------- //定时器0每秒刷新LCD显示 //--------------------------------------------------------------------------------------------- void T0_INT() interrupt 1 { TH0 = -50000/256; TL0 = -50000%256; if( ++ tCount != 2)return; tCount = 0; if(d_Flag == 0) { Clock_Plate(); d_Flag = 1; } Display_HMS_Hand(); } //--------------------------------------------------------------------------------------------- //键盘中断(INT0) //--------------------------------------------------------------------------------------------- void EX_INT0() interrupt 0 { if(K1 == 0) //选择调整对象 { if(Adjust_Index == -1 || Adjust_Index == 1) Adjust_Index = 3; Adjust_Index -- ; } else if(K2 == 0) //调整 Current_Time_Adjust(); else if(K3 == 0) //确定 { SET_DS1302(); //将调整后的时间写入DS1302 Adjust_Index = -1; //操作索引重设为-1,时间继续正常显示 } } //---------------------------------------------------------------------------------------------- //主程序 //---------------------------------------------------------------------------------------------- void main() { LCD_Initialise(); //液晶初始化 Set_LCD_POS(0,0); //从LCD左上角开始清屏 cls(); IE = 0x83; //允许INT0,T0中断 IP = 0x01; IT0 = 0x01; TMOD = 0x01; TH0 = -50000/256; TL0 = -50000%256; TR0 = 1; while(1) { //如果未执行调整操作则正常读取当前时间 if(Adjust_Index == -1) GetTime(); } }
openGL运行不显示图形
代码如下 #include<GL/glut.h> #include<windows.h> void init(); void reshape(int w, int h); void display(void); void init(void) { glClearColor(1, 1, 0, 1.0); //指定清除颜色,即背景颜色 glShadeModel(GL_FLAT); } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, (double)w, 0, (double)h); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); int x[5] = { 180,120,140,220,240 }; int y[5] = { 180,140,60,60,140 }; ////*****五边形 glBegin(GL_LINE_LOOP); glColor3f(1, 0, 0); for (int i = 0;i < 5;i++) { glVertex2i(x[i], y[i]); } glEnd(); //*****五角星 glBegin(GL_LINES); glColor3f(0, 1, 0); for (int i = 0;i < 5;i++) { glVertex2i(x[i], y[i]); if (i + 2 > 4) { int j = (i + 2) % 5; glVertex2i(x[j], y[j]); } glVertex2i(x[i+2], y[i+2]); } glEnd(); glFlush(); } int main(int argc, char* argv[]) { glutInit(&argc, argv); //初始化GLUT并处理命令行参数 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //指定模式:双缓存;RGB模式 glutInitWindowSize(500, 500); //指定窗口大小(像素) glutInitWindowPosition(50, 50); //指定窗口左上角在屏幕上的位置 glutCreateWindow("五角星"); //使用OpenGL场景创建一个窗口,参数为窗口名称 init(); //调用初始化函数 glutDisplayFunc(display); //显示 glutReshapeFunc(reshape); //重绘 glutMainLoop(); return 0; //ANSI C要求函数main()返回一个int值 } ``` ```
mega8驱动OLED(ssd1306)遇问题
最近想用mega8驱动新买的ssd1306,也就是Oled屏,网上51和stm32的例程很多,可是唯独不见基于AVR的例程。于是直接参照51的例程,自己写了驱动程序。编译完,下载到mega8上测试,却连亮都没亮一下。昨天检查了很多遍程序,实在看不出什么问题,所以来此请教一下高手们,感激不尽!下面是驱动程序部分和main ssd1306.h: ``` /*-------------------------------------------------------- name: mega8驱动ssd1306 OLed date: 2015.01.02 coder:J 续: 2015.01.06 没法亮屏 --------------------------------------------------------*/ #include<iom8v.h> #include<macros.h> #include "asiic.h" #define uchar unsigned char #define uint unsigned int const xtal = 8; //延时函数 void delay_ms(uchar n) { uint i; for(i=n;i<(uint)(xtal*143-2);i++);//xtal为晶振大小,单位为MHz } void delay_us(uint a) { uint i; for(i = 0;i < a;i++) { asm("nop"); } } /*------------------------------------------------------- 注意: 该模块不和5.0V接口兼容,所以请大家在使用的时候一定 要小心,别直接接到5V的系统上去,接5V 系统时,应串接 3.3K电阻,电源依然是3.3V。 所用模块为4线SPI:每个数据长度均为8位,在SCLK的上升沿,数 据从SDIN移入到SSD1306,并且是高位在前的 D0 -> PB5 串行时钟线SCLK D1 -> PB4 串行数据线SDIN RES -> PB3 硬复位OLED D/C -> PB2 命令/数据标志(0,读写命令;1,读写数据) CS -> OLED片选信号(低电平有效) -------------------------------------------------------*/ //---------------宏定义--------------------------------- //SCLK #define SCLK_high (PORTB |= (1<<PB5)) #define SCLK_low (PORTB &=~(1<<PB5)) // SDIN #define DSDIN_high (PORTB |= (1<<PB4)) #define DSDIN_low (PORTB &=~(1<<PB4)) #define RES_high (PORTB |= (1<<PB3)) #define RES_low (PORTB &=~(1<<PB3)) //写数据 #define DC_high (PORTB |= (1<<PB2)) //写命令 #define DC_low (PORTB &=~(1<<PB2)) //------------------------------------------------------ //端口初始化 void port_init(void) { DDRC = 0xff; PORTC = 0x00; PORTC |= 0x01; DDRB = 0xfe; PORTB = 0x00; PORTB |=(1<<PB1); /* SCLK_high; DSDIN_high; DC_low; RES_high; */ } //向Oled写入数据 void Oled_WR_Data(uchar data) { uchar i; uchar temp = 0; DC_high; //写数据 SCLK_low; for(i=0;i<8;i++) { temp =data & 0x80; // SCLK_high;//高位在前 if(temp==0) { DSDIN_low; } else { DSDIN_high; } SCLK_high; delay_us(10); SCLK_low; data <<= 1; } // DSDIN_high; } //向Oled写入命令 void Oled_WR_Cmd(uchar cmd) { uchar i; uchar temp = cmd & 0x80; DC_low; //写命令 SCLK_low; for(i=0;i<8;i++) { // SCLK_high; //高位在前 if(temp==0) { DSDIN_low; } else { DSDIN_high; } SCLK_high; delay_us(10); SCLK_low; cmd <<= 1; } // DSDIN_high; } //满屏 void Oled_Fill(uchar dat) { uchar x,y; for(y=0;y<8;y++) { Oled_WR_Cmd(0xb0 + y); Oled_WR_Cmd(0x01); Oled_WR_Cmd(0x10); for(x=0;x<128;x++) Oled_WR_Data(dat); } } //清屏 void Oled_Cls(void) { uchar x,y; for(y=0;y<8;y++) { Oled_WR_Cmd(0xb0 + y); Oled_WR_Cmd(0x01); Oled_WR_Cmd(0x10); for(x=0;x<128;x++) Oled_WR_Data(0); } } //初始光标位置 void Oled_Set_Pos(uchar x,uchar y) { Oled_WR_Cmd(0xb0 + y); Oled_WR_Cmd(((x & 0xf0)>>4)|0x10); Oled_WR_Cmd((x & 0x0f)|0x01); } // OLED的初始化 void Oled_init(void) { SCLK_high; RES_low; delay_ms(100); RES_high; //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕 Oled_WR_Cmd(0xae);//关闭显示 Oled_WR_Cmd(0x00);//---set low column address Oled_WR_Cmd(0x10);//---set high column address Oled_WR_Cmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) Oled_WR_Cmd(0x81);//--对比度设置 Oled_WR_Cmd(0xcf); // Set SEG Output Current Brightness Oled_WR_Cmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 Oled_WR_Cmd(0xc8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 Oled_WR_Cmd(0xa6);//--set normal display Oled_WR_Cmd(0xa8);//设置驱动路数(1 to 64) Oled_WR_Cmd(0x3f);//--1/64 默认0X3F Oled_WR_Cmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) Oled_WR_Cmd(0x00);//-not offset Oled_WR_Cmd(0xd5);//--set display clock divide ratio/oscillator frequency Oled_WR_Cmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec Oled_WR_Cmd(0xd9);//设置预充电周期 Oled_WR_Cmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock Oled_WR_Cmd(0xda);//--set com pins hardware configuration Oled_WR_Cmd(0x12); Oled_WR_Cmd(0xdb);//--set vcomh Oled_WR_Cmd(0x40);//Set VCOM Deselect Level Oled_WR_Cmd(0x20);//设置内存地址模式 (0x00/0x01/0x02) Oled_WR_Cmd(0x02);// Oled_WR_Cmd(0x8d);//电荷泵设置 Oled_WR_Cmd(0x14);//--set(0x10) disable Oled_WR_Cmd(0xa4);// Disable Entire Display On (0xa4/0xa5) Oled_WR_Cmd(0xa6);// Disable Inverse Display On (0xa6/a7) Oled_WR_Cmd(0xaf);//--开启显示 Oled_Fill(0xff); //Oled_Cls(); //初始清屏 Oled_Set_Pos(0,0);//初始位置 } //============================================================== //函数名:Oled_6x8_Str(uchar x,uchar y,uchar *p) //功能描述:写入一组标准ASCII字符串 //参数:显示的位置(x,y),y为页范围0~7,要显示的字符串 //返回:无 //============================================================== void Oled_6x8_Str(uchar x,uchar y,uchar ch) { uchar c=0,i=0,j=0; while (ch) { ch -= 32; if(x > 126) { x = 0; y++; } Oled_Set_Pos(x,y); for(i=0;i<6;i++) Oled_WR_Data(f6x8[ch][i]); x += 6; j ++; } } ``` main.c: ``` #include <iom8v.h> #include <macros.h> #include "ssd1306.h" uchar count = 0; void main(void) { port_init(); Oled_init(); Oled_Fill(0xff); while(1) { if((PINB&(1<<PB0))==0) { while(!(PINB&(1<<PB0))); if(count>=10) count = 0; else count += 1; } delay_ms(5000); Oled_Cls(); Oled_6x8_Str(2,2,count); delay_ms(5000); Oled_Fill(0x00); } } ```
winsock 网络编程 ftp服务器设计
课程设计时我选的课题是【FTP服务器设计与实现】,老师非要用系统自带的那个telnet作为客户端测试 就是用这个命令【telnet ip 端口号】,但是在实现get命令时下载的文件不知道保存到那里去了。 对于put命令实在是一点头绪都没有,求大神指点。。 #include <winsock2.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") #define CLIENT_COUNT 2 #include <stdlib.h> #include <direct.h> #include <io.h> typedef struct _client_t{ SOCKET c; SOCKADDR_IN c_sa; } client_t; client_t clients[CLIENT_COUNT]; WSADATA wsa_data; SOCKET s; SOCKADDR_IN sa; unsigned short port = 23; int backlog = SOMAXCONN;// fd_set readfds; int client_count = 0; int r = 0; char path[80]="shareFile"; char strObject[100]=""; char pathname[80]=""; char buf[80];//接收发送缓冲区 int nn,bytes; int iSynError=1; int sdirfun(SOCKET newsocket);//打印文件目录 int sgetfun(SOCKET newsocket,char name[80],int bytes);//下载文件 //int sputfun(SOCKET newsocket,pathname);//发送文件 int main(int argc, char *argv[]) { if ( 0!=access("shareFile",0)) _mkdir("shareFile"); int n; int i; printf("server start...\n"); memset(&wsa_data, 0, sizeof(wsa_data));//地质结构清零 WSAStartup(0x202, &wsa_data);//初始化版本号2.2 printf("socket...\n"); s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字 if(INVALID_SOCKET==s) { return -1; } memset(&sa, 0, sizeof(sa));//地址结构清零 sa.sin_family = AF_INET; sa.sin_addr.s_addr = INADDR_ANY; sa.sin_port = htons(port); if(SOCKET_ERROR==bind(s, (SOCKADDR*)&sa, sizeof(sa))) {//绑定 r = -2; goto clean; } if(SOCKET_ERROR==listen(s, backlog)) {//监听 r = -3; goto clean; } while(1) { FD_ZERO(&readfds); FD_SET(s, &readfds); for(i=0;i<client_count;i++) { FD_SET(clients[i].c,&readfds); } n = select(0,&readfds,NULL,NULL,NULL); if(n<0) { printf("select error.\n"); r = -4; goto clean; } else if(n==0) { printf("time out\n"); } else//////此时n表示可以使用的套接字数量 { if(FD_ISSET(s,&readfds)) //表示有客户连接请求到达(接收后并处理命令) { SOCKET c; SOCKADDR_IN c_sa; int c_sa_len = sizeof(c_sa); printf("listen message.\n"); c = accept(s,(struct sockaddr *)&c_sa,&c_sa_len); if(INVALID_SOCKET==c) { printf("accept error.\n"); } else { if(client_count>=CLIENT_COUNT) { closesocket(c); printf("client full.\n"); } else { FD_SET(c, &readfds); clients[client_count].c = c; clients[client_count].c_sa = c_sa; client_count++; printf("%s 端口已连接: %d \n",inet_ntoa(c_sa.sin_addr), ntohs(sa.sin_port)); sprintf(buf," *****欢迎使用本服务器**** \r\n"); //向客户端发送欢迎消息 send(c, buf, strlen(buf), 0); sprintf(buf," dir: 列出远方当前目录\r\n"); //向客户端发送欢迎消息 send(c, buf, strlen(buf), 0); sprintf(buf," get: 取远方的一个文件\r\n"); //向客户端发送欢迎消息 send(c, buf, strlen(buf), 0); sprintf(buf," put: 传给远方一个文件\r\n"); //向客户端发送欢迎消息 send(c, buf, strlen(buf), 0); } } } else //有客户发来数据 { //int bytes; int buf_len = 80; int is_need_close = 0; printf("\nclient message.\n"); for(i=0;i<client_count;i++) { if(FD_ISSET(clients[i].c, &readfds)) { memset(buf,0,buf_len); bytes = recv(clients[i].c, buf, buf_len, 0); if(bytes<0) { printf("recv error: %d.\n", WSAGetLastError()); is_need_close = 1; } else if(bytes==0) { printf("client offline.\n"); is_need_close = 1; } else { if(strncmp(buf,"dir",3)==0) sdirfun(clients[i].c); if (strncmp(buf,"get",3)==0) sgetfun(clients[i].c,buf,bytes); if (strncmp(buf,"put",3)==0) { sprintf(buf,"请输入文件路径:\r\n"); send(clients[i].c,buf,buf_len,0); recv(clients[i].c, pathname, 80, 0); // sputfun(clients[i].c,pathname); } } if(is_need_close) { closesocket(clients[i].c); clients[i] = clients[client_count-1]; clients[client_count-1].c = INVALID_SOCKET; client_count--; } } } } } } clean: printf("server stop...\n"); if(INVALID_SOCKET!=s) { closesocket(s); } for(i=0;i<client_count;i++) { if(clients[i].c!=0&&clients[i].c!=INVALID_SOCKET) { closesocket(clients[i].c); } } WSACleanup(); return 0; } int sdirfun(SOCKET newsocket) { char temp_buffer[80]; FILE *p_FiLeTemp; strObject[0]='\0'; strcat(strObject,"dir "); strcat(strObject,path); strcat(strObject,">tmp.txt"); system(strObject); //system函数执行shell命令 p_FiLeTemp=fopen("tmp.txt","r"); //打开执行结果文件,准备发送到客户端 while (fgets(temp_buffer,80,p_FiLeTemp)!=NULL) //每次读取80字节发送 { sprintf(buf,"%-81s",temp_buffer); // send(newsocket, buf, strlen(buf), 0); } fclose(p_FiLeTemp); //发送完毕,关闭结果临时文件 system("del tmp.txt"); //删除结果临时文件 printf("客户端命令:dir:已执行 ! \n"); r=0; return 0; } /*********************************************************************** 函数名:sgetfun 说明: 用于处理来自客户端的文件下载命令 输入参数: SOCKET h_newsocketet,命令通过此socket接收到,可通过它响应命令。 ***********************************************************************/ int sgetfun(SOCKET newsocket,char name[80],int bytes) { int i=0,k=0; char filename[20],temp_buffer[80]; char *p_FileName=strObject; FILE *fp; for(i=0;i<bytes-3;i++) if(name[i+4]!='\r') filename[i]=name[i+4]; printf("客户端下载文件为:"); puts(filename); strcat(strObject,filename); //打开客户端欲下载的文件 if( (fp=fopen(p_FileName,"r")) == NULL ) { //未成功打开文件 sprintf(buf, "Sorry, cannot open %s. Please try again.\r\n", filename); bytes = send(newsocket, buf, strlen(buf), 0); sprintf(buf, "over\r\n"); bytes = send(newsocket, buf, strlen(buf), 0); return 1; } else { printf("文件正在上传:%s\n\n",filename); sprintf(buf, "send...\r\n"); bytes = send(newsocket, buf, strlen(buf), 0); while (fgets(temp_buffer,80,fp)!=NULL) { //循环读取文件并通过h_newsocketet发送到客户端 sprintf(buf,"%s",temp_buffer); send(newsocket, buf, 80, 0); // printf("."); //文件发送中,每发80个字节在屏幕打一个点号 } fclose(fp); sprintf(buf, "send over\r\n"); bytes = send(newsocket, buf, strlen(buf), 0); } //iSynError=0; printf("客户端命令:get:已执行! \n"); return 0; } /* /******************************************************************** 函数名:sputfun 说明: 用于处理来自客户端的文件上传命令 *******************************************************************//*/ int sputfun(SOCKET newsocket,pathname) { //printf("Equivalent to put. \n"); int i=4,k=0; char filename[20]; // identify the filename from rbuffer after the word "RETR " while (1) { bytes = recv(newsocket,&RecvBuffer[i],1,0); if ((bytes < 0) || (bytes == 0)) break; filename[k]=RecvBuffer[i]; if (RecvBuffer[i] == '\0') { filename[k] = '\0'; break; } if (RecvBuffer[i] != '\r') { i++; k++; } } // end of while strcat(strObject,filename); printf("客户端上传文件:%s\n",strObject); char *p_FileName=strObject; FILE *fpse; if( (fpse=fopen(strObject,"w")) == NULL ) { printf("open errer!\n"); return 1; } else { printf("已接受文件 : %s\n",filename); while(1) { //读取流并显示 int ret; ret = recv(newsocket, RecvBuffer, 80, 0); if (ret == 0) // Graceful close return 0; else if (ret == SOCKET_ERROR) { printf("recv() failed: %d\n", WSAGetLastError()); return 0; } if(strncmp(RecvBuffer,"226 Transfer",strlen("226 Transfer"))==0) { break; } fprintf(fpse,"%s",RecvBuffer); } printf("RBUFFER=%s",RecvBuffer); fclose(fpse); } iSynError=0; printf("客户端命令:put:已执行! \n"); return 0; } */ ``` ```
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
《阿里巴巴开发手册》读书笔记-编程规约
Java编程规约命名风格 命名风格 类名使用UpperCamelCase风格 方法名,参数名,成员变量,局部变量都统一使用lowerCamelcase风格 常量命名全部大写,单词间用下划线隔开, 力求语义表达完整清楚,不要嫌名字长 ...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Linux 命令(122)—— watch 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] watch(1) manual
Linux 命令(121)—— cal 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] cal(1) manual
记jsp+servlet+jdbc实现的新闻管理系统
1.工具:eclipse+SQLyog 2.介绍:实现的内容就是显示新闻的基本信息,然后一个增删改查的操作。 3.数据库表设计 列名 中文名称 数据类型 长度 非空 newsId 文章ID int 11 √ newsTitle 文章标题 varchar 20 √ newsContent 文章内容 text newsStatus 是否审核 varchar 10 news...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问