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

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

Восстановить пароль Регистрация
 
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
08.08.2012, 17:12     Ошибка при вызове функции #1
В функции 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);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.08.2012, 20:45     Ошибка при вызове функции #2
Цитата Сообщение от alexey31415 Посмотреть сообщение
при отладке я не могу войти в эту функцию
Что это значит? У меня ваш код работает. Функция correct срабатывает. words и ID выводятся. ID выводится неправильно.
Миниатюры
Ошибка при вызове функции  
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?

alsav22
5282 / 4801 / 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 не в диапазоне.
alexey31415
 Аватар для 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);
        }
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;
}
Вроде всё работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2012, 02:34     Ошибка при вызове функции
Еще ссылки по теме:

C++ Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов
Ошибка при вызове функции добавления нового элемента в массив C++
C++ Ошибка при вызове функции transform с функцией, в качестве аргумента

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

Или воспользуйтесь поиском по форуму:
alexey31415
 Аватар для 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 минут
всё работает,если интересно,расскажу в чём дело было
я записывал слова в конец вектора,а выводил слова с начала и столько,сколько у меня было слов,поэтому записав одно слово я выводил первый элемент вектора,а там естественно ничего нет
Yandex
Объявления
09.08.2012, 02:34     Ошибка при вызове функции
Ответ Создать тему
Опции темы

Текущее время: 03:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru