Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
#1

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

07.10.2015, 22:18. Просмотров 314. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка при написании функции с неизвестным числом параметров (C++):

Передача параметров указателями при написании функций - C++
Как написать вот такую программу : Вычислить и запомнить суммы положительных элементов каждой строки матрицы a(10,20), b(15,10)....

Функции с переменным числом параметров - C++
функции с переменным числом параметров в качестве параметра форматная строка,как задать это дело в Cи и что можно сказать преподу

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

Функции с переменным числом параметров - C++
Написать функцию max с переменным числом параметров, которая находит минимальное из чисел типа int или из чисел типа double, тип параметров...

Функции с переменным числом параметров - C++
Написать функцию sum с переменным числом параметров, которая находит сумму чисел типа int по формуле: S=a1*a2+a3*a4+a5*a6+. . . . . ...

Функции с переменным числом параметров - C++
Прошу помочь знатоков С++ в решении задачи, т.к. только начал изучать данный язык. Решить задачу, используя функции с переменным...

10
Evg
Эксперт CАвтор FAQ
18913 / 6872 / 503
Регистрация: 30.03.2009
Сообщений: 19,347
Записей в блоге: 30
07.10.2015, 22:31 #2
C++
#include <cstdarg>
Добавлено через 1 минуту
Только твой код всё равно работать не будет. Отладь его сначала без vararg'ов
1
anti-k
227 / 75 / 23
Регистрация: 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
18913 / 6872 / 503
Регистрация: 30.03.2009
Сообщений: 19,347
Записей в блоге: 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 / 23
Регистрация: 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
Ушел
13777 / 8027 / 926
Регистрация: 27.09.2012
Сообщений: 19,778
Записей в блоге: 3
Завершенные тесты: 1
08.10.2015, 10:03 #6
Цитата Сообщение от anti-k Посмотреть сообщение
Можно личный вопрос, вы вообще реальный человек(в смысле я читаю ваши блоги, предполагал что вы робот )
обласкал
Робот Evg мыслит. Ему алгоритм, сам Тьюринг писал
0
anti-k
227 / 75 / 23
Регистрация: 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
6203 / 5514 / 1931
Регистрация: 14.04.2014
Сообщений: 23,152
08.10.2015, 10:28 #8
Строки 14 и 15 местами поменяй.
1
Croessmah
Ушел
13777 / 8027 / 926
Регистрация: 27.09.2012
Сообщений: 19,778
Записей в блоге: 3
Завершенные тесты: 1
08.10.2015, 10:29 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
18913 / 6872 / 503
Регистрация: 30.03.2009
Сообщений: 19,347
Записей в блоге: 30
08.10.2015, 12:29 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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 / 23
Регистрация: 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
Привет! Вот еще темы с ответами:

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

Функции с переменным числом параметров - C++
Помогите пожалуйста исправить ошибку в программе!!! Проблема в том, что не учитывается степень разряда при переводе в восьмеричную...

Функции с переменным числом параметров - C++
Подскажите как работают функции с переменным числом параметров, как их составлять. Почитал немного в инете про это, кажется только больше...

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


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

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

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