例如,我有一个点向量,只能在运行时确定其大小。
vector<Point2f> image_points;
....
__android_log_print(ANDROID_LOG_DEBUG, "JNI","Image Points are: (%.2f,%.2f)(%.2f,%.2f)(%.2f,%.2f)(%.2f,%.2f)",
image_points[0].x,image_points[0].y,image_points[1].x, image_points[1].y,image_points[2].x,image_points[2].y,image_points[3].x, image_points[3].y);
此代码我仅假设有4个点,但是可能有0到许多点 我认为它在某种程度上类似于printf和vprintf,但是我都不了解该部分。我该如何编写va_list和formate部分?请在您的答案中张贴确切的可行代码。
答案 0 :(得分:0)
虽然您可以构造一个动态格式的字符串并编成va_list
进行匹配,但您最好跳过它并在本地生成最终输出,然后将字符串发送给Android记录器
为方便起见,使用std::string
作为缓冲区:
std::string buf;
buf.reserve(image_points.size() * 32);
char tmp[32];
for (const auto & point: image_points) {
sprintf(tmp, "(%.2f, %.2f)", point.x, point.y);
buf.append(tmp);
}
__android_log_print(ANDROID_LOG_DEBUG, "JNI","Image Points are: %s", buf.c_str());
答案 1 :(得分:0)
这是我总结的答案,因此我自定义了to_string函数以将vector
vector<Point2f> image_points;
template<typename T>
String to_string(vector<Point_<T>> input){
if (std::is_same<T, float>::value) {
std::string buf;
buf.reserve(input.size() * 32);
char tmp[32];
for (const auto &point: input) {
sprintf(tmp, "(%.2f, %.2f)", point.x, point.y);
buf.append(tmp);
}
return buf;
}
....//some code in between
__android_log_print(ANDROID_LOG_DEBUG, "JNI","Image Points are:
%s",to_string(image_points).c_str());
任何人都有任何其他建议来编写更简单的功能,请随时发表评论