Здравствуйте. Здесь описано чем и как собрать код пытаюсь:
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 — начинаются проблемы:
А с чего ты взял, что va_list кастится к указателю? Это от платформы зависит, вообще-то.
Посмотри в версию хедеров для ARM -- там скорее всего структура какая-то из двух полей, например...
В целом не ясно, зачем вообще представлять va_list как const void*?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, 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 копируется и присваивается, чего ещё тебе надо?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, 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.
Здравствуйте, ProGameDev, Вы писали:
PGD>Да проблема то как раз в том, что для всех нужных платформ кроме Android это всё уже написано и работает. Эта проблема возникла только на gcc-arm.
Ну, дык, меняешь тип на правильный в известных тебе функциях, компилируешь -- получаешь список мест, где ещё на это заложились, правишь там и так в несколько итераций получаешь таки отрефакторенную версию...
Но можно и грубой силой, конечно. sizeof'ы-то свопадают у типов или таки va_list на ARM'е больше указателя?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, 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.