Передача строки в функцию форматирования?

1

Исходный код, который печатает на stderr:

extern "C" {
/* error: output error message */
void Error(const int error, char *message, ...)
{
    va_list arg;
   fflush(stdout);
   fflush(stderr);

   if (error > 0)
     fprintf(stderr, "\nError: ");
   else
     fprintf(stderr, "\nWarning: ");

   va_start(arg, message);
   vfprintf(stderr, message, arg);
   va_end(arg);

   fflush(stderr);
   if (error > 0)
      exit(error);
}

void main(){
Error(0,"Problem %s in file", "sometext");
}

}//extern "C"

Я изменил свой код, чтобы выглядеть так. Он должен печатать до logcat

extern "C" {
#include <android/log.h>
#include <jni.h>
#include <sys/types.h>

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <math.h>

/* error: output error message */
void Error(const int error, char *message, ...)
{
    va_list arg;

   va_start(arg, message);
   if (error > 0)
   __android_log_print(ANDROID_LOG_ERROR, "HTS_API", message, arg);
      else
   __android_log_print(ANDROID_LOG_WARN, "HTS_API", message, arg);
   va_end(arg);

   if (error > 0)
      exit(error);
}
void main(){
Error(0,"Problem %s in file", "sometext");
}

}//extern "C"

Проблема в том, что мой код выводит: 'Problem | ;A.| ;A. in file' 'Problem | ;A.| ;A. in file'

и __android_log_print(ANDROID_LOG_WARN, "HTS_API","Problem %s in file", "sometext");

Правильный вывод: 'Problem sometext in file'

Что я делаю не так?

  • 0
    Вы определяете это как Error но называете это error . Кроме того, это должно быть int main .
  • 0
    это была опечатка и главное это просто случайная функция
Показать ещё 2 комментария
Теги:
string
android-ndk
logcat

1 ответ

9
Лучший ответ

__android_log_print не принимает параметр va_list в качестве параметра. Он принимает список переменных параметров.

Это похоже на новейшие NDK, которые они добавили

int __android_log_vprint(int prio, const char *tag, const char *fmt, va_list ap);

который вы хотите. Раньше вам приходилось исправлять эту проблему путем повторной реализации Error в виде макроса с переменным списком аргументов или с помощью vsprintf для форматирования сообщения об ошибке в буфере, а затем сказать

__android_log_print(ANDROID_LOG_WARN, "HTS_API", "%s", buf);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню