Elon
Хочется просто решать проблемы))
Гамлет
Гамлет
SexNbaKef
Тут, по факту, полезной работы не производится.
Это на поиск ошибки, код простой, я долго искал, но посчитал другое за ошибку
SexNbaKef
Так в чем ошибка то?)
Влад
; не хватает?
Влад
👀😂
SexNbaKef
; не хватает?
нет, но тоже типовая ошибка в плюсах
Влад
Ну я не вижу стандартного вызова библиотек ,эт конечно глупо ,но почему бы и нет
Гамлет
Ну я не вижу стандартного вызова библиотек ,эт конечно глупо ,но почему бы и нет
Мне кажется, не в вызове дело, там вот и класс q используется, а где его заинициализировали и откуда взяли, хз, поэтому думаю там что-то чисто для крестоносцев
SexNbaKef
https://pvs-studio.com/ru/blog/posts/csharp/0856/
SexNbaKef
очень типовая задачка с офисом, постоянно встерчается
Борисов
Так в чем ошибка то?)
В цикле создается объект 'partial_piece_info pi', потом с ним какие-то действия, а последним шагом инициализируется поле pi.blocks. А потом переход на новую итерацию и объект pi уничтожается
Борисов
Зачем инициализировать поле pi.blocks ?
SexNbaKef
Зачем инициализировать поле pi.blocks ?
Это класс, в которое есть свойство блоки
SexNbaKef
В чем здесь ошибка - я не понял
Борисов
Это класс, в которое есть свойство блоки
Это да, но действие pi.blocks = &blk[..] бессмысленное )
Борисов
Смотря что понимать под ошибкой
SexNbaKef
выброс в исключение
Борисов
Тут, скорее всего, задача не на знание синтаксиса С++
SexNbaKef
Здесь тупо найти причину ошибки
SexNbaKef
Если скажу какое исключение выдаст, сразу поймут все
Борисов
Какой ошибки ?) У тебя в примере часть кода - это '....' и объявления класса нет
Andrii
q->begin() и q->end()
Борисов
Там нет объявления q )
Борисов
В функцию заходит queue ))
Andrii
В функцию заходит queue ))
Ну... в целом не факт, что можн написать код так, что он не будет вылетать, просто переопределив всё что тебе надо
SexNbaKef
q->begin() и q->end()
вообще не понял смысл этого
Борисов
Обращение по указателю
SexNbaKef
не в том плане. Можно обращаться и используя методы класса
Влад
А почему const в конце в первой строке?
Борисов
Потому что метод класса константный
Борисов
https://ravesli.com/urok-123-klassy-i-const/#toc-1
Борисов
"Константные методы классов"
Сергей
Обращение по указателю
Ну сам то указатель q не указан
SexNbaKef
Простая ошибка, но каверзная
SexNbaKef
Ну сам то указатель q не указан
Там есть ... - какой-то текст дальше. У вас не полный фрагмент кода, ее могли переопределить как угодно
Борисов
Декремент от 0
SexNbaKef
SexNbaKef
Декремент от 0
Из-за этого будет ошибка? Нет
Борисов
Борисов
Я и написал про декремент от 0
Борисов
deviceCount = 0
SexNbaKef
.Lenght - это и есть инт
Борисов
Потом идет безусловный декремент
SexNbaKef
А в чем ошибка то?
Andrii
Ну и... а вдруг логика программы такая, что Length в данном месте больше нуля?
Борисов
Всё может быть :)
SexNbaKef
Кусок кода на это и заточен, найти строку, которая может выбивать в исключение
Гамлет
Аа
Гамлет
Ну тогда очевидно что 10 строка
Andrii
Кусок кода на это и заточен, найти строку, которая может выбивать в исключение
Любая может, это зависит от того, как определить символы
Гамлет
В остальном выполняются простые операции
SexNbaKef
Любая может, это зависит от того, как определить символы
Здесь обычная типовая проблема - условие на 0 не задано
Andrii
Этот код, например, прекрасно выполняется и не падает: #include <iostream> #include <vector> struct picker { int blocks_per_piece(int) { return 10; } }; struct partial_piece_info { void * blocks; ~partial_piece_info() { std::cout << blocks << std::endl; } }; struct torrent { void get_download_queue(std::vector<partial_piece_info>* queue) const; picker * m_picker; }; typedef int piece_index_t; char blk[1024]; void torrent::get_download_queue(std::vector<partial_piece_info>* queue) const { const int blocks_per_piece = m_picker->blocks_per_piece(piece_index_t(0)); std::vector<int> q = {1, 2, 3}; int counter = 0; for (auto i = q.begin(); i != q.end(); ++i, ++counter) { partial_piece_info pi; pi.blocks = &blk[std::size_t(counter * blocks_per_piece)]; } } int main() { torrent instance; instance.m_picker = new picker(); instance.get_download_queue(nullptr); delete instance.m_picker; return 0; }
Гамлет
Емае
Andrii
Здесь обычная типовая проблема - условие на 0 не задано
А вдруг оно и не должно быть? Например, у нас есть нулевая служебная сессия?
Andrii
Этот код, например, прекрасно выполняется и не падает: #include <iostream> #include <vector> struct picker { int blocks_per_piece(int) { return 10; } }; struct partial_piece_info { void * blocks; ~partial_piece_info() { std::cout << blocks << std::endl; } }; struct torrent { void get_download_queue(std::vector<partial_piece_info>* queue) const; picker * m_picker; }; typedef int piece_index_t; char blk[1024]; void torrent::get_download_queue(std::vector<partial_piece_info>* queue) const { const int blocks_per_piece = m_picker->blocks_per_piece(piece_index_t(0)); std::vector<int> q = {1, 2, 3}; int counter = 0; for (auto i = q.begin(); i != q.end(); ++i, ++counter) { partial_piece_info pi; pi.blocks = &blk[std::size_t(counter * blocks_per_piece)]; } } int main() { torrent instance; instance.m_picker = new picker(); instance.get_download_queue(nullptr); delete instance.m_picker; return 0; }
$ valgrind ./test ==6970== Memcheck, a memory error detector ==6970== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==6970== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info ==6970== Command: ./test ==6970== 0x30b140 0x30b14a 0x30b154 ==6970== ==6970== HEAP SUMMARY: ==6970== in use at exit: 0 bytes in 0 blocks ==6970== total heap usage: 4 allocs, 4 frees, 73,741 bytes allocated ==6970== ==6970== All heap blocks were freed -- no leaks are possible ==6970== ==6970== For counts of detected and suppressed errors, rerun with: -v ==6970== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Andrii
Всё, прекрасно, C++ код, где ты просил привести ошибку, выполнился без ошибок
Борисов
По коду торрента - если смотреть в разрезе когда может быть вызвано исключение - то используется тип int - 'const int blocks_per_piece = m_picker->blocks_per_piece(piece_index_t(0)); ' и далее для индексации в массиве. И вот если вдруг, там будет -1... -2 ... -3 ..
Борисов
)))
Борисов
struct picker { int blocks_per_piece(int) { return -1; } };
SexNbaKef
Ты здесь знаешь число
SexNbaKef
PVS-Studio: поиск ошибок в коде программ ✅Правильный ответ: в данном случае явное приведение типа к size_t используется для корректного доступа к элементам массива. Проблема здесь в том, что оба операнда являются знаковыми целыми числами и при их перемножении может возникнуть переполнение.
Гамлет
Ясно, сходка крестоносцев началась, надо ливать
Andrii
struct picker { int blocks_per_piece(int) { return -1; } };
struct picker { int blocks_per_piece(int) { throw std::exception(); } };
SexNbaKef
МОЖЕТ возникнуть ошибка
Oleg
Если вы не знаете, что делать после освоения языка и азов программирования, то ещё раз вставлю ссылку: https://github.com/firstcontributions/first-contributions/blob/master/translations/README.ru.md Если же вы ищите идею для своего проекта, то вот некоторые идеи из нашего недавнего опроса идей (https://forms.gle/1jETpD5TkyA8jJfBA): "Парсинг госреестров, которые не предоставляют сервисы API и выдача этих данных через свой АPI-сервис" "Блокчейн-игры" "Телеграмм-боты, с полезной информацией. Например, Python roadmap-bot" "Чат-бот расходов и доходов семьи с прогнозированием на полгода" "Чат-бот помощник" "Бот, который шлет либо ссылку либо торрент на фильм. поиск фильма по жанрам. фильм/книга/сериал и т.п."
SexNbaKef
Но не обязательно, что она будет