Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
1

Ошибка при написании функции с неизвестным числом параметров

07.10.2015, 22:18. Просмотров 842. Ответов 10
Метки нет (Все метки)

Ругается на va_start не могу понять за что)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
#include<cstring>
 
using namespace std;
char*foo(int n, ...);
int main(){
    
    char*ch="djcbkjanslkmsldkcmlkzmc";  
   
    
    char*che="dvkjsdkvnksjdnvknsdbckjbsv";
    
    
    char*che1="sdkhvkjsdcnlksdnslknclksdnvcmsdlkjbvn";
    
    
    char*chee;
    
    chee=foo(3,ch,che);
    return 0;
}
char*foo(int n, ...){
    char*ch;
    va_list argptr;
    va_start (argptr, n);
    ch=strcat(va_arg(argptr,char*),va_arg(argptr,char*));
    
    return ch;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2015, 22:18
Ответы с готовыми решениями:

Ошибка в функции с переменным числом параметров
Доброго времени суток. Необходимо написать функцию с переменным числом...

Передача параметров указателями при написании функций
Как написать вот такую программу : Вычислить и запомнить суммы положительных...

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

Функции с переменным числом параметров
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; int max(int k,...) { int *p=&amp;k;...

Функции с переменным числом параметров
помогите доработать пожалуйсто Написать функцию kvadr с переменным числом...

10
Evg
Эксперт CАвтор FAQ
19358 / 7207 / 538
Регистрация: 30.03.2009
Сообщений: 20,150
Записей в блоге: 30
07.10.2015, 22:31 2
C++
#include <cstdarg>
Добавлено через 1 минуту
Только твой код всё равно работать не будет. Отладь его сначала без vararg'ов
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
07.10.2015, 22:45  [ТС] 3
Evg,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
#include<cstring>
#include<cstdarg>
using namespace std;
char*foo(char*, ...);
int main(){
    
    char*ch="djcbkjanslkmsldkcmlkzmc";  
   
    
    char*che="dvkjsdkvnksjdnvknsdbckjbsv";
    
    
    char*che1="sdkhvkjsdcnlksdnslknclksdnvcmsdlkjbvn";
    
    
    char*chee;
    
    chee=foo(chee,ch,che,che);
    cout<<"\n"<<chee;
    return 0;
}
char*foo(char*ch, ...){
    
    va_list argptr;
    va_start (argptr,ch);
    strcat(ch,va_arg(argptr,char*));
    va_end(argptr);
    return ch;
}
Вот так наверное? Можно личный вопрос, вы вообще реальный человек(в смысле я читаю ваши блоги, предполагал что вы робот )

Добавлено через 2 минуты
Evg, Пользуясь случаем, почему оно на va_list не ругалось? И зачем нужен va_end??
0
Evg
Эксперт CАвтор FAQ
19358 / 7207 / 538
Регистрация: 30.03.2009
Сообщений: 20,150
Записей в блоге: 30
08.10.2015, 09:48 4
Цитата Сообщение от anti-k Посмотреть сообщение
вы вообще реальный человек
Нет, конечно

Цитата Сообщение от anti-k Посмотреть сообщение
Пользуясь случаем, почему оно на va_list не ругалось?
"Оно" это кто?

Цитата Сообщение от anti-k Посмотреть сообщение
И зачем нужен va_end?
Все макросы на тему vararg'ов являются машинно-зависимыми. Возможно, что на некоторых машинах требуются завершающие действия, но я таких машин не знаю. Скорее всего разработчики языка подстраховались на все случаи жизни. Возможно, что это нужно для оптимизаций - после токи va_end компилятор вправе ожидать, что не будет непонятных обращений в стек за переменными, которые в текущей функции неизвестны

Добавлено через 46 секунд
Цитата Сообщение от anti-k Посмотреть сообщение
Вот так наверное?
Проблема в том, что во все указатели у тебя присвоены строковые литералы. И попросту нет дополнительной памяти, куда можно было бы strcat'ом дописать остаток строки
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
08.10.2015, 09:51  [ТС] 5
Evg,
Итоговый вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
#include<cstring>
#include<cstdarg>
using namespace std;
char *foo(char* ,int, ...);
int main(){
    
  char* ch=new char[80]();
  char*che="d ";  
  char*che1="a d a";
  char*che2="  l i f e";
 
  ch=foo(ch,3,che,che1,che2);
  cout<<ch;
    
    return 0;
}
char* foo(char* ch,int n, ...){
    
    va_list argptr;
    va_start (argptr,n);
 
    for(;n;n--)
    strcat(ch,va_arg(argptr,char*));
 
    va_end(argptr);
    return ch;
}
Сегодня у меня д.р. Общение с вами какбэ подарок )))
0
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
08.10.2015, 10:03 6
Цитата Сообщение от anti-k Посмотреть сообщение
Можно личный вопрос, вы вообще реальный человек(в смысле я читаю ваши блоги, предполагал что вы робот )
обласкал
Робот Evg мыслит. Ему алгоритм, сам Тьюринг писал
0
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
08.10.2015, 10:07  [ТС] 7
Croessmah, Мое почтение ))

Добавлено через 1 минуту
Croessmah,
Не могли бы вы глянуть вот этот вот момент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
    char ch[]="mama, mila ramy! Rama mila - mamy";
    
    char*ptr=strtok(ch,",.!- ");    
    char che[6][20]={'0'};
    int i=0;
    
    while(ptr!=NULL){
        cout<<ptr<<"\n"<<endl;
        ptr=strtok(NULL,",.!- ");
        strcpy(che[i][20],*ptr);
        i++;        
    }
 
 
    return 0;
}
0
nmcf
6515 / 5744 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
08.10.2015, 10:28 8
Строки 14 и 15 местами поменяй.
1
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
08.10.2015, 10:29 9
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

C++
1
2
3
4
5
6
    while(ptr!=NULL){
        strcpy(che[i],ptr);
        i++;
        cout<<ptr<<"\n"<<endl;
        ptr=strtok(NULL,",.!- ");
    }
1
Evg
Эксперт CАвтор FAQ
19358 / 7207 / 538
Регистрация: 30.03.2009
Сообщений: 20,150
Записей в блоге: 30
08.10.2015, 12:29 10
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Цитата Сообщение от anti-k Посмотреть сообщение
Итоговый вариант
Теперь всё правильно

Добавлено через 2 минуты
Вообще полезно научиться работать с функциями последовательного обхода через for:

C
for (ptr=strtok(ch,",.!- ");
     ptr != NULL;
     ptr=strtok(NULL,",.!- "))
{
  strcpy(che[i],ptr);
  i++;
  cout<<ptr<<"\n"<<endl;
}
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
08.10.2015, 14:36  [ТС] 11
Evg,
Цитата Сообщение от Evg Посмотреть сообщение
or (ptr=strtok(ch,",.!- ");
* * *ptr != NULL;
* * *ptr=strtok(NULL,",.!- "))
{
* strcpy(che[i],ptr);
* i++;
* cout<<ptr<<"\n"<<endl;
}
Это да!!! И реально упрощает понимание кода ++ я час потратил что бы въехать что первый вызов foo(когда аргумент не NULL) будет указывать на первый элемент первой лексемы. Здесь яснее!!
0
08.10.2015, 14:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2015, 14:36

Функции с переменным числом параметров
Функция должна принимать переменное количество аргументов, последним из которых...

Функции с переменным числом параметров
Такая проблема есть код который должен выводить поочередно цифры, 1 2 3 4 5, я...

Функции с переменным числом параметров
Добрый день, уважаемые знатоки С++! Подскажите пожалуйста, что не правильно в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru