小编Tho*_*ews的帖子

如何通过引用传递函数?

我有一个具有独立功能的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)

c++ function-pointers pass-by-reference function-object

4
推荐指数
1
解决办法
171
查看次数

printf的格式化缓冲区在哪里?

我在一个受限制的嵌入式系统上工作.

目前我们使用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函数可以使用字符缓冲区进行格式化,例如整数或浮点到文本.

问题:

  1. printf用于格式化的缓冲区在哪里?(在我做出改变之前,其他有探究的人都想知道.)
  2. 这是编译器(平台)依赖的问题吗?

平台:Arm7tdmi处理器,片上系统(SOC),IAR EW编译器.

c c++ embedded printf iar

4
推荐指数
1
解决办法
420
查看次数

RAII:在const方法中初始化数据成员

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()语句以摆脱编译器错误?

c++ const-correctness lazy-evaluation

3
推荐指数
3
解决办法
719
查看次数

C:const结构数组中的外部const int

当初始化具有外部常量整数的结构数组时,我收到错误消息"表达式必须具有常量值".

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)

c arrays struct const extern

3
推荐指数
1
解决办法
7933
查看次数

使用预准备语句后,SELECT LAST_INSERT_ID()返回0

我正在使用MySQL和准备好的语句来插入BLOB记录(jpeg图像).执行准备好的语句后,我发出一个SELECT LAST_INSERT_ID()并返回0.

在我的代码中,我在执行命令之后放置一个断点,在MySQL命令(监视器)窗口中,我发出SELECT LAST_INSERT_ID()并返回零.

在MySQL命令(监视器)窗口中,我发出一个SQL语句来选择所有ID,最后一个(仅)插入的ID是1(一个).

我在用:

  • 服务器版本:5.1.46社区MySQL社区服务器(GPL)
  • Visual Studio 2008,版本9.
  • MySQL Connector C++ 1.0.5

我的表格描述:

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)

c++ mysql mysqldump prepared-statement

3
推荐指数
1
解决办法
3925
查看次数

无法找到operator <for指针类型

我正在尝试使用带有重载<运算符的插入排序来命令指针向量(不能使用任何库).有一个包含另一个类的类,如:

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)

c++

3
推荐指数
1
解决办法
279
查看次数

使用新的外部函数范围声明和初始化变量

我的一位同事使用以下方法声明并初始化了一个全局变量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

3
推荐指数
1
解决办法
2120
查看次数

什么是"目标平台上最大可能对象的大小",以size_t表示

我正在阅读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实现都应该选择足够大的无符号整数 - 但不要大于需要 - 来表示目标平台上最大可能对象的大小.

如何确定机器上最大可能对象的大小?

什么影响最大对象的大小(除了处理器)?

欢迎详细解释链接.

c c++ cpu size-t size-type

3
推荐指数
1
解决办法
223
查看次数

Deallocate Char Pointer

我一直试图释放这个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)

有人可以解释为什么这是不正确的以及如何解决它提前感谢.

c++

3
推荐指数
1
解决办法
1262
查看次数

MISRA C 2004 10.1,printf"%x"的签名

我从静态分析工具中收到有关以下代码段的错误:

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.

c printf type-conversion misra format-specifiers

2
推荐指数
1
解决办法
608
查看次数