![]() |
|
Модераторы: xvr |
![]()
|
|
| Zerstroer |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Здравствуйте, при работе программы возникает такая вот ошибка:
Путем отладки выяснил, что возникает она при вызове функции приблизительного следующего вида (лишний код я опустил для конкретики).
Конкретно, строка, на которой ошибка возникает:
Возникает ошибка при втором или третьем обращении к данной функции, что именно меня и смущает. Прошу помочь разобраться. С понятием указателя (char*) знаком, менее осведомлен в механизмах преобразования. Заранее спасибо! -------------------- In silico |
||||||
|
|||||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
strace вам в помощ
-------------------- |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
так нельзя. ты пытаешься явно преобразовать указатель на char к классу string. Нужно создать экземпляр класса string и передать ему в конструкторе указатель на char
и ещё. если ты не собираешься изменять данные по указателю input, сделай его const-овым
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| sergioK1 |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
если ты не собираешься изменять данные по указателю ? что дает const ? можно написать ++input; или (input+5)=10;
|
||||||||
|
|||||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
то, что при вызове этой функции (MyF) ей можно передать констовый указатель, и быть уверенным, что данные по этому указателю не будут изменены
если имеется в виду, что input - констовый указатель, то ++input можно, т.к. данные по указателю не изменяются, а (input+5)=10 вообще нельзя, т.к. input+5 - rvalue. если же ты имел в виду *(input+5)=10, то так тоже нельзя, т.к. если input - констовый указатель, то и (input+5) - тоже констовый указатель. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Позвольте вопрос, а почему у меня как минимум 2 раза подобный финт ушами
прокатывал? Как минимум один раз это неявное преобразование срабатывало? -------------------- In silico |
|||
|
||||
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
Zerstroer, походу ступил малёха...
в данном случае
и
одно и то же (хотя, вообще-то, предпочтительнее использовать второй вариант) может быть у тебя в случае, когда программа падает, input указывает на мусор ? или равен NULL ? распечатай input:
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
| Zerstroer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Того, что ступил - не исключаю!
Входную переменную char* input отслеживал. Но. 1. При использовании
всё работает! 2. А при использовании
всё вываливается после 2-3 прогона. Единственная предположительная догадка - input оканчивается не char(0) символом, а чем-то неведомым (насколько корректно формируется input сказать не могу - input подается из закрытого класса). -------------------- In silico |
||||
|
|||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
это я про себя говорил если
то предположение, что выглядит неправдоподобным. всё-таки так
неправильно. не должно работать. а то, что работает пару раз - так это, скорее всего, случайность -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
Не понимаю, зачем вообще использовать явное приведение?
Но похоже ошибка не здесь. это очень похоже, версия: Идет какойто очень длинный набор данных, malloc не может выделить так много и выпадает. А иногда работает, потому-что в этом потоке данных случайно встретился '\0'. Наличие или отсутствие '\0' может возникать от самых разных причин, так как строка перекрывает другие переменные, может стек, да вообще что угодно. Попробуйте вывести длину строки, перед присвоением... во всяком случае, похоже ошибка, не в том коде что вы привели, а где-то в другом. |
|||
|
||||
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
volatile,
Так, как вы сказали
точно нельзя! У меня input - указатель! В принципе, первоначальную задачу я решил. Причины, по сути - не конкретны, проще запомнить верный метод. borisbn, спосибо большое! Пошел учить специфику конструкторов/деструкторов стандартных классов. Задача выполнена. Всем спасибо! Добавлено через 3 минуты и 50 секунд Задача решена. Правильный ответ string s = string( input ); -------------------- In silico |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
||||
|
||||
| Zerstroer |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
у меня именно std::string. На синтаксис
у меня ругается компиллятор, input - не const char*, а просто char*. В конечном итоге, передача в конструктор идет способом, в первом же посте описанном borisbn
-------------------- In silico |
||||||
|
|||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
если не собираетесь менять input, объявите функцию как: string MyF(const char* input) если собираетесь string s = (const char*)input; Добавлено через 10 минут и 39 секунд это вообще кривость компилятора. |
|||
|
||||
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
input - изменяемый.
-------------------- In silico |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |