LINUX.ORG.RU

warning: cannot pass objects of non-POD type


0

0

.../ldm/src/main.cpp:83: warning: cannot pass objects of non-POD type `class QString' through `...'; call will abort at runtime

такая вот месага выскакивает при компиляции, как я понял - моя 
функция не будет вызвана привыполнение, но как это исправить. 
И чё такое non-POD type?

Вот код:

int main ( int argc, char **argv )
{
	int ret;
	set_root ( );
	QString LDM = go_to_cur_dir ( );
	ldmWC *wc = new ldmWC;
	
	if ( !getenv ( "DISPLAY" ) & !wc->IAmShutDown ( ) )
	{
		pid_t pid = fork ( );
		if ( pid == 0 ) //1
		{
			pid_t pid = fork ( );
			if ( pid == 0 )//2
			{
				while ( !wc->IAmShutDown ( ) )
				{
					pid_t pid = fork ( );
					if ( pid == 0 )//3
					{
						set_root ( );
						execlp ( XINIT, XINIT, LDM, 0 ); <--------- вот эта строка
						perror ( XINIT );
					}
					else if ( pid != -1 )//3
					{
						int status = 0;
						waitpid( pid, &status, 0 );
					}
				}
			}
		}
	}
	else
	{
.............

Мне в упор надо создавать LDM динамически.

Заранее спасибо!!!
★★★★★

1. POD - plain old data, ты объект класса пытаешься передать через ...
2. Ты совсем с ума сошел и думаешь что execl принимает строки типа QString? Про const char* ты хоть раз слышал?

Begemoth ★★★★★
()


cyclon,

Ты может каких книжек по программированию купи, а?
Их сейчас есть на русском и недорого.

1. Нельзя передать объект через varying argument list (...).
А execlp() именно такая функция. По крайней мере в случае,
есть у объекта есть, IMHO, copy-конструктор.
За подробностями - в поиск на groups.google.com

2. Вторая ошибка более глубокая и показывает непонимание сути
процесса. Вызов execlp() должен сформировать массив указателей
на указатели на char, в проторечии - массив строк. Тот,
который будет виден в main() как argv. Нельзя передать
через argv объект. Поэтому передавать execlp() QString -
- занятие совершенно бессмысленное.

HTH

anonymous
()
Ответ на: комментарий от anonymous

Да я уже разобрался, а пока копался с другим забыл отпечатать сюда. То что надо делать char я знаю, просто торможу, лето так действует, вернее то что от него осталось.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от Begemoth

ТО Begemoth:

ну кто сошёл с ума я не знаю но вот только execlp нормально переваривает 
QString'и  и прочую парашу, если бы это было не так я бы не сормозил.

void ldmScreen::do_reboot ( )
{
	ldmWC *wc = new ldmWC ( );
	wc->setShutDown ( );
	delete wc;
	execlp ( reboot_comand, reboot_comand, 0 );    <---------- this
}

раз

void ldmUsers::auth ( )
{
	_auth = new ldmAuth ( );
	if ( getPass ( ).length ( ) > 0 )
	{
		if ( _auth->checkPass ( getName ( ), getPass ( ) ) )
		{
			passwd *pw= getpwnam ( getName ( ) );
			
			setuid( pw->pw_uid );
			setgid( pw->pw_gid );
			setenv ( "HOME", pw->pw_dir, 1 );
			setenv ( "USER", pw->pw_name, 1 );
			setenv ( "LOGUSER", pw->pw_name, 1 );

			execlp ( dm, dm, 0 );     <----------- and this
		}
		else
		{
...........

и два

И прошу заметить оба работают, и в обоих динамические строки.

Вот по этому поводу я и ступил.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon


cyclon,

Ты точно ступливаешь...

$ man execlp

int execlp(const char *file, const char *arg, ...);

Для особо одаренных - первые два аргумента описаны явно.


В случае
execlp ( reboot_comand, reboot_comand, 0 );
и
execlp ( dm, dm, 0 );

ты _не_ пытаешься передать объект через (...), аргументы у тебя
передаются через вполне конкретные file и arg. И наверное
при наличии у объектов операторов приведения к (char*)
они таки передадутся.

Ну и теперь сравни это с твоей проблемной строчкой:
execlp ( XINIT, XINIT, LDM, 0 );
Разницу видишь?

HTH



anonymous
()
Ответ на: комментарий от anonymous

Короче понял. Просто как мне казалось, в таких функциях ( где есть ... ) всё аргументы задаются одинаково, а троетотчие только для динамики.

Спасибо, разьяснил. Вот только в мане кажись не упоминается это... ну да ладно.

ЗЫ: я уже раньше ставил const char*, просто тогда у меня неверно считался путь к файлу и мне казалось что сея ботвав не пашет, вот ща видимо и ступил.

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.