Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2012, 03:00   #1
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию Строки, функция с переменным числом параметров

В функцию с переменным числом параметров передаютса слова, конец списка указатель NULL.Найти и вывести самое длинное слово.
Код:
void func( char *str,...)
{
	va_list p;
	char *k=0,*elem=0;
	int max;
	va_start(p,str);
	max = strlen(p);

	while (*p = NULL)
	{
		
		
		if (strlen(p)>max)
		{
			max = strlen(p);
			k =p;
		}
va_arg(p,char*);
	}
	cout << k;

	va_end(p);

}
В чем здесь проблема?
Unhandled exception at 0x5368d540 (msvcr100d.dll) in 4.exe: 0xC0000005: Access violation reading location 0x00000000.

Последний раз редактировалось Pein95; 09.12.2012 в 03:06.
Pein95 вне форума Ответить с цитированием
Старый 09.12.2012, 03:14   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Pein95 Посмотреть сообщение
В функцию с переменным числом параметров передаютса слова, конец списка указатель NULL.Найти и вывести самое длинное слово.
Код:
void func( char *str,...)
{
	va_list p;
	char *k=0,*elem=0;
	int max;
	va_start(p,str);
	max = strlen(p);

	while (*p = NULL) // <---- внимательно смотрим сюда
	{
		
		
		if (strlen(p)>max)
		{
			max = strlen(p);
			k =p;
		}
va_arg(p,char*);
	}
	cout << k;

	va_end(p);

}
В чем здесь проблема?
Unhandled exception at 0x5368d540 (msvcr100d.dll) in 4.exe: 0xC0000005: Access violation reading location 0x00000000.
1. Ты уверен, что тебе было нужно именно присвоение?
2. В результате присвоения модифицируется объект. Ты уверен, что этот объект можно модифицировать? А то, может быть он константный?
_Bers вне форума Ответить с цитированием
Старый 09.12.2012, 03:17   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,715
По умолчанию

Код:
*p = NULL
это совсем не сравнение
p51x вне форума Ответить с цитированием
Старый 09.12.2012, 03:20   #4
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

p51x,
очепятка, исправил не помогло.

_Bers,
Можно поподробней?

в С++ новичок.
Pein95 вне форума Ответить с цитированием
Старый 09.12.2012, 03:30   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Pein95 Посмотреть сообщение
_Bers,
Можно поподробней?

Код:
#include <iostream>
#include <stdarg.h>

void func( char *str,...)
{
    char *k=0,*elem=0;int max;
    va_list p; va_start(p,str);
    max = strlen(p);

    while (*p = NULL)
    {
        va_arg(p,char*);
        if (strlen(p)>max){ max = strlen(p); k =p; }
    }
    std::cout << k;  va_end(p);
}

int main()
{
    func("111","222");
}
В строке:

Код:
   while (*p = NULL)
Происходит разыменовывание указателя, и объекту, на который указывает указатель присваивается NULL

Так как объект был константным:
func("111","222");
Его значение нельзя изменять.

Объекты, рожденные константами компилятор может оптимизировать, расположить их в памяти только для чтения, и тп.

Попытка изменить значение такой памяти и приводит к ошибке.

/ps

В строке:
Код:
if (strlen(p)>max)

1>.\main.cpp(13) : warning C4018: >: несоответствие типов со знаком и без знака

Всегда обращай внимание на предупреждения компилятора. Это мины замедленного действия
_Bers вне форума Ответить с цитированием
Старый 09.12.2012, 03:39   #6
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

while (*p = NULL)
изменил на

while (*p != NULL)
всеравно не работает(
Pein95 вне форума Ответить с цитированием
Старый 09.12.2012, 03:59   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://www.cplusplus.com/reference/cstdarg/va_start/
посмотрите пример чтоль, может идею даст хоть.
а то чтото странное вижу.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.12.2012, 04:11   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
#include <iostream>
#include <stdarg.h>

void func(const char *str,...)
{
    const char *k=str; size_t max=strlen(str); va_list p; va_start(p,str);
    const char* it = va_arg(p,const char* );
    do
    {
        const size_t curLen = strlen(it);
        if (curLen>max){ max = curLen; k = it; }
        it = va_arg(p,const char* );
    }
    while (it!=NULL);
    va_end(p);
    std::cout<<"result = "<< k<< std::endl;
}

int main()
{
    func("111","2222",NULL);
}

Последний раз редактировалось _Bers; 09.12.2012 в 15:59.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция сложения с переменным числом параметров C++ lotus1994 Помощь студентам 13 09.02.2012 22:37
функция с переменным числом параметров Veselyn Общие вопросы C/C++ 1 08.04.2010 16:36
Функция с переменным числом параметров С++ [CODER] Помощь студентам 3 22.03.2010 03:58
Функции с переменным числом параметров Matr1x Общие вопросы C/C++ 2 07.01.2010 16:55