AndroidNDK: arm-linux-androideabi-g++: vsnprintf, va_list in
От: ProGameDev  
Дата: 04.03.13 17:16
Оценка:
Здравствуйте. Здесь описано чем и как собрать код пытаюсь:
NDK: Android NDK r8d
GCC Compiler: 4.6, 4.7
Platform: android-14 (с android-9 такая же проблема)
Architectures: mips, x86 (atom), arm
#include <stdio.h>
int
vslprintf( char* buffer, size_t count, const char* fmt, const void* va_list_arg )
{
    if( !buffer || !count || !fmt ) return -1;
    int ret;  
    ret = vsnprintf( buffer, count-1,  fmt, va_list (va_list_arg) ); // здесь проблема с GCC-ARM 

    if( ret < 0 )
    {
        buffer[count-1] = '\0';
        ret             = count;
    }   
    return ret;
}

Код компилируется без проблем и warnings на c gcc-x86, gcc-mips,
но как только компилирую с arm-linux-androideabi-g++.exe — начинаются проблемы:

_xxxxx.cpp:98:71: error: invalid cast from type 'const void*' to type '__va_list'
Build tool error : Command "X:/Tool/ga/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/windows/bin/arm-linux-androideabi-g++.exe" returned error 1

Господа, кто-нибудь сталкивался с такой проблемой?

добавлена разметка
Re: AndroidNDK: arm-linux-androideabi-g++: vsnprintf, va_list invalid cast probl
От: Erop Россия  
Дата: 04.03.13 18:20
Оценка:
Здравствуйте, ProGameDev, Вы писали:

PGD>vslprintf( char* buffer, size_t count, const char* fmt, const void* va_list_arg )
PGD>{
PGD>    int ret;  
PGD>    ret = vsnprintf( buffer, count-1,  fmt, va_list (va_list_arg) ); // здесь проблема с GCC-ARM

PGD>_xxxxx.cpp:98:71: error: invalid cast from type 'const void*' to type '__va_list'
PGD>Build tool error : Command "X:/Tool/ga/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/windows/bin/arm-linux-androideabi-g++.exe" returned error 1

А с чего ты взял, что va_list кастится к указателю? Это от платформы зависит, вообще-то.
Посмотри в версию хедеров для ARM -- там скорее всего структура какая-то из двух полей, например...

В целом не ясно, зачем вообще представлять va_list как const void*?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: AndroidNDK: arm-linux-androideabi-g++: vsnprintf, va_
От: ProGameDev  
Дата: 04.03.13 18:45
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, ProGameDev, Вы писали:


E>
PGD>>vslprintf( char* buffer, size_t count, const char* fmt, const void* va_list_arg )
PGD>>{
PGD>>    int ret;  
PGD>>    ret = vsnprintf( buffer, count-1,  fmt, va_list (va_list_arg) ); // здесь проблема с GCC-ARM 
E>

PGD>>_xxxxx.cpp:98:71: error: invalid cast from type 'const void*' to type '__va_list'
PGD>>Build tool error : Command "X:/Tool/ga/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/windows/bin/arm-linux-androideabi-g++.exe" returned error 1

E>А с чего ты взял, что va_list кастится к указателю? Это от платформы зависит, вообще-то.

E>Посмотри в версию хедеров для ARM -- там скорее всего структура какая-то из двух полей, например...

Да конечно пересмотрел хедера. Там в итоге это __builtin_va_list.

E>В целом не ясно, зачем вообще представлять va_list как const void*?


Платформонезависимость.
Здесь имеется ввиду, что
#ifdef PLATFORM_X
ret = vsnprintf( buffer, count-1,  fmt, va_list (va_list_arg) );
#elseif PLATFORM_Y
ret = _vsnprintf( майкрасофт стайл типа )
#elseif PLATFORM_Z
ret = ...
#endif

добавлена разметка
Re[3]: AndroidNDK: arm-linux-androideabi-g++: vsnprintf, va_list invalid cast pr
От: Erop Россия  
Дата: 04.03.13 19:02
Оценка:
Здравствуйте, ProGameDev, Вы писали:

E>>В целом не ясно, зачем вообще представлять va_list как const void*?


PGD>Платформонезависимость.

PGD>Здесь имеется ввиду, что
PGD>#ifdef PLATFORM_X
PGD>ret = vsnprintf( buffer, count-1, fmt, va_list (va_list_arg) );
PGD>#elseif PLATFORM_Y
PGD>ret = _vsnprintf( майкрасофт стайл типа )
PGD>#elseif PLATFORM_Z

1) пользуйся, пожалуйста, тэгами [c] для кода! [/c]
2) А что, у MS нет какой-то реализации va_list что ли? По станадарту va_list копируется и присваивается, чего ещё тебе надо?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: AndroidNDK: arm-linux-androideabi-g++: vsnprintf, va_list invalid cast pr
От: ProGameDev  
Дата: 04.03.13 19:46
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, ProGameDev, Вы писали:


E>>>В целом не ясно, зачем вообще представлять va_list как const void*?


PGD>>Платформонезависимость.

PGD>>Здесь имеется ввиду, что
PGD>>#ifdef PLATFORM_X
PGD>>ret = vsnprintf( buffer, count-1, fmt, va_list (va_list_arg) );
PGD>>#elseif PLATFORM_Y
PGD>>ret = _vsnprintf( майкрасофт стайл типа )
PGD>>#elseif PLATFORM_Z

E>1) пользуйся, пожалуйста, тэгами [c] для кода! [/c]

E>2) А что, у MS нет какой-то реализации va_list что ли? По станадарту va_list копируется и присваивается, чего ещё тебе надо?

Егор, ок. Понял. Спасибо за помощь. Да проблема то как раз в том, что для всех нужных платформ кроме Android это всё уже написано и работает. Эта проблема возникла только на gcc-arm.
Re[5]: AndroidNDK: arm-linux-androideabi-g++: vsnprintf, va_list invalid cast pr
От: Erop Россия  
Дата: 04.03.13 19:55
Оценка:
Здравствуйте, ProGameDev, Вы писали:

PGD>Да проблема то как раз в том, что для всех нужных платформ кроме Android это всё уже написано и работает. Эта проблема возникла только на gcc-arm.


Ну, дык, меняешь тип на правильный в известных тебе функциях, компилируешь -- получаешь список мест, где ещё на это заложились, правишь там и так в несколько итераций получаешь таки отрефакторенную версию...

Но можно и грубой силой, конечно. sizeof'ы-то свопадают у типов или таки va_list на ARM'е больше указателя?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: AndroidNDK: arm-linux-androideabi-g++: vsnprintf, va_list invalid cast pr
От: ProGameDev  
Дата: 04.03.13 20:24
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, ProGameDev, Вы писали:


PGD>>Да проблема то как раз в том, что для всех нужных платформ кроме Android это всё уже написано и работает. Эта проблема возникла только на gcc-arm.


E>Ну, дык, меняешь тип на правильный в известных тебе функциях, компилируешь -- получаешь список мест, где ещё на это заложились, правишь там и так в несколько итераций получаешь таки отрефакторенную версию...


Там не всё так просто
E>Но можно и грубой силой, конечно. sizeof'ы-то свопадают у типов или таки va_list на ARM'е больше указателя?..

О, кстати. Торможу я жутко от недосыпа. Хорошо, что ты подпихнул. Это ж я могу не страдать ерундой, а выдрать кусок куда и
из MS Visual Studio 2010 IDE + nVidia Tegra Android Developer Pack проверить и запустить на реальном девайсе nVidia Tegra Devkit.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.