Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция вызывает ошибку системы, компилируясь без ошибок 
V
    Опции темы
jurgal
Дата 6.1.2008, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Код

void money::mstold(char *s)
{
    double d=0;
    int l = static_cast<int>(strlen(s));
    for(int i=0;i<l;i++)
    {
        if(isdigit(s[i]))
            d = d*10+s[i];
        else if(s[i]=='.')
        {
            d = d+s[i+1]/10+s[i+2]/100;
            break;
        }
    }
    m = d;   // m - переменная объекта money
    strcpy_s(str,strlen(s),s); // str - переменная объекта money

}


при выполнении функции система просит отправить рапорт об ошибке в майкрософт =)
PM MAIL   Вверх
bsa
Дата 6.1.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



ошибок в приведенном коде не нашел.
1. возможно, ты передаешь кривой указатель в качестве параметра
2. что за функцмя strcpy_s(), главное, зачем?
3. str указывает куда? память выделена?
4. если твоему методу передать "100.", то может вылететь с ошибкой. Догадайся почему (hint: обрати внимание на точку)

Это сообщение отредактировал(а) bsa - 6.1.2008, 23:11
PM   Вверх
Fazil6
Дата 7.1.2008, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(jurgal @  6.1.2008,  21:47 Найти цитируемый пост)
при выполнении функции система просит отправить рапорт об ошибке в майкрософт =)

значит нужно отправить...
PM MAIL   Вверх
jurgal
Дата 7.1.2008, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Цитата(bsa @  6.1.2008,  23:09 Найти цитируемый пост)
2. что за функцмя strcpy_s(), главное, зачем?

это безопасная функция копирования строк, средний аргумент - длина копируемой строки. С обычной strcpy() VC++ Express не работает, вернее работает, но нужно в начале указывать, чтобы компилятор не обращал внимание на эту опасную(с точки зрения компилятора) старую функцию. 


Цитата(bsa @  6.1.2008,  23:09 Найти цитируемый пост)
str указывает куда? память выделена?


char *str - закрытая переменная класса money, правда я без конструктора класс написал, может быть в этом проблема, инициализировать нулем ('\0') ? Сейчас попробую.


Цитата(bsa @  6.1.2008,  23:09 Найти цитируемый пост)
если твоему методу передать "100.", то может вылететь с ошибкой. Догадайся почему (hint: обрати внимание на точку)

спасибо) понял ошибку, если строка будет 100.  , то выйду за границы массива при увеличении индекса после точки =)


PM MAIL   Вверх
JackYF
Дата 7.1.2008, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(jurgal @  6.1.2008,  23:55 Найти цитируемый пост)
старую функцию. 

да уж,  smile а мужики-то не знают... 

Цитата(jurgal @  6.1.2008,  23:55 Найти цитируемый пост)
правда я без конструктора класс написал, может быть в этом проблема

скорее всего. Память выделить под строку надо.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 7.1.2008, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(jurgal @ 7.1.2008,  00:55)
char *str - закрытая переменная класса money, правда я без конструктора класс написал, может быть в этом проблема, инициализировать нулем ('\0') ? Сейчас попробую.

Твоя ошибка в этом месте. strcpy не выделяет память под переменную. Поэтому ты должен либо сделать str статическим массивом (char str[1000]) или перед выполнением strcpy выделять память.
Кстати, если уж на то пошло, что надо писать не strcpy_s(str, strlen(s), s), а strcpy_s(str, str_size, s), где str_size - объем выделенной памяти под str
PM   Вверх
jurgal
Дата 7.1.2008, 03:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Код

class money
{
    double m;
    char str[100];
public:
    money(){m=0; str[0]='\0';}
    void mstold(char *s);
    void disp()const
    {
        cout << m << endl;
    }

};

void money::mstold(char *s)
{
    double d=0;
    int l = static_cast<int>(strlen(s));
    for(int i=0;i<l;i++)
    {
        if(isdigit(s[i]))
            d = d*10+(s[i]);
        else if(s[i]=='.')
        {
            d = d+s[i+1]/10+s[i+2]/100;
            break;
        }
    }
    m = d;

}

int main()
{
    money mon;
    char str1[100];
    cout << "Input string: ";
    cin >> str1;
    mon.mstold(str1);
    mon.disp();


    return 0;
}


сейчас работает, но результат не правильный. strcpy_s() вообще убрал пока, чтобы не смущало =) . 

допустим если ввести 45, то результатом будет 573 , т.е. он переводит 4 по ASCII в 52, затем умножает на 10 и прибавляет к 5 переведенной через ASCII в 53 и в итоге получается 573. Что то я запутался, ведь isdigit() проверяет символ аргумент или число. Пытался функцией atoi() каждый символ который isdigit преобразовать в int, но компилятор ругается на невозможность такого преобразования. Хелп =)

Это сообщение отредактировал(а) jurgal - 7.1.2008, 03:59
PM MAIL   Вверх
Kuvaldis
Дата 7.1.2008, 04:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



Код

d = d*10+(s[i]);


Надо
Код

d = d*10+(s[i] - '0' );

Потому что код цифры и ЗНАЧЕНИЯ цифры - это разные вещи... и отличаются на 48
Для переносимости вычитаем из кода цифры код нуля (это как раз и есть 48 = 0x30 )


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1206 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.