我有一个具有独立功能的C++程序.
由于大多数团队对面向对象的设计和编程缺乏经验或知识,我需要避免使用函数对象.
我想将一个函数传递给另一个函数,比如for_each函数.通常,我会使用函数指针作为参数:
typedef void (*P_String_Processor)(const std::string& text);
void For_Each_String_In_Table(P_String_Processor p_string_function)
{
for (unsigned int i = 0; i < table_size; ++i)
{
p_string_function(table[i].text);
}
}
Run Code Online (Sandbox Code Playgroud)
我想删除指针,因为它们可以指向任何地方,并包含无效的内容.
是否有一种通过引用传递函数的方法,类似于通过指针传递,而不使用函数对象?
例:
// Declare a reference to a function taking a string as an argument.
typedef void (??????);
void For_Each_String_In_Table(/* reference to function type */ string_function);
Run Code Online (Sandbox Code Playgroud) 我在一个受限制的嵌入式系统上工作.
目前我们使用snprintf缓冲区,然后使用另一个语句,将缓冲区打印到串口:
char temp_buffer[256];
int bytes_written = snprintf(temp_buffer, sizeof(temp_buffer),
"Solar system has %d planets\n",
10);
if (bytes_written > 0)
{
Serial_Port_Output(temp_buffer, bytes_written);
}
Run Code Online (Sandbox Code Playgroud)
我想切换到printf直接写入串口.根据我们的编译器文档,我拦截了函数调用以输出数据以使用串行端口.(接口使用块写入:地址和字符数).
该printf函数可以使用字符缓冲区进行格式化,例如整数或浮点到文本.
问题:
printf用于格式化的缓冲区在哪里?(在我做出改变之前,其他有探究的人都想知道.)平台:Arm7tdmi处理器,片上系统(SOC),IAR EW编译器.
在RAII中,资源在访问之前不会初始化.但是,许多访问方法被声明为常量.我需要调用mutable(非const)函数来初始化数据成员.
示例:从数据库加载
struct MyClass
{
int get_value(void) const;
private:
void load_from_database(void); // Loads the data member from database.
int m_value;
};
int
MyClass ::
get_value(void) const
{
static bool value_initialized(false);
if (!value_initialized)
{
// The compiler complains about this call because
// the method is non-const and called from a const
// method.
load_from_database();
}
return m_value;
}
Run Code Online (Sandbox Code Playgroud)
我的原始解决方案是将数据成员声明为mutable.我宁愿不这样做,因为它表明其他方法可以改变成员.
如何转换load_from_database()语句以摆脱编译器错误?
当初始化具有外部常量整数的结构数组时,我收到错误消息"表达式必须具有常量值".
FILE1.C:
const unsigned char data1[] =
{
0x65, 0xF0, 0xA8, 0x5F, 0x5F,
0x5F, 0x5F, 0x31, 0x32, 0x2E,
0x31, 0xF1, 0x63, 0x4D, 0x43,
0x52, 0x45, 0x41, 0x54, 0x45,
0x44, 0x20, 0x42, 0x59, 0x3A,
0x20, 0x69, 0x73, 0x70, 0x56,
// ...
};
const unsigned int data1_size = sizeof(data1);
Run Code Online (Sandbox Code Playgroud)
file2.c中:
const unsigned char data2[] =
{
0x20, 0x44, 0x61, 0x74, 0x61,
0x20, 0x52, 0x6F, 0x77, 0x20,
0x3D, 0x20, 0x34, 0x38, 0x12,
//...
};
const unsigned int data2_size = sizeof(data2);
Run Code Online (Sandbox Code Playgroud)
Get_Byte.c:
extern const …Run Code Online (Sandbox Code Playgroud) 我正在使用MySQL和准备好的语句来插入BLOB记录(jpeg图像).执行准备好的语句后,我发出一个SELECT LAST_INSERT_ID()并返回0.
在我的代码中,我在执行命令之后放置一个断点,在MySQL命令(监视器)窗口中,我发出SELECT LAST_INSERT_ID()并返回零.
在MySQL命令(监视器)窗口中,我发出一个SQL语句来选择所有ID,最后一个(仅)插入的ID是1(一个).
我在用:
我的表格描述:
mysql> describe picture_image_data;
+---------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+----------------+
| ID_Image_Data | int(10) unsigned | NO | PRI | NULL | auto_increment |
| Image_Data | mediumblob | YES | | NULL | |
+---------------+------------------+------+-----+---------+----------------+
2 rows in set (0.19 sec)
Run Code Online (Sandbox Code Playgroud)
使用MySQL监视器的结果:
mysql> select ID_Image_Data
-> from picture_image_data;
+---------------+
| …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用带有重载<运算符的插入排序来命令指针向量(不能使用任何库).有一个包含另一个类的类,如:
class A {
vector<B*> v;
void order();
}
class B {
int id; //each one is unique
virtual double num() {} const;
bool operator<(const B* b2) const;
}
class B1: public B {
double num() {} const;
}
class B2: public B {
double num() {} const;
}
Run Code Online (Sandbox Code Playgroud)
每个孩子都有不同的计算num的方法,并且使用num返回的double作为第一个标准,然后是id来完成排序.(对不起缩进)
void A::order() {
for (unsigned int p = 1; p < v.size(); p++)
{
ClassB* tmp = v[p];
int j;
for (j = p; j > 0 && tmp < …Run Code Online (Sandbox Code Playgroud) 我的一位同事使用以下方法声明并初始化了一个全局变量new:
#define MAX_SIZE_TABLES (1024 * 1024)
unsigned char * ImageBuf = new unsigned char[MAX_SIZE_TABLES];
Run Code Online (Sandbox Code Playgroud)
使用Microsoft Visual Studio 2010 Premium编译和构建时没有错误.
我的问题:
标准或未定义的行为是否合法?
如果没有函数调用,何时删除内存delete?
编辑1:在"为变量声明"之后添加"初始化".
c++ memory-management global-variables visual-studio-2010 new-operator
我正在阅读size_tC/C++中的文章http://web.archive.org/web/20081006073410/http://www.embedded.com/columns/programmingpointers/200900195(通过Stackoverflow找到的链接).
从文章引用:
类型size_t是一个typedef,它是某些无符号整数类型的别名,通常是unsigned int或unsigned long,但可能是unsigned long long.每个标准C实现都应该选择足够大的无符号整数 - 但不要大于需要 - 来表示目标平台上最大可能对象的大小.
如何确定机器上最大可能对象的大小?
什么影响最大对象的大小(除了处理器)?
欢迎详细解释链接.
我一直试图释放这个char指针数组,但我不确定如何完全释放它.
这是代码:
char* words[4];
words[0] = new char[8];
words[1] = new char[6];
words[2] = new char[10];
words[3] = new char[16];
Run Code Online (Sandbox Code Playgroud)
和继承人我试过的
for (int i=0;i<4;i++)
{
delete [] words[i];// this works
}
delete [] words;//this gives an error, not sure why it doesn't work.
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这是不正确的以及如何解决它提前感谢.
我从静态分析工具中收到有关以下代码段的错误:
uint8_t value = 24U;
char buffer[512];
int chars_printed = snprintf(buffer, sizeof(buffer),
"The value in hex is 0x%02hhX\r\n",
value);
Run Code Online (Sandbox Code Playgroud)
错误是:
MISRA-2004规则10.1违规:隐式转换函数参数中的非常量表达式.将"value"与基础类型"unsigned char"(8位,无符号)转换为类型"int"(32位,有符号).
MISRA期望从"%X"说明符获得的签名和位宽是多少?
据说"%X" unsigned int来自cppreference页面.
IAR编译器的MISRA C 2004检查程序没有错误.
这个来自Coverity.