宏#define MAX 80
等效于const int MAX = 80;
两者都是常量且无法修改.
使用宏而不是常量整数不是更好吗?常量整数占用内存.预处理器将宏的名称替换为其值,对吧?所以它不会记忆.
为什么我会使用const int而不是宏?
我的应用程序需要执行一些可能需要一秒钟但可能还需要10分钟的操作.为此,我需要在操作期间显示一个带有不确定QProgressBar的QProgressDialog.
QProgressDialog dlg( this );
dlg.setBar( new QProgressBar() );
dlg->setMaximum( 0 );
dlg->setMinimum( 0 );
dlg.setModal( true );
dlg.show();
//operation ...
dlg.close();
Run Code Online (Sandbox Code Playgroud)
在我的操作过程中,对话框显示,是透明的,没有进度条,并在操作后关闭.
有谁知道我可以做些什么来显示一个模式对话框,阻止用户与应用程序交互,并向用户显示不确定的进度条?
我一直在考虑让程序员写下所有ASCII字符的简单方法.首先,我尝试在控制台中打印它,但它没有显示所有字符.所以我试着将它写入一个先工作但现在不工作的文件.
代码:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream file;
file.open("/home/david/Desktop/ascii.txt", ios_base::out);
for(int i = 0; i <= 255; i++)
file << char(i);
file.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
普通的ASCII表有128个,扩展表有127个.所以一共有255个字符.但不知何故,它不会将所有字符保存到文件中.有时候"gedit"甚至不能识别编码标准.
我究竟做错了什么?
我做了一个toUpper()的实现.它不起作用100%.
代码:
char* toUpper(char* string)
{
char* sv = string;
while(*sv++ != '\0')
{
if( int(*sv) >= 97 || int(*sv) <= 122) //Only if it's a lower letter
*sv = char( *sv - 32);
}
return string;
}
Run Code Online (Sandbox Code Playgroud)
我知道低位字母的数字从97到122(ASCII格式),高位字母的数字从65到90.低位到高位字母之间正好有32个数字.所以我只是从较低的字符减去32.
我调用此函数的代码:
char h[] = "Whats up?";
cout << toUpper(h) << endl;
Run Code Online (Sandbox Code Playgroud)
我希望程序输出"WHATS UP?" 但相反,我得到了"什么".我做错了什么?
我正在开发一个小程序.我使用Qt作为GUI.我有2个表格/课程.MainWindow
和AddProductDialog
.
std::string
在我们两个都需要一个变量(确切地说是一个).我需要在AddProductDialog
(例如std::string decl = ""
;)的事件中定义它,我需要在我的MainWindow的函数中使用它的值.
我以为我可以将这个变量放在一个头文件中,每个头文件都包含但显然它不起作用.
现在它有效,但我认为这不是一个好的风格.我在main.cpp中声明并定义了它.
main.cpp:
//includes ...
...
std::string descr; //The variable I need
int main(){ /* blah blah */ }
Run Code Online (Sandbox Code Playgroud)
MainWindow.cpp:
void MainWindow::on_AddProductOptions_clicked()
{
extern std::string descr;
AddProductDialog *adp = new AddProductDialog(this);
adp->setModal(true);
if(adp->exec() == QDialog::Accepted)
_Description = descr; //_Description is a private variable of my MainWindow Class
}
Run Code Online (Sandbox Code Playgroud)
AddProduct.cpp
void AddProductDialog::on_cmdOkay_clicked()
{
extern std::string descr;
descr = "";
done(QDialog::Accepted);
}
Run Code Online (Sandbox Code Playgroud)
这当然是有效的.但是有没有办法在标题中声明这个变量并包含它以便我可以使用它?
我一开始尝试过类似的东西,但总是会导致错误:
头
//include guard
extern …
Run Code Online (Sandbox Code Playgroud) 我知道......以某种方式的基础知识,但我不明白。我读到我可以将我的函数定义放在我的头文件中,然后包含它。到目前为止我从未这样做过,因为我喜欢我在 .cpp 文件中的定义与它在头文件中的声明分开。
现在我只有两个函数,我不想要这些定义的额外文件。
头文件.h
const QString reviewToString(const int); //Declaration - do I even need it now?
const QString statusToString(const int); //Declaration - do I even need it now?
const QString reviewToString(const int r) //Definition
{
switch(r)
{
case 0:
return "Excellent";
case 1:
return "Great";
case 2:
return "Okay";
case 3:
return "Poor";
case 4:
return "Terrible";
default:
return "Unknown";
}
}
const QString statusToString(const int s) //Definition
{
switch(s)
{
case 0:
return "Watched";
case 1:
return "Bought"; …
Run Code Online (Sandbox Code Playgroud) 我听到很多人说
int a = 0;
a += 10;
Run Code Online (Sandbox Code Playgroud)
比...更快
int a = 0;
a = a + 10;
Run Code Online (Sandbox Code Playgroud)
这是为什么?我用gdb调试它,它绝对是相同的指令.
gdb:
第一
(gdb) list
1 int main()
2 {
3 int counter = 0;
4 counter = counter + 10;
5 return 0;
6 }
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004004cc <+0>: push %rbp
0x00000000004004cd <+1>: mov %rsp,%rbp
0x00000000004004d0 <+4>: movl $0x0,-0x4(%rbp)
0x00000000004004d7 <+11>: addl $0xa,-0x4(%rbp)
=> 0x00000000004004db <+15>: mov $0x0,%eax
0x00000000004004e0 <+20>: pop %rbp
0x00000000004004e1 …
Run Code Online (Sandbox Code Playgroud) 在QMainWindow
构造函数中,我读取了一个数据库,并在其中填充QListWidget
了项目。显然没有选择任何项目,因此我必须自己做。我还有一个插槽,当我单击列表中的一个项目时,该插槽将被调用。
我尝试过,setCurrentRow( const int )
但如果这样做,则不会调用该插槽。我已经看过函数setCurrentIndex(const QModelIndex&),但是我对QModelIndex不熟悉。
如何告诉QListWidget选择第一个项目并调用on_list_clicked(const QModelIndex& index)
广告位?
编辑:此外,我不能使用除单击以外的任何其他插槽,因为当我从列表中删除某个索引时currentRowChanged(int)
,itemSelectionChanged()
这两个都使我的程序崩溃。
所以我需要以某种方式单击列表...
void DataSaver::save( const std::vector<long>& vec )\n{\n using std::ios_base;\n std::ofstream file;\n file.open( "/home/david/Desktop/test", ios_base::out | ios_base::binary );\n for(int i = 0; i < vec.size(); i++)\n file << vec.at( i ) << "\\00\\01\\10\\00";\n file.close();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n这会导致一些错误:
\n\n\n\n\ng++ main.cpp datasaver.cpp
\n
\n datasaver.cpp: 在成员函数 \xe2\x80\x98void DataSaver::save(const std::vector&)\xe2\x80\x99:
\n datasaver.cpp:11:16:错误:聚合 \xe2\x80\x98std::ofstream 文件\xe2\x80\x99 的类型不完整,无法定义
\n datasaver.cpp:12:41:错误:类型不完整 \xe2\x80\x98std::ios_base\ xe2\x80\x99 用于嵌套名称说明符
\n datasaver.cpp:12:57: 错误: 不完整类型 \xe2\x80\x98std::ios_base\xe2\x80\x99 用于嵌套名称说明符
我包括iostream
,ofstream
和vector
有人可以解释一下出了什么问题吗?
\n当我想知道数组的大小时,我会执行以下操作:
int array[30];
for(int i = 0; i < 30; i++)
array[i] = i+1; //Fill list
const int size = sizeof(array) / sizeof(array[0]);
Run Code Online (Sandbox Code Playgroud)
但是当我在函数中将数组作为参数传递时,我将在函数中有一个指针.
int size( int array[] )
{
return sizeof(array) / sizeof(array[0]); //Doesn't work anymore
}
Run Code Online (Sandbox Code Playgroud)
这显然不起作用.但是如何在不使用大小的另一个参数的情况下获取函数中该数组的大小?