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

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

Войти
Регистрация
Восстановить пароль
 
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
#1

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

08.08.2012, 17:12. Просмотров 636. Ответов 6
Метки нет (Все метки)

В функции NewWords вызывается функция correct,при отладке я не могу войти в эту функцию,к тому же потом не выводится элементы объекта класса words и ID
в программе на данный момент вызываются лишь 2 функции,которые я привёл
класс Dictionary
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef DICTIONARY_H
#define DICTIONARY_H
#include "StdAfx.h"
 
class Dictionary
{
    public:
    
    Dictionary(char *nameOfFile = NULL,int Amount = 0);
 
    bool NewWords();
    void correct(string id);
    bool LoadID();
    bool WriteID(int);
 
    char *NameOfFile;
    int Amount;
    vector<string> words;
    vector<string> ID;
};
#endif DICTIONARY_H

NewWords
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
bool Dictionary::NewWords()
{
    setlocale(0,"");
 
    cout << "Введите:" << endl;
    cout << "1 - для добавления нового слова" << endl;
    cout << "0 - для выхода из программы" << endl;
 
    bool choise = false;
    bool repeat = false;
 
    string word;
    string id_of_word;
 
 
    cin >> choise;
 
            while(choise)
            {
                cout << "Введите слово" << endl;
 
                cin >> word;
                cout << "Введите ID:" << endl;
                if(!repeat)
                {
                cout << "Значения должны быть в диапазоне от 0 до 255" << endl;
                cout << "Пример:125.0.12.369" << endl;
                repeat = true;
                }
 
                cin >> id_of_word;
 
                id_of_word += ".";
 
                correct(id_of_word);
            
                this->words.push_back(word);
 
                this->Amount++;
 
                cout << "Введите:" << endl;
                cout << "1 - для добавления нового слова" << endl;
                cout << "0 - для выхода из режима записи слов" << endl;
 
                cin >> choise;
            }
 
        return true;
}

correct
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void Dictionary::correct(string id)
{
    int digit = 0;
    int temp;
    int degree;
    int position = 0;
    string Temp_ID;
 
    for(unsigned int i = 0;i < id.size();i++)
        if(id.at(i) == '.')
        {
            if(position == 0)
            {
                degree = i-1;
 
                for(unsigned int k = position;k < i;k++)
                {
                    temp = id.at(k);
                    digit += temp*pow(10.0,degree);
                    degree--;
                }
 
                Temp_ID += digit;
                Temp_ID += ".";
 
                digit = 0;
                position = i + 1;
            }
            else
            {
                degree = i - position - 1;
 
                for(unsigned int k = position;k < i;k++)
                {
                    temp = id.at(k);
                    digit += temp*pow(10.0,degree);
                    degree--;
                }
 
                Temp_ID += digit;
                Temp_ID += ".";
 
                digit = 0;
                position = i + 1;
            }
        }
 
 
    this->ID.push_back(Temp_ID);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2012, 17:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при вызове функции (C++):

Ошибка при вызове функции - C++
Ошибка в строке 90, при пошаговом выполнении она появляется при вызове функции, до захода в нее, хотя список сформирован правильно, т.к. до...

Ошибка при вызове функции - C++
Добрый день! Есть функция по расчету детерминанта int _det(int size,double **arr,double &amp;det) { int i,j,k; det=1; double b; ...

GCC ошибка при вызове функции - C++
Здравствуйте. Проблема в следующем: при вызове функции sub из тела add выдается ошибка. http://puu.sh/3bFZj.png Путем экспериментов...

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

Ошибка при вызове виртуальной функции в производном классе - C++
Здравствуйте, извините, если подобная тема появлялась, но либо у меня руки не от туда растут, либо ее небыло... проблема в следующем:...

Непонятная ошибка при вызове функции от тут же создаваемого объекта - C++
Ошибка появляется в строке 42: #include &quot;list.h&quot; #include &lt;iostream&gt; using namespace std; int menu() { system(&quot;cls&quot;); ...

6
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.08.2012, 20:45 #2
Цитата Сообщение от alexey31415 Посмотреть сообщение
при отладке я не могу войти в эту функцию
Что это значит? У меня ваш код работает. Функция correct срабатывает. words и ID выводятся. ID выводится неправильно.
0
Миниатюры
Ошибка при вызове функции  
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
08.08.2012, 20:58 #3
А что вообще должна делать эта функция correct()? В частности, этот код:
C++
1
2
3
4
5
6
for(unsigned int k = position;k < i;k++)
{
   temp = id.at(k);
   digit += temp*pow(10.0,degree);
   degree--;
}
А то я мелкими преобразованиями уже свёл весь код функции до:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Dictionary::correct(string id)
{
    int position = 0;
    string Temp_ID;
 
    for(unsigned int i = 0;i < id.size();i++)
        if(id.at(i) == '.')
        {
                for(unsigned int k = position;k < i;k++)
                {
                    Temp_ID += id.at(k);
                }
                Temp_ID += ".";
                position = i + 1;
        }
    ID.push_back(Temp_ID);
}
То есть это можно уже упростить до
C++
1
2
3
4
void Dictionary::correct(string id)
{
    ID.push_back(id);
}

Не по теме:

P.S. В качестве примера указан 125.0.12.369 . Разве 369 входит в диапазон от 0 до 255?

1
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.08.2012, 21:06 #4
Прежний ваш вариант correct(), насколько я помню, возвращал bool. Сейчас как проверяется корректность ввода ID?

Добавлено через 1 минуту
Цитата Сообщение от elivin Посмотреть сообщение
А что вообще должна делать эта функция correct()?
Определение значения переменной в цикле

Добавлено через 2 минуты
И мелкое:
C++
1
2
3
4
.............................................
cout << "Значения должны быть в диапазоне от 0 до 255" << endl;
                cout << "Пример:125.0.12.369" << endl;
........................................................................
369 не в диапазоне.
1
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
08.08.2012, 21:45  [ТС] #5
Цитата Сообщение от elivin Посмотреть сообщение
for(unsigned int k = position;k < i;k++)
{
* *temp = id.at(k);
* *digit += temp*pow(10.0,degree);
* *degree--;
}
например,я ввёл 125.2.0.0
теперь в этом коде(когда найдена первая точка) я беру 1 и умножаю её на 10 в степени 2,потом 2 на 10 в 1 степени и 5 на 10^0 и получаю число
Цитата Сообщение от elivin Посмотреть сообщение
Разве 369 входит в диапазон от 0 до 255?
то я написал случайно,конечно не в диапазоне

Цитата Сообщение от alsav22 Посмотреть сообщение
Сейчас как проверяется корректность ввода ID?
пока никак,пока нужно,чтоб код работал

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

Добавлено через 10 минут
спасибо elivin
теперь у меня такой вопрос,почему при отладке я не вхожу в функцию,а открывается файл xstring и почему у меня не выодятся ID и слова

Добавлено через 2 минуты
в файле xstring меня направляет на этот код
как я понял,это конструктор копии,так как я передаю строку,как параметр функции
C++
1
2
3
4
5
6
    basic_string(const _Myt& _Right)
        : _Mybase(_Right._Alval)
        {   // construct by copying _Right
        _Tidy();
        assign(_Right, 0, npos);
        }
0
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
08.08.2012, 21:55 #6
Что ж, посмотрел тему, написал так:
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
bool Dictionary::correct(string id)
{
    int ch, pr=0;
    for (unsigned int i = 0; i < id.size(); i++)
    {
        int j;
        ch=0;
        for (j = 0; j < 4; j++)
        {
            if (id.at(i+j)=='.')
                break;
            if (id.at(i+j)<'0' || id.at(i+j)>'9')
                return false;
            ch*=10;
            ch+=id.at(i+j)-'0';
            if (j == 3 && id.at(i+j) != '.')
                return false;
        }
        i+=j;
        if (ch>255 || ch<0)
            return false;
        pr++;
    }
    if (pr != 4)
        return false;
    ID.push_back(id);
    return true;
}
Вроде всё работает.
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
09.08.2012, 02:34  [ТС] #7
вот мой нынешний вариант
функция работает,теперь вопрос лишь в том почему не выводятся слова и их айди
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
bool Dictionary::correct(string &id)
{
    int position = 0;
    string Temp_ID;
 
    for(unsigned int i = 0;i < id.size();i++)
        if(id.at(i) == '.')
        {
            for(unsigned int k = position;k < i;k++)
            {
                //если есть символы,отличные от цифр-выходим из функции
                if(!isdigit(id.at(k)))
                    return false;
                //исключаем запись наподобие 02.003.3.4
                if(id.at(k) == '0' && id.at(k+1) != '.')
                    return false;
 
                Temp_ID += id.at(k);
            }
 
                Temp_ID += ".";
                position = i + 1;
        }
 
    id = Temp_ID;
 
    return true;
}
Добавлено через 3 часа 0 минут
вот собственно функция вывода данных(забыл выложить)
C++
1
2
3
4
5
6
7
8
void Dictionary::Print()
{
    for(int i = 0;i < this->Amount;i++)
    {
        cout << this->words.at(i) << endl;
        cout << this->ID.at(i) << endl;
    }
}
Добавлено через 1 час 11 минут
всё работает,если интересно,расскажу в чём дело было
я записывал слова в конец вектора,а выводил слова с начала и столько,сколько у меня было слов,поэтому записав одно слово я выводил первый элемент вектора,а там естественно ничего нет
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2012, 02:34
Привет! Вот еще темы с ответами:

Ошибка при вызове функции transform с функцией, в качестве аргумента - C++
Здравствуйте! Хочу перевести строку в нижний\верхний регистр, используя готовые алгоритмы. Пишу так: transform(str1.begin(),...

Ошибка при вызове функции добавления нового элемента в массив - C++
Описывается класс Datchik. Затем в классе Lists объявляется массив объектов класса датчик и описывается функция NewDatchik добавления...

Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов - C++
Добрый вечер всем! При изучении и написании работы столкнулся с ошибкой от которой не могу избавиться. (Т.к. очень сильно плаваю в ООП)....

При вызове метода функционального объекта в шаблонной функции ошибка компиляции C2039 - C++
Объект класса Entry - это запись в журнале экзаменационной сессии: номер зачетки, фамилия, курс, группа, дисциплина, оценка. В задаче есть...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
09.08.2012, 02:34
Ответ Создать тему
Опции темы

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