powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема в коде С++
33 сообщений из 33, показаны все 2 страниц
проблема в коде С++
    #39418581
benao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,

Есть код, подскажите пожалуйста почему программа падает в Segmentation Fault
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <iostream>

using namespace std;

int main()
{
    //cout << "Hello World!" << endl;

    string str("SignificaNce");
    unsigned int count = 0 ;

    for(auto i = str.size() - 1; i>=0; --i)
    {

        count +=static_cast<int>(str[i]>'i');

    }

    cout << count<<endl;


    return 0;
}
...
Рейтинг: 0 / 0
проблема в коде С++
    #39418622
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
benao,

auto -> size_t (unsigned)
...
Рейтинг: 0 / 0
проблема в коде С++
    #39418691
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
benao,

Код: plaintext
1.
for(auto i = str.size() - 1; i>=0; --i)



str.size() возвращает беззнаковое целое, оно всегда больше или равно нулю,
таким образом, ты написал бесконечный цикл, который сначала вызывает отрицательное переполнение
при --i, перескакивая с 0 на UINT_MAX, затем обращается по этому индексу к str[i], где, конечно же,
такого элемента нет. Происходит выход за границы массива и защита памяти.

Надо либо использовать целый со знаком индекс, либо изменить условие на

Код: plaintext
1.
for(auto i = str.size(); i>0; --i)



и в теле цикла использовать i-1
...
Рейтинг: 0 / 0
проблема в коде С++
    #39418752
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
    for(auto i = str.size() - 1; i>=0; --i)

всё таки бездумное использование auto - зло. Чего его повсюду стали пихать неокрепшие умы? Откуда эти ноги растут?
...
Рейтинг: 0 / 0
проблема в коде С++
    #39418978
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
безумное использование - вообще зло...
...
Рейтинг: 0 / 0
проблема в коде С++
    #39419089
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, хорошо-бы в отладочном режиме понапихать ассертов. Я имею в виду библиотечном коде конечно.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39419416
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychвсё таки бездумное использование auto - злоа было бы неплохо в IDE иметь такую фичу: автоматическую подстановку-замену auto на реальный тип. Иногда просто лень набирать 40-50 букв...
...
Рейтинг: 0 / 0
проблема в коде С++
    #39419462
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychвсё таки бездумное использование auto - зло. Чего его повсюду стали пихать неокрепшие умы? Откуда эти ноги растут?
А решалось это дело очень просто: достаточно было запретить превращение auto в "простые" типы. И всё. Нет никаких проблем.
...
Меня сейчас освистают и зафукают и скажут, что и так нет никаких проблем. Только вот пример ТС доказывает обратное. Я не против нововведений в языке (хотя на мой взгляд проще и понятнее(!) было бы сделать какой-нибудь C-next), я против бездумных нововведений. Какое было бы "думным"? Смотрите предыдущий абзац.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39419805
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_originalegorychвсё таки бездумное использование auto - зло. Чего его повсюду стали пихать неокрепшие умы? Откуда эти ноги растут?
А решалось это дело очень просто: достаточно было запретить превращение auto в "простые" типы. И всё. Нет никаких проблем.
...
Меня сейчас освистают и зафукают и скажут, что и так нет никаких проблем. Только вот пример ТС доказывает обратное. Я не против нововведений в языке (хотя на мой взгляд проще и понятнее(!) было бы сделать какой-нибудь C-next), я против бездумных нововведений. Какое было бы "думным"? Смотрите предыдущий абзац.

Я думаю, всё же проблема НЕ в auto , а в том, как автор его использовал.
Ошибка-то не в объявлении параметра цикла, а в условии выхода из цикла.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39419812
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_originalА решалось это дело очень просто: достаточно было запретить превращение auto в "простые" типы. И всё. Нет никаких проблем.и таким образом сразу исключаем простые типы из обобщённых алгоритмов, действительно, зачем они там)))
...
Рейтинг: 0 / 0
проблема в коде С++
    #39419819
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЯ думаю, всё же проблема НЕ в auto , а в том, как автор его использовал.
Ошибка-то не в объявлении параметра цикла, а в условии выхода из цикла.да, я именно об этом. Написать size_t не многим сложнее, чем auto, зато сразу было бы видно, где порылся конь.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39419906
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychMasterZivЯ думаю, всё же проблема НЕ в auto , а в том, как автор его использовал.
Ошибка-то не в объявлении параметра цикла, а в условии выхода из цикла.да, я именно об этом. Написать size_t не многим сложнее, чем auto, зато сразу было бы видно, где порылся конь.
int еще проще было написать, и даже бы работало =)
...
Рейтинг: 0 / 0
проблема в коде С++
    #39419931
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl int еще проще было написать, и даже бы работало =)варнинг только какой-то непонятный был бы, ну да кто же их читает =)
...
Рейтинг: 0 / 0
проблема в коде С++
    #39420338
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSiemargl int еще проще было написать, и даже бы работало =)варнинг только какой-то непонятный был бы, ну да кто же их читает =)Бывает.
На меня на Хабре как то напал маньяк, размахивал транспарантом с надписью -pedantic-errors и угрожал связями с комитетом по стандартизации =)
...
Рейтинг: 0 / 0
проблема в коде С++
    #39420355
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychда, я именно об этом. Написать size_t не многим сложнее, чем auto, зато сразу было бы видно, где порылся конь.
Тем кому сразу видно, тем и с авто видно. А остальным не поможет.
Так что не надо перекладывать с больной головы на здоровую.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39420411
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТем кому сразу видно, тем и с авто видно.это здесь видно, в коде из 3х строчек. С size_t читать код было бы проще, не надо за компилятор выполнять работу по расшифровке этого auto. Второй раз вижу тему, где его неуместное использование приводит к её ( темы ) появлению. И оба раза то char, то size_t. Удивительно мне это
...
Рейтинг: 0 / 0
проблема в коде С++
    #39420635
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

А сколько было тем, когда программа падает потому что чувак выходил за границы массива. Предлагаю запретить массивы ))
...
Рейтинг: 0 / 0
проблема в коде С++
    #39420659
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПредлагаю запретить массивы ))Предлагаю запретить! =))

PS я ведь не против auto, есичё
...
Рейтинг: 0 / 0
проблема в коде С++
    #39421127
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl int еще проще было написать, и даже бы работало =)кстати, да о_О

а почему бы не запретить auto везде кроме шаблонов, где без них никак?
...
Рейтинг: 0 / 0
проблема в коде С++
    #39421214
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

Например, потому что лень писать

Код: plaintext
1.
std::map< std::string, std::tuple< int, unsigned, double> >::const_iterator p = my_map.find( ... );
...
Рейтинг: 0 / 0
проблема в коде С++
    #39421285
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivлень писать
Дело не только в лени, но и в отсутствии опечаток и главное - в обобщенности алгоритма.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39421310
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНапример, потому что лень писатьAnatoly MoskovskyДело не только в лени, но и в отсутствии опечаток и главное - в обобщенности алгоритма.using?
...
Рейтинг: 0 / 0
проблема в коде С++
    #39421355
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbusing?
Локальность кода хуже.
Да и вообще объявлять отдельно тип который в большинстве случаев нужен только для временной переменной - как то из пушек по воробьям.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39422766
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЛокальность кода хуже.что такое локальность кода хуже?Anatoly MoskovskyДа и вообще объявлять отдельно тип который в большинстве случаев нужен только для временной переменной - как то из пушек по воробьям.если тип используется 1-2 раза, то написал полностью и забыл, да, нет смысла в using. Если же постоянно - очень даже удобно.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39424503
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivbenao,

Код: plaintext
1.
for(auto i = str.size() - 1; i>=0; --i)



str.size() возвращает беззнаковое целое, оно всегда больше или равно нулю,
таким образом, ты написал бесконечный цикл, который сначала вызывает отрицательное переполнение
при --i, перескакивая с 0 на UINT_MAX,Точнее, на std::numeric_limits<size_t>::max().

egorychPS я ведь не против auto, есичёА я против. auto часто означает «программисту было лень написать тип». Облегчает написание кода, но усложняет его чтение. Особенно когда нет умной IDE (смотрим историю изменения кода в системе контроля версий; смотрим код в online-репозитории). Хотя в некоторых случаях без auto не обойтись, например когда надо лямбда-функцию сохранить в локальную переменную:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void work_with_points(double tolerance) {
  // не можем написать тип, потому что он сгенерирован компилятором
  auto almost_equal = [=](double a, double b) {return fabs(a - b) <= tolerance;};
  ...
  if (almost_equal(x1, x2) && almost_equal(y1, y2)) {
    ...
  }
  ...
}


MasterZivCEMb,

Например, потому что лень писать

Код: plaintext
1.
std::map< std::string, std::tuple< int, unsigned, double> >::const_iterator p = my_map.find( ... );

typedef-ы надо использовать. Кстати, tuple -- аналогичное зло, означает «программисту было лень придумать имена полей». Опять же, облегчает написание кода, но усложняет его чтение.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39424508
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовКстати, tuple -- аналогичное зло, означает «программисту было лень придумать имена полей».Не всегда, иногда бывает, надо вернуть пару-тройку значений из функции(хотя тут можно долго спорить про архитектуру). Если это делается один раз, нет смысла заводить под это структуру, да и вообще это не всегда логично. Я бы ещё хотел вообще новый синтаксис, когда принимаемые значения можно было бы слева от функции через запятую указать
tuple тут не совсем красиво смотрится, передача переменных в функцию для возвращаемых значений тоже смотрится не очень, потому что:Пётр СедовОпять же, облегчает написание кода, но усложняет его чтение.наоборот же, возвращаемые значения слева, входящие справа. Без tuple приходится все их в куче писать справа (до сих пор так и делаю)
...
Рейтинг: 0 / 0
проблема в коде С++
    #39425081
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbиногда бывает, надо вернуть пару-тройку значений из функцииДа. В стандартной библиотеке C++ такое встречается:
Код: plaintext
1.
2.
3.
div_t dr = div(item_index, cols_count);
int row = dr.quot;
int col = dr.rem;

Код: plaintext
1.
2.
3.
4.
5.
6.
typedef map<string, int> items_t;
items_t items;
pair<items_t::iterator, bool> ir = items.insert(items_t::value_type("green", 3));
if (ir.second) { // и что тут проверяется?
  ...
}

И какой код понятнее?
...
Рейтинг: 0 / 0
проблема в коде С++
    #39425279
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне несколько притит такая логика "ага, привело к ошибке - запретить!". это глупо. я люблю с++ именно за то, что такого здеть нет. вот только за последствия несешь ответственность сам. проблемы нужно решать головой, а не перекладывать свою работу на компилятор.
к тому же такой подход не решает проблем. если есть возможность написать код, есть возможность написать плохой код.
если кто-то не хочет думать, ему придется огребать от своего кода. по коду сразу видно какого уровня специалист.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39426202
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовИ какой код понятнее?первый, но во втором все необходимые объявления приведены, а в первом описание структуры пропущено :)
ещё понятнее как-нибудь так:
Код: plaintext
1.
int {row, col} = div(item_index, cols_count);

:)
alexy_blackпроблемы нужно решать головой, а не перекладывать свою работу на компилятор.при этом, что ещё нравится в плюсах: если хочется, то можно и переложить работу на компилятор.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39426531
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbПётр СедовИ какой код понятнее?первый, но во втором все необходимые объявления приведены, а в первом описание структуры пропущено :)Хорошо, на одну строку кода больше:
Код: plaintext
1.
struct div_t {int quot, rem;};


CEMbещё понятнее как-нибудь так:
Код: plaintext
1.
int {row, col} = div(item_index, cols_count);

:)При такой записи нет явного указания, что row -- частное, а col -- остаток. В случае div очевидно, что она возвращает пару {частное, остаток}, а с другими функциями может быть неочевидно.
...
Рейтинг: 0 / 0
проблема в коде С++
    #39426861
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbalexy_blackпроблемы нужно решать головой, а не перекладывать свою работу на компилятор.при этом, что ещё нравится в плюсах: если хочется, то можно и переложить работу на компилятор.я за то, чтобы один раз решить, в каком-нибудь классе, и использовать его :)
...
Рейтинг: 0 / 0
проблема в коде С++
    #39426870
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbtuple
кортеж
...
Рейтинг: 0 / 0
проблема в коде С++
    #39428531
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivибо использовать целый со знаком индекс, либо изменить условие и в теле цикла использовать i-1

Костыли-костылики.

А ведь проблема итерации с конца к началу для беззнаковых давно решена. Безо всяких уродливых i-1.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема в коде С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]