Функция с переменным числом параметров
От: Аноним  
Дата: 29.11.05 09:46
Оценка:
Я использую функцию с переменным числом параметров, например такую:
void test (int first, ... )
{
va_list list;
va_start(list, first);
char *buf = va_arg(list, char *);
buf = "g";
}

В обычной функции если я передам в функцию в одном из параметров адрес переменной( &str) то функция будет работать именно с str а не со своей локальной переменной, т.е. после отработки функции str поменяет свое значение, если я изменю его в функции. Но как сделать это с функцией с пер. числом параметров?
Попытался сделать:

void main void
{
char *str; str = "h";
test(1, &str);
}

Однако str не изменился на "g".
Re: Функция с переменным числом параметров
От: Анатолий Широков СССР  
Дата: 29.11.05 09:52
Оценка: 3 (2)
void test (int first, ... )
{
    va_list list;
    va_start(list, first);
    char *buf = va_arg(list, char *);
    strcpy(buf, "g"); 
}

void main()
{
   char str[32] = {0};
   test(1, &str);
}
Re[2]: Функция с переменным числом параметров
От: Анатолий Широков СССР  
Дата: 29.11.05 09:54
Оценка:
Работа над ошибками:
<-- test(1, &str);
--> test(1, str);
Re: Функция с переменным числом параметров
От: andrij Украина  
Дата: 29.11.05 09:57
Оценка: 2 (1)
On Tue, 29 Nov 2005 11:46:34 +0200, wrote:

> Я использую функцию с переменным числом параметров, например такую:

> void test (int first, ... )
> {
> va_list list;
> va_start(list, first);
> char *buf = va_arg(list, char *);
> buf = "g";
> }
>
> В обычной функции если я передам в функцию в одном из параметров адрес переменной( &str) то функция будет работать именно с str а не со своей локальной переменной, т.е. после отработки функции str поменяет свое значение, если я изменю его в функции. Но как сделать это с функцией с пер. числом параметров?
> Попытался сделать:
>
> void main void
> {
> char *str; str = "h";

/*
Вы лутше обратите внимание на то что написали — ви передаете не
char * a char **, а всередине интрпретируете ево как
char * — ошиПка — вы трете гдето пам'ять изменяя ето значение
*/

> // test(1, &str); — ERROR !!!

test(1, str); // — так должно работать
> }
>
> Однако str не изменился на "g".
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re[3]: Функция с переменным числом параметров
От: Аноним  
Дата: 29.11.05 10:01
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Работа над ошибками:

АШ><-- test(1, &str);
-->> test(1, str);


Спасибо тебе и andrij за ответ.
Re[3]: Функция с переменным числом параметров
От: night_beast СССР  
Дата: 29.11.05 10:16
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Работа над ошибками:

АШ><-- test(1, &str);
-->> test(1, str);

и не забудем va_end (list) в конце поставить
Re[2]: Функция с переменным числом параметров
От: Аноним  
Дата: 29.11.05 10:19
Оценка:
Здравствуйте, andrij, Вы писали:

>> Попытался сделать:

>>
>> void main void
>> {
>> char *str; str = "h";

A> /*

A> Вы лутше обратите внимание на то что написали — ви передаете не
A> char * a char **, а всередине интрпретируете ево как
A> char * — ошиПка — вы трете гдето пам'ять изменяя ето значение
A> */

>> // test(1, &str); — ERROR !!!

A> test(1, str); // — так должно работать

Не работает. Если просто передаю str, то прога просто умирает с предложением послать отчет в Майкрософт
Выше был вариант завести str как str[32] — тогда работает. Но как сделать, если str надо завести именно как указатель?
Re[3]: Функция с переменным числом параметров
От: ekamaloff Великобритания  
Дата: 29.11.05 10:23
Оценка:
Здравствуйте, Аноним, Вы писали:

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


>>> Попытался сделать:

>>>
>>> void main void
>>> {
>>> char *str; str = "h";

A>> /*

A>> Вы лутше обратите внимание на то что написали — ви передаете не
A>> char * a char **, а всередине интрпретируете ево как
A>> char * — ошиПка — вы трете гдето пам'ять изменяя ето значение
A>> */

>>> // test(1, &str); — ERROR !!!

A>> test(1, str); // — так должно работать

А>Не работает. Если просто передаю str, то прога просто умирает с предложением послать отчет в Майкрософт

А>Выше был вариант завести str как str[32] — тогда работает. Но как сделать, если str надо завести именно как указатель?

Потому-что память для str не выделяешь.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Функция с переменным числом параметров
От: Аноним  
Дата: 29.11.05 10:24
Оценка:
Здравствуйте, night_beast, Вы писали:

_>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>Работа над ошибками:

АШ>><-- test(1, &str);
-->>> test(1, str);

_>и не забудем va_end (list) в конце поставить

Про va_end то я знаю, в функции в проге он стоит. Но проблема теперь в другом — работает только если заводит str как str[32/*не важно сколько*/], а если завести как *str и потом передать в функцию как str (как посоветовал andrij) то прога вылетает с ошибкой...
Re[4]: Функция с переменным числом параметров
От: Аноним  
Дата: 29.11.05 10:25
Оценка:
Здравствуйте, ekamaloff, Вы писали:


А>>Не работает. Если просто передаю str, то прога просто умирает с предложением послать отчет в Майкрософт

А>>Выше был вариант завести str как str[32] — тогда работает. Но как сделать, если str надо завести именно как указатель?

E>Потому-что память для str не выделяешь.


Я выделил, т.е. сделал char *str = new char[50]. Тоже самое
Re[5]: Функция с переменным числом параметров
От: night_beast СССР  
Дата: 29.11.05 10:42
Оценка:
Здравствуйте, Аноним, Вы писали:

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


_>>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>>Работа над ошибками:

АШ>>><-- test(1, &str);
-->>>> test(1, str);

_>>и не забудем va_end (list) в конце поставить

А>Про va_end то я знаю, в функции в проге он стоит. Но проблема теперь в другом — работает только если заводит str как str[32/*не важно сколько*/], а если завести как *str и потом передать в функцию как str (как посоветовал andrij) то прога вылетает с ошибкой...

исходник покажи...
Re[6]: Функция с переменным числом параметров
От: Аноним  
Дата: 29.11.05 10:45
Оценка:
Здравствуйте, night_beast, Вы писали:

_>Здравствуйте, Аноним, Вы писали:


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


_>>>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>>>Работа над ошибками:

АШ>>>><-- test(1, &str);
-->>>>> test(1, str);

_>>>и не забудем va_end (list) в конце поставить

А>>Про va_end то я знаю, в функции в проге он стоит. Но проблема теперь в другом — работает только если заводит str как str[32/*не важно сколько*/], а если завести как *str и потом передать в функцию как str (как посоветовал andrij) то прога вылетает с ошибкой...

_>исходник покажи...


void test (int first, ... )
{
va_list list;
va_start(list, first);
char *buf = va_arg(list, char *);
strcpy(buf, "g");
va_end(list); 
}

void main void
{
char *str = new char[50]; str = "h";
test(1, str);
}
Re[7]: Функция с переменным числом параметров
От: night_beast СССР  
Дата: 29.11.05 11:03
Оценка:
Здравствуйте, Аноним, Вы писали:

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


_>>Здравствуйте, Аноним, Вы писали:


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


_>>>>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>>>>Работа над ошибками:

АШ>>>>><-- test(1, &str);
-->>>>>> test(1, str);

_>>>>и не забудем va_end (list) в конце поставить

А>>>Про va_end то я знаю, в функции в проге он стоит. Но проблема теперь в другом — работает только если заводит str как str[32/*не важно сколько*/], а если завести как *str и потом передать в функцию как str (как посоветовал andrij) то прога вылетает с ошибкой...

_>>исходник покажи...


А>
А>void test (int first, ... )
А>{
А>va_list list;
А>va_start(list, first);
А>char *buf = va_arg(list, char *);
А>strcpy(buf, "g");
А>va_end(list); 
А>}

А>void main void
А>{
А>char *str = new char[50];
А>str = "h";
А>


заменить на
strcpy(str, "h");


А>
А>test(1, str);
А>}
А>
Re[5]: Функция с переменным числом параметров
От: ekamaloff Великобритания  
Дата: 29.11.05 11:04
Оценка:
Здравствуйте, Аноним, Вы писали:

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



А>>>Не работает. Если просто передаю str, то прога просто умирает с предложением послать отчет в Майкрософт

А>>>Выше был вариант завести str как str[32] — тогда работает. Но как сделать, если str надо завести именно как указатель?

E>>Потому-что память для str не выделяешь.


А>Я выделил, т.е. сделал char *str = new char[50]. Тоже самое


Ага, теперь ты выделяешь, но сразу теряешь ее из-за этого присваивания: str = "h"; В другом топике правильный ответ (впрочем ты уже заценил — пасыб).
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.