Это копия, сохраненная 7 августа 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый: >>1413564 (OP)
>Ты вообще в курсе, как устроен raw-файл?
>Это по сути одномерный массив байтов.
Я не доебываюсь, мне просто интересно: а так bmp же, по факту, тоже одномерный массив байтов(после хедеров). Или ты к тому, что в raw формате чистый сигнал должен быть записан?
tl;dr проблема в том, что функции, которые ты хочешь перенести в новую единицу компиляции, привязаны к глобальным переменным. Если их нельзя/влом переписать без глобальных переменных, то почему бы просто не объявить их как extern в твоём новом файле и просто продолжать пользоваться ими?
Мимопроходил
Есть там заголовок и много чего ещё. Всё ещё зависит от конкретного формата, у каждого производителя (Canon, Nikon, Sony и другие) он свой.
>>23599
>>23608
я не читал исходную дискуссию, но есть специальные библиотеки, которые позволяют открывать рав-файлы разных производителей.
В рав есть всё, и размеры снимка, и масса параметров съёмки, включая цветовой баланс и другое. Просто графические редакторы, кроме родных, часто не умеют с этими данными работать.
Бля вы ебанутые? Любой файл это набор байтиков. Вам еще рано С++ учить, пиздуйте мат. часть зубрить.
>>23610
Не, raw фотокамер - это немножко другое. У меня другой raw, не знаю, почему у них одинаковый формат.
Если есть фотошоп, то можешь создать черно-белую картинку и сохранить ее в формате photoshop-raw. Размер картинки будет точно высота*ширина картинки. С учётом битности, конечно.
Возможно raw в фотошопе - это один слой raw в фотоаппаратах.
Я уже решил проблему. Создал отдельный класс rawfile, в котором есть функции загрузки и сохранения файлов.
И куча мета-информации. Чем одномерный массив отличается от двумерного? BMP и TIFF тоже одномерные массивы пикселей, если подумать.
Шо ты такой агрессивный, ты Панин и у тебя не с той ноги встал?
Понятное дело, что это просто набор байтов. Просто bmp-пикчу проще воспринимать таким образом, так как ебни по клаве - получишь пикчу.
То есть это именно простой набор байтов(хотя тоже сомнительно, там же структуры для пикселей), а не как у жпега - там сложнее хранится инфа.
Я не к тому, что ты ебанутый или мы ебанутые, а что в этом контексте можно так выразиться.
На самом деле в коммерческих raw форматах сложнее структура, чем bmp, там есть компрессия, поэтому все равы разного размера. Если ты в файле что-нибудь хаотично изменишь, у тебя всё сломается.
Сама идея простая, есть один пиксель на матрице, это сенсор, в файле каким-то образом значение этого сенсора хранится. Но есть компрессия без потерь поверх, есть куча других данных, всё что можно туда дополнительно пихают.
В прошлой теме автор считал, что в раве даже размера картинки не хранится. Бред, там всё хранится. Там даже помимо пикселей ещё и JPEG с превью хранится.
Еба, тут нужен мем из "тачку на прокачку".
Я просто в это не углублялся, только bmp изучал для своих нужд.
Но хранить чистые данные без размеров - это странно. Разве что по "краям" хуячить служебные байты - каждый пятый пиксель для картинки шириной в 4 пикселя. Но тоже такое себе.
По каким-то причинам вот этому анону попался совсем чистый raw, где есть только пиксели. Видимо, от какой-то программы, которая всегда генерировала равы одного и того же размера с одним и тем же форматом пикселей (или древний фотоаппарат, где всегда одинаковое соотношение сторон, и по размеру файла можно однозначно определить размеры изображения - изображения предназначались для какой-то обработки специальной программой, где явно указывался тип фотоаппарата, например) - не вижу других ситуаций где такое могло бы возникнуть, но и ничего особо удивительного в этом тоже нет.
> По каким-то причинам вот этому анону попался совсем чистый raw, где есть только пиксели.
Не по каким то причинам, а по определенным. Такие raw файлы юзают как карту высот при генерации ландшафта.
Это можно сделать через stdarg.h, если хочешь сам, то смотри примеры реализации этого stdarg или читай про устройство cdecl.
Так эта хуйня с va_args работает в рантайме и соответственно проверка будет происходить в рантайме.
Relaxed constexpr не работают на string view? То есть нельзя просто циклом while пройтись по чарам или типа того?
А, ты так хочешь. Он жалуется.
>static_assert expression is not an integral constant expression
Но constexpr функции которые считают количество аргументов и процентов (самую тупую, естественно, без учёта \% и%%) я вроде бы сделал. Оно выдаёт по 18 тактов, хотя оно совершенно точно не могло с -O0 посчитать в рантайме такую строку за 18 тактов. (без constexpr там что-то порядка 800 и 200 тактов)
https://ideone.com/dm8kpU
А как применять static_assert - не знаю, никогда не пользовался.
Я сам в этом не шарю, но здесь может быть тот самый случай, когда нужно хранить в контейнере с указателями на предка кучу указателей на разных наследников и вызывать для них конкретные переопределенные методы.
Без динамического наследования в такой ситуации звался бы метод предка.
Ну, это если я верно понял обрывки инфы, которые видел в инете.
Знающие анонии, поправьте, где мой проеб?
В том, что ты в рантайме можешь создавать объекты, (реализующие определенный интерфейс) например на основе действий пользователя, генератора случайных чисел или загружая данные из файла, и тебе пофиг сколько и какие именно конкретно объекты ты создаешь.
Т.е. пишешь например ты игру, и тебе не надо хардкодить уровни, ты в рантайме подгружаешь созданные дизайнером, и все части уровня общаются через стандартные интерфейсы не зная конкретно с кем общаются.
Кажется, я совсем не понимаю о чём ты говоришь, какая лямбда, зачем там лямбда?
Чем вот такой вариант не подходит? Можно даже проверку на типы прикрутить при желании, чтоб он выпадал если там стоит число напротив %s или ещё что-то такое.
https://ideone.com/zJdssI
при наследовании у тебя разные классы. А тут указатель на один базовый класс.
Можно конечно попытаться через макросы, но хотелось бы вариант посовременнее через шаблоны как-то, ну и еще в твоей реализации оно не работает если попробовать вывести просто строку без аргументов. Так же если форматная строка будет рантайм, то static_assert не скомпилится вообще. Вот как я пока придумал https://ideone.com/bbn6kB
У тебя это вообще комплириуется? В функции fmt ты не принимаешь ни указатели функций, ни объекты функций, так хуле ты туда лямбду пытаешься запихнуть?
Компилируется, так потом через оператор () оно возвращает constexpr строку, иначе я не могу создать constexpr string_view внутри функции. Вот и думаю как без этого костыля сделать вообще.
1. Реализацию умных указателей и умных указателей с подсчетом ссылок, что бы объяснялось от проблемы до ее решения.
2. Какую-нибудь книгу по STL, уровня для тех кто с++ уже знает и хочет познакомиться с основными возможностями и возможно тонкостями.
Меня прежде всего интересует литература среднего уровня, т.е. для тех кто худо бедно осилил страуструпа и эккеля и хочет идти дальше, но всякие майерсы и сартры пока не по зубам. У меня есть дома книга Джосатиса, талмуд по STL на 600 страниц, это блять слишком для меня.
>умных указателей с подсчетом ссылок http://artemy-kolesnikov.blogspot.com/2014/11/weakptr.html?m=1
Без подсчета там изи, когда область видимости переменной кончается то вызывается ее деструктор, в этом деструкторе просто реализовано освобождение ресурсов.
Как это сделать?
> Можешь пример кинуть откуда-нибудь?
Примеры чего? Уровня? Можешь глянуть исходники Квейка 3. Хоть и на Си написано всё, но в общих чертах выглядит именно так.
Сущности на уровне описаны в key-value блоках. Чем-то на json похожи.
Допустим это какой-то предмет (см картинку, поле classname), игра читает файл карты (конкретно секцию отведённую сущностям), читает значения поля classname и ищет в коде функцию (в Квейке 3 все объекты имею тип entity_t, будь то дверь, предмет, игрок и тп) которая ассоциирована с этим значением.
Создаёт в памяти сущность и сохраняет её в какой-то свой массив.
В С++ точно также (точнее как это сделать решает сам), только вместо просто функции будет какой-нибудь make_shared или типа того.
Так же, как ты бы делал, если подключался к вьюшке. Только теперь подключаешься к чему-то вроде tableView->getModel
Разобрался. Кому интересно будет вот тут http://hzqtc.github.io/2012/05/play-mp3-with-libmpg123-and-libao.html
всё, сначала декодируется, потом проигрывается, libmpg123 и libao опенсурсные, так что можно прям по функциям посмотреть поизучать чё там вызывается и как.
Не, если ты хочешь слушать rowsCountChanged, то тебе нужно подключаться к вьюшке и либо использовать новый синтаксис, либо указать типы аргументов сигнала. Если хочешь к модели подключиться, то подключайся а rowsInserted/rowsRemoved
дружище, никогда, слышишь, никогда не используй старый синтаксис подключения сигналов. С новым синтаксисом на этапе компиляции валится, если что-то не так, с ним при изменении аргументов не нужно переписывать коннекты.
Полиморфизм - это взаимодействие с объектом через интерфейс, через специальные функции, реализации которых могут сильно отличаться в зависимости от объекта.
Например, у тебя есть функция, которая сохраняет дамп какого-то объекта в лог, для дальнейшего анализа.
saveDumpToLog(IDump *obj)
её содержательная часть в том, что она выполняет файловые операции, полученный дамп записывает в файл, фиксирует время и ещё что-то. Но объекты могут быть сильно разными, то, что из них сохраняется, у каждого объекта по-своему реализовано. А тебе хочется один раз функцию написать.
Вот ты и реализуешь у каждого объекта метод getDump(), который возвращает строку с тем, что надо сохранить. Это и называется полиморфизм.
Твоя функция просто принимает объект, вызывает этот метод, получает строку и сохраняет. Вот и всё.
Самая обычная идея. В C++ это через виртуальные функции и наследование делается, в Java для этого описываются интерфейсы, в языках вроде JS/PHP/Python и других ещё проще, доступ просто по имени функции, они там уже все виртуальные, других нет.
Если кратно, полиморфизм - это сама идея, чтобы взаимодействовать с разными по природе объектами через какие-то одинаковые методы.
Это я понимаю, я про практический аспект.
Вот например зачем нужны полиморфные объекты, использования виртуальных функций не достаточно?
friend const Integer opeartor+(const Integer& l, const Integer& r);
Как компилятор понимает, что надо взять объекты справа и слева
т.е.
a + b
Почему тогда нельзя написать ф-ию Koo
которая будет также выглядеть
a Koo b
Инфикс операторы это про скалу и борщи.
https://en.cppreference.com/w/cpp/language/operators
Есть список из 40 операторов, которые можно оверлоадить. Тут с++ в некотором роде похож на пистон.
Ну, если примут uniform function call syntax или как это называется, то можно будет писать a.foo(b) и too(a,b) одновременно
В креста х это считай одно и тоже
А ты не знал, что все тру кодеры называют языки в алфавитном порядке? Есть b,c,d,f,h
Пиздец. Так бы и написал "D", а то включил тут пидорство и называешь "дишечка", как будто в жопу себе вставляешь. Тьфу блядь.
Я не тот
Адрес указателя p, который содержит в себе адрес i.
Я имел в виду, что operator+(int, int) это что-то особенное что позволяет вызов ф-ии помещать между двумя переменными?
И можно ли писать например
+(2,3)
?
Походу это тот питонокодер с физбусом
А то. Графический интерфейс винды хуже пиздеца. На пару контролов целый экран уходит. Лучше сразу в QT вкатывайся какой-нибудь.
Спасибо
Спасибо, проигрывали с топ-манагером весь вечер, потягивая пивко.
я ща попробую поискать, где-то на почте валялся((( пиздец конечно.
в cpp:
Chat::Chat(QWidget *parent):
QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.Button_Update, SIGNAL(clicked()), this, SLOT(ConIp));
}
void Chat::ConIp(){
MyIp->connectToHost("yandex.ru/internet", 80);
ui.plainTextEdit->appendPlainText("Connecting\n");
}
connect(ui.Button_Update, SIGNAL(clicked()), this, SLOT(ConIp()));
или
connect(&ui.Button_Update, &QPushButton::clicked, this, &Chat::ConIp);
Используй второй вариант коннекта, тогда тебе компилятор хоть что-то скажет, если что-то не так.
Такое работает с программистами низкого левела.
Когда приходишь на собеседование, и эйчар занимается такой вот откровенной хуйней, то ставишь его наместо простыми вопросами
- Какой стек вы используете?
- Как много легаси? Почему Вы требуете значение MFC и Qt в рамках вакансии на один проект?
- Покажите конвенции по код-ревью.
- Вы используете скрам или канбан?
- Можно взглянуть на свое будующее рабочее место.
На одном собеседе мне ответили - к сожалению, я не могу предоставить Вам такую информацию.
Ну на что я ответил - давайте позовем человека, который сможет ответить на эти вопросы, мы же рассчитываем, что я тут буду работать длительное время?
Далее при устройстве в эту контору эйчар занимался только назначением встреч.
спасибо
Пока выбрал первый вариант. Иначе не компилится)))
Если лид так себя ведет на собеседовании - то с ним работать будет невозможно, я дропну такое собеседование.
Из своего опыта - нормальных разработчиков найти сложновато, поэтому такой херней в нормальных конторах не занимаются.
MyIp уже указатель, брать адрес у него не нужно.
Сигнатура такая
QObject::connect(указатель на отправителя, указатель на член класса-сигнал, указатель на приемник, укаатель на член класса-слот)
А у тебя получается первым аргументов указатель на указатель.
Спасибо большое
*конторы
Разберись с операторами & и * и передачей переменных в функции по значению, указателю, ссылке. Это важная тема, её следует хорошо знать, чтобы нормально двигаться дальше.
Я не знаю почему, но удивительно, и не таких мудаков держат.
Самый нормальный кейс.
Чем плоха моя запись на втором пикриле?
По стандарту, всегда нужно явно декларировать возвращаемый тип. (по умолчанию в режиме совместимости с легаси, компилятор добавит туда int, а ты ничего не возвращает вообще - получается, что неопределенное поведение на пустом месте).
P.S. что за изврат с Builder 6?
Я не понял вопроса.
Там где нужно возвращать целое знаковое - пишешь int. (void не нужно писать, уже написали что int)
Там где с плавающей точкой одинарной точности - float.
Там где ничего не возвращаешь - пиши void.
На первом скрине перед функцией sum нужен void, так как она выводит сумму и ничего не возвращает.
>Там где ничего не возвращаешь - пиши void.
Я так понял, в С++ нету процедур, а вместо них функция которая ничего не возвращает, т.е с воид?
А какая разница между дельфийской процедурой и сишной void-функцией? Там наверное даже ассемблерный код один и тот же получится, если поставить одинаковое соглашение о вызовах.
Одно и то же это, вкатился в кресты с делфи и никакой разницы (если не обращать внимания на шаблоны, и новые фичи 11 стандарта) не заметил, кроме в десятки раз более удобной работы с указателями, которая в делфи даже с {$POINTERMATH on} едва работает.
Я не знаю, как компилит делфийский компилятор, поэтому ничего конкретного сказать не смогу.
Да это очевидно. Просто судя по тырнету не я один задаюсь таким вопросом.
http://www.cyberforum.ru/cpp-beginners/thread2179173.html
Без разницы.
Какой-то Васян сказал, что мол правило хорошего тона, и холивар на пустом месте развели. Нужно декларации функций в отдельные заголовочные файлы выносить, а реализации в соответствующие cpp.
И функции нельзя инициализировать. Их имплементируют или реализуют.
По-русски - объявление/реализация
На английский манер - декларация/имплементация.
Мне кажется, прототипы не зря придумали, так что лучше после main. А вообще в других файлах обычно хранят если проект более-менее большой.
У тебя сначала counter выводится, а пототм увеличивается. Почитай про постфиксный инкремент. Что бы проще было можешь писать counter=counter+1
Что за [*] в имени файла? Ты точно его сохранил перед новой сборкой?
Неа, внимательно смотри функцию
Я не помню чтобы его раньше приходилось каждый раз сохранять. Ну или я уже крышей еду.
А чем это отличается от его записи?
Да, но он и с ним работает.
да сделать классы простые с гет сет констр дестр, стек дек, ничего особенного, даже изи
Хм, хм.
На самописные реализации дека и стека я бы глянул.
А вообще рили странное тестовое. Проверяли теоретические навыки, а не практические.
Стек сделан на основе дека? С алгоритмами стандартными твои контейнеры работают?
С такими запросами обычно рабов покупают, вангую продадут тебя как синьора и будешь хуярить за пятерых за 100гривень, а если захочешь съебаться - минус зп.
шучу, смотри сам, хули. Если платят крохи - ну их нахуй. Если занимаются хуйнёй - ну их нахуй. Если хоть немного подозрительные - ну их нахуй
cout<<endl не помогает. Ну или я его ставил не туда.
Я использовал. И изменения сохранял, только он выполнял игнорируя их. Перезапустил dev и заработали.
ui.plainTextEdit->appendPlainText(QString(pReply->readAll()) )
Может это потому. что я написал QNetworkReply pReply;
Вместо QNetworkReply pReply=new QNetworkReply;
А написал я так потому, что в первом случае он хотя-бы компилируется.
*шестяток
Я вообще не понимаю какого хуя он ругается на доступ к закрытому члену. Я объект создаю
Ты не прав, если учитывать просранные скобки.
Каким методом текст вывести?
Ага, конечно, прототипы придумали только чтобы реализацию функций писать после main, держи карман шире.
Какие-то поехавшие ублюдки иэ пишут код таким образом, что функция А зовёт функцию Б(через цепочку функций, например) и наоборот. Нахуй они нужны, главное - main в самом начале файла.
QScopedPointer не создает объект, он хранит его лишь.
Объект создавать нужно самому. Два варината, либо передать объект в конструктор
QScopedPointer ptr(new Object);
Либо вызвать сброс
QScopedPointer ptr;
ptr.restet(new QObject);
Во втором случае, объект, который уже хранил указатель, будет удален.
Вторая проблема.
Не ленимся и заходим сюда:
https://doc.qt.io/qt-5/qnetworkreply.html
Видем в секции protected у объекта есть как минимум
virtual void abort() = 0
Это значит, что класс абстрактный, так как у него есть чистая виртуальная функция.
Что это значит? А это значит, что следуя стандарту, компилятор обломит тебя при попытке создания чисто-абстрактного класса.
Что делать?
1. Унаследоваться от этого класса и реализовать эти виртуальные функции, но это тут нам не нужно.
2. За нас уже реализовали конкретные подклассы, нам нужно работать с ними только через QNetworkAccessManager.
Третье.
В твоем случае нужно работать в таком стиле
Где-то на стеке есть scoped poiter и manager.
QScopedPointer reply;
reply.reset(manager->post(...));
...
//Далее работаем уже с reply.
...
После выхода из функции reply автоматом удалиться.
QScopedPointer не создает объект, он хранит его лишь.
Объект создавать нужно самому. Два варината, либо передать объект в конструктор
QScopedPointer ptr(new Object);
Либо вызвать сброс
QScopedPointer ptr;
ptr.restet(new QObject);
Во втором случае, объект, который уже хранил указатель, будет удален.
Вторая проблема.
Не ленимся и заходим сюда:
https://doc.qt.io/qt-5/qnetworkreply.html
Видем в секции protected у объекта есть как минимум
virtual void abort() = 0
Это значит, что класс абстрактный, так как у него есть чистая виртуальная функция.
Что это значит? А это значит, что следуя стандарту, компилятор обломит тебя при попытке создания чисто-абстрактного класса.
Что делать?
1. Унаследоваться от этого класса и реализовать эти виртуальные функции, но это тут нам не нужно.
2. За нас уже реализовали конкретные подклассы, нам нужно работать с ними только через QNetworkAccessManager.
Третье.
В твоем случае нужно работать в таком стиле
Где-то на стеке есть scoped poiter и manager.
QScopedPointer reply;
reply.reset(manager->post(...));
...
//Далее работаем уже с reply.
...
После выхода из функции reply автоматом удалиться.
И да, поправочка, объект ScopedPointer не хранит, а хранит он указатель на объект.
Есть маленький опыт писать скрипты на Баше для xdotool и на... AHK под AHK, чтобы автоматизировать некоторые вещи на Линупсе или Шиндовсе. Ну, там, иф элсы, циклы, свитчи - вот это всё.
Помню когда-то трогал руками Visual Studio Code, очень понравилась идея всего в одном бесплатно под все платформы, но углубленного понимания нету. Можно просто скачать С++ вещи для VSCode и программировать там не разочаровавшись, или мне лучше идти воровать Вижуал Студио или среду от какого-нибудь Джет Брейнс?
Приношу в жертву треду рандомную хуйню, что валялась на рабочем столе.
Полноценная вижуал студия бесплатна для домашнего использования. И да - именно ее и качай.
В твоем высказывании потерена логика.
Qt - фреймворк.
Студия - интегрированная среда разработки.
Как это связано?
Ну он позволяет делать то же, что и студия, верно? Ну кроме кросс-платформенности.
Долбоёб...
Друг, ты вообще походу ничего не понимаешь.
Есть разные IDE, например - Microsoft Visual Studio, Qt Creator, CLion..
Есть фреймворки - MFC, Qt, GTK+.
Есть компиляторы - Microsoft Visual Compiler, MinGW, gcc, clag.
Тут вот что, всё что микрософтовское под Linux вообще не годиться.
Студия - только под винду, MFC - обертка под WinAPI, и компилятор только под винду.
Всё остальное имеет либо порты под платформы либо вообще и является портом, как MinGW есть порт GCC под винду.
Кросплатформенность именно плюсов тебе стандарт гарантирует, поэтому похуй чем ты там копилишь, и по этому на компилятор мы не завязываемся в точности до особенностей реализации ОС.
Но API шинды нихуя не по стандарту, поэтому есть ебля, но к твоему счастью, практически все фреймворки имеют адаптацию под винду.
Просто не используй чисто виндовый стек - типа MFC.
А в каком редакторе ты код пишешь (студия или креейтор) - вообще похуй, хоть в блокноте. На переносимость никак не влияет.
И C++ под NET тоже не используй. И XAML. Это практически не переносимо на винду.
Boost тоже кроссплатформенный.
Можешь использовать фреймворки - GTK, Qt, Tk и вообще чо хочешь из прыщей. Там практически все переносимо на винду.
не переносимо из винды*
И Qt Creator написан на Qt и поставляется с ним часто, но это "продвинутый блокнот". На нем можно что хочешь писать, хоть шейдера, хоть питонячьи скрипты.
Также под студией можешь использовать Qt, как анон выше.
Т.е. Qt Creator != Qt != gcc
Visual Studio != .NET != Visual C++ Compiler.
Слишком толсто
Возьми qtcreator, там установочник на 100 мб, бесплатный, можно загрузить сразу с компилятором, чтобы не возится с настройкой. Я пробовал вкатываться со студии и дропал два раза, хотя с++ уже понимал (это где-то четвёртый язык, который я приступал изучать) и мог на нём более-менее свободно писать. То есть просто из-за студии не мог вкатится в язык. Это субъективное мнение, но хуже студии просто нет, я лучше в блокноте без подсветки синтаксиса буду писать и собирать через батники руками. Может быть сейчас не актуально уже, это происходило в 2013-2014 примерно. Если хочется воровать - укради cLion, он ничего.
> это где-то четвёртый язык, который я приступал изучать
Твое мнение не очень актуально для чего-либо, связанного с разработкой
Если ты настолько тупой, что не можешь освоить кнопочку с зеленым треугольничком, и контекстное меню добавления нового файла в проект - я не знаю, что тебе еще сказать.
Второй раз я дропнул её из-за того, что мой примитивный код для каких-то рассчётов в консольке на 157 строк с тремя функциями компилировлся около семи минут после каждой правки, и это была уже вторая программа, которая урылась подобным образом. А не из-за проблем с треугольниками.
Это очень интересно, учитывая, что я сейчас скомпилировал буст в 2х конфигурациях (дебаг и релиз) через VCPKG с нуля. и это заняло 12 минут 54 секунды. В той самой вижуал студии.
Кодблокс хорош, хоть автодополнение тупит на трехэтажных шаблонах и большие проекты не вывозит.
Алсо для написания lab2.cpp крайне полезная фича – дебаг с run-to-cursor одной кнопкой. Во всех других иде надо, блять, сначала брейкпоинт руками поставить.
(в дебаггере, правда, уже которое десятилетие не могут сделать нормальное отображение stl-контейнеров, но можно со страшными изъебствами прикрутить pretty-printers)
И что ты мне сделаешь, а?
Алсо, я не понял, зачем нужно auto, разве не проще самому тип определить?
Кидай ссылки, посмеемся вместе.
std::map<int, std::vector<std::pair<double, double>>>::value_type::const_iterator it;
Вычисляй, хули.
Человек не понимает, что auto - это вывод типа, просто чтобы человеку не писать то, что уже известно компилятору. Не триггерись так.
QNetworkReply не генерирует ни сигнал error (хтя тут я мог неправильно написать коннект), ни readyRead, ни finished
connect(ui.Button_Update, &QPushButton::clicked, this, &Chat::ConIp);
connect(pReply, &QNetworkReply::finished, this, &Chat::getIp);
connect(pReply, &QNetworkReply::readyRead, this, &Chat::getIp);
connect(pReply,
QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),[=](QNetworkReply::NetworkError code) {
ui.plainTextEdit->appendPlainText("Error");
ui.plainTextEdit->appendPlainText(pReply->errorString());
});
GCC + Vim + раскурить немношк Cmake.
На хуй эти комбайны ебаные, больше времени потратишь на то чтобы разобраться как эта ёбань работает, вместо самого языка.
Так там же исключение не вызывается при переполнении.
Покури <climits>, мб там будет что-то подходящее для тебя.
Там где считаешь comp ты считаешь квадрат последнего (инициализированого) елемента в массиве.
Для программирования нужен определенный (врожденный) тип мышления или это просто приобретаемый обычным человеком навык как забивание гвоздей?
те ты хочешь умножить каждый элемент массива на следующий?
в твоем пример 3х6х7?
Почему тебя тогда comp=arrayжвездочкаarray?
Навык декомпозиции нужен.
Потому что по другому он мне 0 выдает, вот я и начал перебирать хуету.
Программирование не твое, вот прям совсем. Ну или питон попробуй.
Я все время забываю что он с 0 считает.
int comp = 1;
for (int i = 0; i < size; ++i)
{
array = 1 + rand() % 10;
comp *= array;
}
надеюсь, понятно.
>int comp = 1;
>for (int i = 0; i < size; ++i)
>{
>array = 1 + rand() % 10;
>comp = array;
>}
>
int comp = 1;
for (int i = 0; i < size; ++i)
{
array = 1 + rand() % 10;
comp = array;
}
сук, поторопился. вот
>>25575
Ну я короче порылся в теме поглубже. Суть в том что далеко не всякий машинный код работающий с целыми и далеко не на каждой машине поднимает флаг переполнения. Так что в стандарте эта хуйня закономерно послана на хуй.
Я прост думал может подобные вещи реализованы как нибудь красиво, платформонезависимо, ИЗКАРОПКИ, ан нет. Опять велосипеды городить и курить даташиты.
Да я уже понял. Ошибка была в том, что я comp не инициализировал с 1 и он на ноль умножал.
Кстати, забудь про этот java-style. Стандартный C++ (за очень редкими исключениями) вообще не бросает исключений. 99% сомнительных операций тупо вызывают UB.
Предлагаю двачерам познакомить своих преподов с стандартом 11-го года
https://en.wikipedia.org/wiki/C++11#Range-based_for_loop
range-based опирается на итераторы.
новички не могут нормально в обычную индексацию
про итераторы и говорить нечего
поэтому нефиг заставлять, т.к. понимания пока нет.
А она же уже старая, все давно под астра линукс пишут, в астра 1.6 se завезли qt 5.10.1
меняй работу, там у вас еще небось проходная с анальными досмотрами, рабочий день от звонка до звонка, совковая мебель, старики начальство, загран паспорт нужно сдавать, а денег плотят 50 тыщ. Беги, она тебя сожрет!
И тут я вспомнил РАДАР ММС, его холодную бездушную проходную, исполинский силуэт Су-27 перед входом, тесные набитые обшарпанные лаборатории. Говорят, приморский район один из лучших мест города для проживания, но только не окрестности этого адского места. Я вспоминаю: Орловский карьер, хмурый поникший Новоорловский заказник, безлюдный железнодорожный переезд и мрачное и неприветливое здание Радара. Вспоминаю, как в темных комнатах этого здания, буквально до изнеможения и в поте лица, буквально с болью и страданием извергают из себя строки кода безликие программисты, погребенные в хаос менеджмента ГосОборонЗаказа. Бедные, бедные и обреченные, когда то подписавшие по своей юношеской наивности вторую форму, а теперь и без всякой надежды на побег, эти люди пытаются перековать сломленный меч империи.
Есть такое
connect(ui.Button_Update, SIGNAL(clicked()), this, SLOT(GetIp()) );
connect(manager, &QNetworkAccessManager::finished,this, &Chat::replyFinished);
И такое
void Chat::GetIp() {
response = manager->get(QNetworkRequest(QUrl("https://yandex.ru/internet")));
ui.plainTextEdit->appendPlainText("Connecting");
}
void Chat::replyFinished() {
ui.plainTextEdit->appendPlainText("Data recieved");
ui.plainTextEdit->appendPlainText(response->readAll());
ui.plainTextEdit->appendPlainText("Data couted");
}
Когда нажимаю кнопку в первый раз то выводятся Connecting, Data recieved и Data couted меньше чем за секунду, а у меня браузер намного дольше грузит страницу. Во второй раз вообще только Connecting
И еще между Data recieved и couted пустая строка
https://pastebin.com/qRidKfcD
Чувствую что это может какая-то идиома байтоебства, типа представление числа в big endianness или чем-то таком, но не уверен.
Наткнулся на это при попытке разобтаться как работает парсер реликовских текстур(dawn of war).
CUDAH?
Это 32 битное число в little endian, но обычно такой хуйней надо страдать как раз на небайтоебских языках. С си/крестах ты просто делаешь юнион из массива и числа.
Говно.
Если нужно немного покодить - лучше всего CodeBlocks. Если при этом хочешь гуй запилить, то лучше наверное qtcreator.
Если что-то серьёзное - на работе у тебя один хуй будет студия.
Если некуда деть деньги - CLion.
VSCode оставь для вебмакак и для самописных языков.
>CodeBlocks
Гуй может делать только для wxWidgets, да и хуй знает как.
>qtcreator
Тормознутое говно с никакой совместимостью. Но удобное, даже удобнее, чем C::B для отладки. Само Qt - тоже говно.
>VSCode
Тормознутое говно и вообще не нужно.
Нормальных IDE нет. Visual Studio 6.0 ещё более-менее, но малофункционально и поделка дядеБилла, который не нужен.
Куда угодно (кроме Си). Другое дело, что почти никуда не берут. В других языках совсем другие предметные области, процессы и подходы к разработке. То есть нельзя например сразу вкатиться в Скалу, Котлин, JS и другие высокооплачиваемые языки. Придется ломать себя, учиться с нуля и вкатываться с нуля.
Vim\emacs + gcc+\clang + cmake.
И усе, ide тебе не надо, это петушиная хрень для школьников-вкатывальщиков.
Ни тебе структур, ни unsigned, ни main()...
Что-то ты пиздишь. Я после С++ на любом языке что угодно могу написать. Ни разу не открывал учебник по C#, жаве, питону, но если надо что-то написать на этом говне, то беру и пишу без задней мысли и какого либо напряга.
Для программки в сотню-две строк - годится. А отлаживать как? В один-два клика как переименовать переменную во всём коде, посмотреть описание дефайна, найти все вызовы функции?
Так ты не формочки клепай в QT, а нормально С++ используй, тогда и деньги платить будут.
в комменте отлично перечислена петушиная хрень для школьников, которые думают что они умные.
Мимо-сениор-с-2019-студией
Универсальный ответ. Можно бота сделать, который будет на каждую просьбу о помощи так отвечать
Нахуя gcc инстанцирует неиспользуемый шаблон? В msvc работает нормально.
считай как хочешь, манюня. Пока ты пердолькаешься в соснольке - нормальные люди продукты делают.
tui enable, s/si, n/ni, c, show фигня, p фигня, b, info b, delete номер
Вроде всё, не?
Не пользовался чистым gdb года 2-кун
Да не, рабвеслоер.
Почему то захотелось самому. Не смогу же я взять и прочитать кусок памяти по нужному мне адресу, а потом и редактировать
Зависит от системы. Если у тебя операционная система виндоуз(tm) то
https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-readprocessmemory
https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-writeprocessmemory
Также можно внедрятся в процесы, там разного рода инжекты длл да просто банально по типу вирусняка немного подправить код программы чтобы запустить какой-то свой обработчик.
Нихуя. А зачем они так сделали? Могу ли я обеслпасить свою программу, что бы ее не прочитали?
Ну работает же иногда.
потому что msvc - кривая поделка
сначала инстанцируется базовый шаблон
потом при вызове функции просматривается базовый шаблон и его перегрузки.
далее вызывается нужный код.
Если ты не контролируешь устройство на которым выполняется твоя программы то ты в принципе не можешь никак обезопасить свою программу, даже независимо от системы. Можно применять шифрование, разного рода постоянно меняющийся полиморфный код, но если у твоя программа работает в offline режиме (тоесть она не требует постоянного подключения к контрноллируемым тобой серверам) то любое щифрование буде тпредставлять собой security through obscurity - тоесть будет бесполезным против достаточно целеустремленного злоумышленика. Но может помогать против школяров.
Охуеть. Я прям удивлен. Спасибо
Обфускация, всякие пакеры будь здоров так проблем создадут.
Но почему? Нормально же всё.
Одно дело писать код, другое дело разрабатывать продукт. На перечисленных мною языках делают софт совершенно непохожий на тот, что пишут на крестах.
Подозреваю, что static_assert сработал еще до того, как функция начала инстанцироваться, т.к. в нем нет имен, зависимых от параметров шаблона. Если заменим false, скажем, на sizeof(T) < 0, то все нормально скомпилится
Менять на что? Я же студент без опыта, куда меня возьмут. Платят больше чем предлагали в других местах, так что мне норм. Конечно куда меньше 50к, но, как говорил выше, в остальных местах в моем городе в этом плане похуже для программиста без опыта. Тобой перечисленные недостатки отсутствуют. Удобное кресло, 2 монитора, так что рабочее место тоже весьма приличное.
Формошлепство на крестах на заводе тебе конечно многое даст
>И тут я вспомнил РАДАР ММС
Годная паста, схоронил.
Вместо РАДАР ММС можно подставить, к примеру, импульс, или созвездие, или римр, или титан, или элерон, или градиент или любую другую госпарашу, короче олдскульные места с анальным контролем присутствия, невозможностью в удобное тебе время приходить и уходить, хуевыми условиями, кофе, фрукты и сладости покупать самому, как и воду, самому её носить, ибо пропускной режим. Шкварить резюме такими работами лучше не стоит.
Менять на скрам с эджайлом. На нормальное место с профессионалами, которые тебя научат. Где делают продукт, который нужен людям, а не нерабочее говно, которое один хуй примут, ибо задача попилить деньги государства.
Зачем тред тогда?
Суть проблемы: имеется виджет с кучей комбобоксов и в зависимости от кликнутых флагов происходит различная генерация. Я эти флаги помещаю в булевую структуру и передаю в класс обработчик, который занимается генерацией. Как итог в этом классе в некоторых методах выходит длинная ебала из if-else. Есть ли какие-либо более адекватные варианты?
Как вариант, можно сделать список функций, но это шило на мыло
На моей системе и в ideone события тупо чередуются, то есть сначала производитель полностью забивает буфер, а затем потребитель полностью его опустошает. Я ожидал, что будет конкуренция и нельзя будет точно предсказать, какое действие совершится следующим. Я ошибся в реализации или это скедулер так работает?
std::thread::
D E T A C H
E
T
A
C
H
бтв это я такой способ нарыл только, мб есть адекватный правильный способ.
Только при использовании этого метода нужно будет в main придумать ожидание завершения работы потоков, иначе прога завершит свою работу сразу же.
Я принимал из бд объекты и отпускал их детачем на обработку, сохранение и запись на диск, по окончании приема ждал момента в бесконечном цикле со сном на пару секунд, когда в векторе будет столько же объектов, сколько принял из бд.
Поставь слип перед захватом лока. Тред походу освобождает лок, СРАЗУ забирает обратно и где-то при выводе в консоль заканчивается его квант времени.
Насчёт линупсов и бсдей не знаю, но у винды, кажется начиная с висты, замки не "честные". То есть управление не обязательно передаётся следующему ожидающему треду.
Detach не должен давать никакого профита. Джоины дают тредам выполняться параллельно и бесконечно (второй джоин вроде даже не нужен).
Ну я просто где-то находил инфу, что join ждёт завершения потока и только потом прога продолжает работу - собственно, так и было, когда я игрался с потоками.
Но, может, я неправильно прочёл/понял.
Все правильно, но это не значит, что другие потоки не будут выполняться параллельно.
Круто. Короче, это все особенности скедулера. Видимо, если ирл похожую задачу придется решать, будет иметь смысл выносить produce/consume за пределы лока, то есть где у тебя стоит sleep. В примере, конечно, не получится из-за cout.
Сделай рандомный слип. Тогда в среднем будут чередоваться, но иногда будут проскакивать несколько продьюсов.
Значит, я не разобрался и намутил хуйни. Спасибо, почитаю ещё, чтобы понимать нормально.
> Нахуя gcc инстанцирует неиспользуемый шаблон?
Стандартом не запрещено
> В msvc работает нормально.
"ill-formed, no diagnostic required" -> undefined behavior при запуске программы
"undefined behavior" это не "работает нормально".
https://stackoverflow.com/a/14637534/9585016
>потому что msvc - кривая поделка
В стандарте сказано "no diagnostic is required", так что MSVC имеет полное право не детектить кривость этого кода.
>> Нахуя gcc инстанцирует неиспользуемый шаблон?
>Стандартом не запрещено
Т.е. он, конечно, не инстанциирует. Не запрещено не принимать такой код к трансляции.
>Если заменим false, скажем, на sizeof(T) < 0, то все нормально скомпилится
...и код всё равно будет ill-formed (no diagnostic required), а значит при запуске будет UB.
Фига маня порвалась с сажей.
Чтобы научиться. Это не прилизанный пример с использованием best practices для озеленения гитхаба, а челлендж для себя. Будет здорово, если ты покажешь как сделать данную симуляцию без тредов и мьютексов.
CAS и wait-free наше всё?
int ((зв)pp)[10]
? Написано что это указатель на массив из 10 символом, но как это работает? И почему нельзя например присвоить значение вот так
(зв)p = 42?
такой хуйней занимаются, когда хотят в функцию передать двумерный массив а про std::array/std::vector не слыхали
Векторы ваши хуйня для зумерков.
Блин. Тупанул. Все решается p=(int~звездочка~)XXX;
На местн XXX любое число. А в инете че то со строками шаманят
Все же в голове не укладывается. Майкрософт САМИ дали мне библиотеку, для чтения и редактирования памяти других процессов. И как я понял без всяких разрешений.
Эээ, это вообще возможно, если ты админ в системе, но ты бы почитал https://ru.wikipedia.org/wiki/Блок_управления_памятью
>QPixelmap
>Почему то в справочнике не нашел инфы об этом
Note that the pixel data in a pixmap is internal and is managed by the underlying window system. Because QPixmap is a QPaintDevice subclass, QPainter can be used to draw directly onto pixmaps. Pixels can only be accessed through QPainter functions or by converting the QPixmap to a QImage. However, the fill() function is available for initializing the entire pixmap with a given color.
Действительно, почему.
Qt - кроссплатформенный фреймворк и твой код может потенциально выполняться на AlienOS с пятицветными мониторами с 7.5 бит на цвет. Ты не должен полагаться на внутреннее представление этого класса. Если что-то нужно, конвертируй в QImage
Я же дал ссылку на SO, где цитируют [temp.res]/8
Сначала брал GetImage из Xlib/XCB, но на оф. сайте советуют обходить эту функцию стороной и в целом сложно работать с одномерным вектором сырых ргба, хоть мне это скорее и нужно, ибо единственный пиксель, который мог сам опредедить - первый.
В целом использую system(scrot), но хотел так как безногий вариант, то хотел в исходники скрота залезть, но там Торвальдс ногу сломит.
Можете что посоветовать?
Блядь. Так нельзя.
И тогда значение ячейки, лежащей по адрему p1 станет равным значению ячейки лежащей по адресу p2?
Компилятор меня нахуй шлет.
Ща попробую объяснить. Уже ночь и яплохо соображаю. Вот есть у меня указатель на ячейку B42BAF (это я придумал) и эта ячейка хранит число 6. И мне нужно чтобы 6 оказалась в другой ячейке
блять, ты тупой? p2 хранит адрес на значение, которое является адресом...
Они на одну ячейку вдвоем указывают и происходит unable to read memory. По крайней мере у меня так работает
в каком месте они на одну ячейку указывают? p указывает на 0xB42BAF, p2 - на только что выделенную, затем мы копируем значение одной ячейки в другую
Башка не варит. Лучше высплюсь, а завтра доделаю. Спасибо за советы
Ебаный рот этого С++. То чувство, когда понимаешь что ты никогда не выучишь этот язык до конца.
Ты сишку сначала до конца попробуй выучить, лалка
Так у него нет конца
int(зв) p2=new int;
(зв)p1 = 1;
(зв)p2 = 2;
while (true) {
Sleep(rand() % 200);
p2 = p1;
delete p1;
int p1=new int;
p1 = p2;
delete p2;
int p2 = new int;
}
Почему у меня две паре p1 и p2?
Там написано (зв)p2=(зв)p1, int(зв) p1=new int, int(зв) p2=new int
> Пожалуйста, пользуйтесь https://ideone.com/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Я все сделал. Странно, но когда код на обозрение выставляешь, мозг будто боится опозориться и начинает лучше думать. В следущий раз буду использовать pastebin
Как показал пример выше, нет.
Я и делаю в QImage. Только вот выводить в интерфейс приходится, конвертируя QImage в QPixelmap, в результате чего, я подозреваю, 16 бит пидорасятся в 8 бит.
ReactOs. Из книг - Windows Internals. Годных блогов - бесчисленное количество, ищи. Также в твитере любят всякие ресерчеры сидеть, ищи там тоже.
Для низкоуровневой темы у нас есть отдельный тред:
https://2ch.hk/pr/res/1406213.html (М)
Перекатывайся туда, здесь никто не шарит за лоу левел.
int simple(int n)
{
if(n<=1)
return 0;
for (int i = 2; i<=sqrt(n); i++)
if (n % i == 0)
return 0;
return 1;
}
и
void reverse(int a, int n)
{
int temp, b, k, c, simp;
for (int i = 0; i < n; i++)
{
k = 0; c = 0;
if (a > 0)
c = 1;
else c = -1;
a = abs(a);
temp = a;
if (simple(a)==1)
{
b = a % 10;
a /= 10;
while (a > 0)
{
b = b 10 + a % 10;
a /= 10;
}
a = b;
}
a *= c;
printf("%d ", a);
}
}
Но почему-то в результате работы все неотрицательные элементы массива обращаются в 0. Помогите, пожалуйста.
int simple(int n)
{
if(n<=1)
return 0;
for (int i = 2; i<=sqrt(n); i++)
if (n % i == 0)
return 0;
return 1;
}
и
void reverse(int a, int n)
{
int temp, b, k, c, simp;
for (int i = 0; i < n; i++)
{
k = 0; c = 0;
if (a > 0)
c = 1;
else c = -1;
a = abs(a);
temp = a;
if (simple(a)==1)
{
b = a % 10;
a /= 10;
while (a > 0)
{
b = b 10 + a % 10;
a /= 10;
}
a = b;
}
a *= c;
printf("%d ", a);
}
}
Но почему-то в результате работы все неотрицательные элементы массива обращаются в 0. Помогите, пожалуйста.
>Лабы идут на хуй
>Небольшие фрагменты кода размещай в треде при помощи тега [code] и жабаскрипт-костыля. Для больших фрагментов используй внешние сервисы. Хотя лучше вообще всегда используй последний.
в норм виде скинь свой код тогда может быть помогу, но вобще с такой хуетой должен сам разбираться, а не на форумы бежать сразу
Я вообще ничего не понял. Что это вообще за манипуляции в reverse?
Сначала инициализирую картинку.
QImage image = QImage(fileWidth, fileHeight, QImage::Format_Grayscale16);
Потом код берет значения и записывает их в QImage в цикле. resultColor - это quint16.
for (int i = 0; i < map.size(); i++)
{
...
image.setPixelColor(x, y, resultColor);
}
Затем я конвертирую QImage в QPixmap и вывожу в GUI.
QPixmap pixmap(QPixmap::fromImage(image));
imageLabel->setPixmap(pixmap);
Проблема в том, что в QImage почему то получается картинка с глубиной 8-бит, а не 16 бит. И выводится 8-битный greyscale, хотя я прописываю QImage::Format_Grayscale16. Почему так может быть? Кто нибудь вообще знает, как устроен Format_Grayscale16 в Qt?
Первый пик - как должно быть, второй пик - скрин из GUI.
//q:Какого фига пишешь в Билдере?!
//a:Практика в колледже. Заставляють нахой.
Можно как-то реализовать прозрачность гифки в C++ Builder 6?
Чтобы как-то убрать черный фон. Хотел через Transparent Color, но TImage не имеет такую опцию.
> QPixmap pixmap(QPixmap::fromImage(image));
Попробуй
[code]
QPixmap pixmap;
pixmap.convertFromImage(image);
[/code]
И с флагами поиграться
А ты в файл пробовал сохранять? Может это на экране уже пидорасит, а не в QPixmap. Выложи картинку заодно.
что то со страйдом не так
>Какой самый каноничный способ конвертации string в wstring
Что ты имеешь ввиду под "конвертацией"? Просто преобразовать можно так как написал >>28264 , конвертация с учетом кодировки (чтобы non-ASCII символы корректно сконвертировались в юникод) потребует или библиотеки для работы с юникодом, либо функций WinAPI (вроде MultibyteToWideChar).
В стандартной библиотеке С++ пока нет поддержки для юникода.
Не умнее ли использовать карты, благо в каждом классе есть уникальный id? И работать, типа получаешь список ключей, которые меняешь, потом проходиться по ним?
Чем тебе указатели не нравятся? Храни unique_ptrы, при передаче куда-нибудь объектов разыменовывай.
>Какой самый каноничный способ конвертации string в wstring и обратно?
Самый каноничный — не конвертировать.
gsl::span?
Пробовал QImage сохранять в файл, там та же белиберда. То есть это происходит именно после записи 16-битных значений в QImage.
>ReadProcessMemory
https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-readprocessmemory
Всё расписано
Я там и читаю. Как я понял базовый адрес это то куда загружается код, относительно начала выделенной памяти. Даже пикчу такую нашел. Но как мне узнать этот адрес?
Нет, это просто адрес памяти, с которого начинается чтение. Как именно узнать, что ты хочешь прочитать (без содействия читаемого процесса)? Это вопрос скорее к АСМ треду.
Так чтобы отсканить мне нужно этот параметр передать. Я вот понять не могу: это адрес относительно всей памяти или относительно выделенной процессу.
Относительно процесса. У тебя нет доступа к реальным адресам. Процессы работают с виртуальными адресами (у каждого свои) никак обычно не связанными с реальными физическими.
Фух. Так то изи. Спасибо. Я пошел играться
Я не уверен, но скорее всего нет. Память разбивается на страницы, физически они могут распологаться как угодно (не говоря уже о том что некоторые могут быть вообще выгружены из оперативной памяти в своп) но именно виртуальные адреса скорее всего идут всегда непрерывно.
По сути это главное отличие потоков от процессов, у потоков общее адресное пространство.
Регион помечается как недоступный. Это если в юзермоде. В ядре просто страница выгружается.
Базовый адрес модуля приложения + офсет относительно него = твой адрес для чтения/записи памяти.
Спасибо
Вообще, если я правильно помню, там можно подсасываться как-то к процессу ещё: кажется, я для примера делал штуку, которая брала окно под координатами мыши, брала над ним управление и посылала ему сигнал выхода - и по запуску проги приложение под курсором закрывалось.
То есть, получить управление над другим процессом можно, а там уже и узнать адреса его памяти, думаю, достаточно просто.
но я шизик-маразматик, так моя память могла сыграть над нами плохую шутку и это все хуйня.
ААААААААААААААА БЛЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯДЬ!!!!!!!! Какого хуя WinHttpSendRequest шлет лишь ебучий глагол?!?! Вот реально, вместо сервера запустил голую слушалку на winsock-ах, и прилетает только 4 байта "POST". Это пиздос, чините мой пердак, аноны!!!
Ты че, ебанутый? Иди в 92 тред
>Самый каноничный — не конвертировать.
Такое бывает только в идеальном манямирке. fstream::open до сих пор принимает только последовательность из char.
Начиная с C++17 принимет std::filesystem::path
нету
Надо проверить. Спасибо за мысль
Интересно стало что будет, если я захочу прочитать с нулевого адреса (1 в языке обычных людей) как тогда быть?
Брал другие адреса (пробовал кратные 8, 64). Тоже самое.
Из исходников самому выдирать неохота, слишком уж много там одно другое за собой тянет.
Посмотри сюда
https://stackoverflow.com/questions/6687630/how-to-remove-unused-c-c-symbols-with-gcc-and-ld
Там пишут использовать ключи типа -fdata-sections -ffunction-sections. Нужно собрать OpenCV с этими ключами и как статическую либу. Он собирается cmake'ом, то есть клонируешь репу его гитом, чекаутишь нужную версию, дальше
mkdir build
cd build
cmake -DCMAKE_CXX_FLAGS= "-fdata-sections -ffunction-sections" -DCMAKE_BUILD_TYPE=Release .. -DBUILD_SHARED_LIBS=OFF #тут еще много флагов может понадобится
make -j12
А дальше статически прилинковать к своей проге, и при линковке указать -Wl,--gc-sections , согласно тому же ответу с SO.
Как-то так. Сам я этого не делал, но должно сработать.
Более ленивый способ, если тебе нужно просто спиздить пару алгоритмов и структуры данных к ним типа cv::Mat, это заинклудить все нужные cpp файлы
#include "opencv2/yoba.cpp"
#include "opencv2/peka.cpp"
И получившегося монстра собрать или как часть твоего проекта, или с соответствующими include-директориями и теми же флагами -fdata-sections -ffunction-sections и -Wl,--gc-sections (хотя в этом случае можно и отдельные cpp файлы билдить). Это на самом деле не очень долго, достаточно начать билдить, он будет ругаться на unresolved external, далее grep -R в руки для поиска и через полчаса соберешь свой мини-OpenCV. Правда может не повезти и действительно оно потянет все исходники, но вряд ли, компьютерное зрение все-таки, алгоритмы должны быть быстрыми и компактными.
Страуструп хуево косплеит кернигана и ричи. Лучше почитать их а по крестам саттера или мейерса. И точно не как первый язык, ифы и массивы надо знать уже хорошо
Да тут даже не в сложности дело. В начале он писал что книга также для людей у кого это первый язык, то есть он же серъезно ожидает что я после 50стр его книги нахуячу ему сортировку на голом if, даже без else???
Тут же головной боли и адской лапши никак не обойтись.
> по крестам саттера или мейерса
Гляну их, спс.
Прошел почти всего Страуструпа (не осилил только последние пару глав). Насколько помню там задание было отсортировать даже не массив, а просто 3 числа (строки). И это вполне возможно сделать только с if-ами и else-ами. Но вообще согласен, упражнение так себе.
Да, я про него, немного переоценил масштаб трагедии. Но задание все еще на усидчивость, а не логику.
> В начале он писал что книга также для людей у кого это первый язык
Как и K&R
>то есть он же серъезно ожидает что я после 50стр его книги нахуячу ему сортировку на голом if, даже без else???
Ты не очень умный. Я бы лет в 12 такое написал.
Вам же дали норм учебник - "С. Прата - Язык программирования С++. Лекции и упражнения". Почему его не используешь?
Пишу QPixmap pixMap = imageLabel->pixmap(); а он мне отвечает no viable conversion from 'const QPixmap ' to 'QPixmap'.
Пишу QPixmap pixMap = imageLabel->pixmap(); а он мне отвечает cannot initialize a variable of type 'QPixmap ' with an rvalue of type 'const QPixmap '.
Что я не так делаю?
Количество элементов известно? В любом случае это задание на логику. То можешь хоть 10000 страниц прочитать, но если не будешь тренировать логическое мышление все равно не напишешь
А что, нельзя что ли приравнивать? В описании класса оператор = определен, по идее можно.
Ну так оператор= работает с объектами класса, а pixmap() возвращает указатель, если я правильно помню.
Ну так я во втором примере пытаюсь приравнять указатель, но он все равно не хочет.
Только сейчас заметил, что звездочки нет, двач проебывает их. Во втором примере у меня указатель на pixMap.
QPixmap pixMap(*imageLabel->pixmap());
Срочно врубаться что такое ссылки, а что такое значения.
Спасибо, работает.
Попробуй
const QPixmap pixMap = imageLabel->pixmap();
или тип того.
а у нас в расте заимплементил Clone или Copy и присваивай шо хошь
Так ей в виртуальном жи пространстве доступно 4 гб. И когда я читаю память с помощью read process memory я читаю виртуальную память. И в виртуальной памяти она распологается хуй знает где
Не стоит его учить, если возникают такие вопросы.
А в русском языке куда ты можешь развиваться?
Идешь получать опыт. По-другому никак.
пишешь код
Тогда оооочень долго. Расчет на то, что злоумышленнику не захочется тратить столько времени?
Трипл врать не будет
Мб можно найти нужный кусок оперативки и только его читать?
Есть виндовая ReadProcessMemory(). Хендл процесса по его имени вроде тоже можно получить.
Так я использую эту функцию. Но как я понял я работаю с виртуальной памятью и будто программа одна на весь комп и у нее в распоряжении 4гб. Я искал функцию, которая скажет мне первый, используемый программой, адрес, но такой нет. Иначе весь смысл в рандомизации базового адреса пропадет
> перемещаю указатель на 1 байт дальше
Перемещай на слово. Чтение одного байта медленное. Вроде как стандарт рекомендует чтобы int был такого размера который обеспечивает оптималную скорость для конкретной системы (на практике это значит что он должен быть равен машинному слову) но я не уверен насчет этой хуйни. Попробуй читать ансигнед интами. Если надо искать данные размером с байт то используй побитовые операции - число будет крутиться в регистрах, должно быть быстрее чес по байту из памяти тянуть.
https://stackoverflow.com/questions/865152/how-can-i-get-a-process-handle-by-its-name-in-c
Вот это разве не то что нужно?
Так вдруг получится так, что первое чтение заканчивается на адресе 10, следущее чтение с 10 по 42, а число расположено с 6 по 38
Дескриптор я могу получить. Но честно говоря не очень понимаю смысл. Считал что это типо идентефикатор процесса, и бугуртил с того что есть handle, и есть process id
Поиск подстроки (число) в строке (RAM).
Ой, я какую-то хуйню про бинарный поиск сказал.
А вообще, почему бы не найти сегмент кода в бинаре тем же путем, которым его находит ОС, когда выполняет?
Ой, опять хуйню сказал. Вообще в тему дискуссии не въехал. Сука. Мне теперь стыдно в тред заходить будет.
А ты ТОЧНА погуглил прежде чем этой хуйней заниматься? Не верю, чтобы тебе не давали функцию, с которой ты можешь получить желаемое или это не было на СО.
ну что-то вроде https://stackoverflow.com/questions/11564148/how-to-get-the-starting-base-address-of-a-process-in-c наверное
я бы свои слова проверил, чтобы глупую хуйню не спиздануть и не ПОКАЗАТЬСЯ ДУРАКОМ НА ВЕСЬ С++ ТРЕД, но я не виндоблядок
Выводить по таймеру, куда уж проще?
GetSystemInfo для того, чтобы узнать в каких пределах искать.
Затем итерируемся в пределах памяти приложения не по 1 байту , а по выделенному региону, границы, статус (MEM_COMMIT) и защиту (PAGE_NOACCESS, PAGE_READWRITE...) которого можно узнать через VirtualQueryEx. Внутри прочитанного региона ищем по какому нибуть умному алгоритму типа Бойера — Мура.
std::string buf;
std::cout << "String: ";
std::getline(std::cin, buf);
std::istringstream ist(buf);
while ( ist >> buf )
//...
Можете объяснить этот кусочек кода?
А именно что значить - std::istringstream ist(buf);
while ( ist >> buf )
И можно как-то по-другому, написать последние 2 строки?
Ты только первое предложение прочёл чтоль?
Нашел вот это, как-то тоже скомканно и абстрактно рассказано.
Начнем с того, что рассмотрим упрощенную схему организации памяти. Память типичной машины
представляет собой массив последовательно пронумерованных или проадресованных ячеек, с которыми
можно работать по отдельности или связными кусками. Применительно к любой машине верны следующие
утверждения: один байт может хранить значение типа char, двухбайтовые ячейки могут рассматриваться как
целое типа short, а четырехбайтовые — как целые типа long. Указатель — это группа ячеек (как правило,
две или четыре), в которых может храниться адрес. Так, если с имеет тип char, а р — указатель на с, то
ситуация выглядит следующим образом:
В windows, грубо говоря, будут вызываться функции VirtualAlloc/VirtualFree. Как там работает их пул - хз, память не удаляется, а помечается как незанятая MEM_FREE. Можно глянуть MEMORY_BASIC_INFORMATION
Ну так ты на каждый байт стучишься в ядро, естественно это медленно. Сначала сделай выборку из нужных регионов через virtual query, далее читай весь нужный регион полностью в буфер через read virtual memory, далее ищи в нем совпадение.
ой бля, я так однажды gcc вместо g++ пытался конпелировать, обосрался с лога stderr на 25 скринов
Помню в студии пытался С++ код в .c файле написать. Часа 2 мучился.
VirtualQueryEx(hProcess,(LPVOID)lpBaseAddress, &procInfo, sizeof(procInfo));
lpBaseAddress = (INT64)procInfo.BaseAddress;
lpBaseAddress равен 0
как же ты с кутями справляться будешь, если с сайтом не можешь? под жпл бесплатный прямым текстом написано https://www.qt.io/download
Грубо говоря, HeapAlloc свою очередь вызывает VirtualAlloc.
> под жпл бесплатный
Кстати, поясните насчет этой хуйни. Допустим кьют по гпл бесплатный. Могу ли я с его помощью создать прогу и продавать ее? Или нет?
На что вообще распространяется гпл в данном случае? Только на исходный код кьюта или же на все, что было написано с помощью него?
Или вот багтрекер есть один, redmine называется. Он тоже по гпл идет. Его можно использовать в коммерческих целях? Могу я его использовать бесплатно для багтрекинга своей программы, которую собираюсь продавать? Или нет?
Непонятная хуйня для меня.
Там чёрт ногу сломит. Очень много разных ньансов, с которыми нужно разбираться. Не зря же они у себя пишут:
Qt is licensed under a commercial and open source licenses (GNU General Public License version 3 and GNU Lesser General Public License version 2.1).
We want to make sure that you are fully aware of the license types of Qt and which is the correct one to use based on your development project. It is important that you are in the know of the requirements of developing under the GPL or LGPL. Learn about the LGPL requirements here and the GPL requirements here.
Questions about the Qt commercial license?
We recommend you contact Qt by Digia for more information on the Qt commercial license, what it enables and how you can start developing with it. Contact Qt by Digia.
твой вопрос про продажу говорит о том, что ты даже в гпл не разбираешься. из ресерча что я делал предыдущие с++ треды, можешь писать на кутях что угодно и продавать это, но по требованию должен предоставеть сорсы. даже не нужно их размещать пока не попросят.
я так понял, что эти компоненты вроде Chart, перечисленные в https://doc.qt.io/qt-5/qtmodules.html#gpl-licensed-addons это жпл3. а все остальные компоненты, перечисленные вверху - LGPL3 или GPL2.
>Note: For open-source licensed Qt, some specific parts (modules) are not available under the GNU LGPL version 3, but under the GNU General Public License (GPL) instead
Мне нужно вызывать диалоговое окно, в котором есть QLineEdit filePathLine с путем к файлу и кнопка browseButton, при нажатии вызывающая QFileDialog::getOpenFileName(). Все это внутри отдельного QDialog, который является дочерним для QMainWindow.
И вот, мне нужно сделать что то типа:
connect(browseButton, &QPushButton::clicked, this, &ImageEditor::browseCurrentFile);
connect(browseButton, &QPushButton::clicked, &filePathLine, QLineEdit::setText(currentFilePath));
Чтобы при нажатии на кнопку сначала вызывался метод browseCurrentFile, а потом менялся текст в QLineEdit. Метод browseCurrentFile должен будет вызывать QFileDialog::getOpenFileName() и записывать результат в глобальную переменную QString, а в QLineEdit и должна записаться эта глобальная переменная QString.
Какая то запутанная хуета получается, я что то не могу придумать решение.
На пикче я кстати.
Ты же уже сам ответ написал. Хотя я бы не делал второй коннект, а обновлял бы строку в методе из первого коннекта
> Ты же уже сам ответ написал.
Он ругается на такой ответ, хотя я не вижу ошибку, вроде все логично.
> Хотя я бы не делал второй коннект, а обновлял бы строку в методе из первого коннекта
Я бы с удовольствием, но QLineEdit filePathLine - не глобальный, он существует только в области видимости QDialog, а QDialog лежит внутри слота openFile() моего QMainWindow. А метод из первого коннекта принадлежит - это тоже слот QMainWindow. Наверно вся проблема в дебильной архитектуре всего этого, но мне что то сегодня в голову не лезут правильные решения.
Ну хз. Я 12 штук насчитал у себя
Почему нет?
#if defined(__kitayskaya_zalupa)
...
#endif
#if defined(__another_chinese_zalupa)
...
#endif
Это единственный пример метапрограммирования, который тебе когда-либо понадобится в реальной разработке на крестах
Но зачем? Пиши быдлокод и не выебывайся.
Дескриптор HMODULE, которого возвращает GetModuleHandle, будет равен base address
если ты необучамый даун - то да.
На шаблонах ничего в тысячи строк и не городят. Они нужны для того, чтобы решать сложные проблемы элегантно. Пихать их нужно только туда, где без них прям ну никак нельзя.
void Gen(int &gen) {
char arr1[] = "abcdefghijklmopqrstuvwzxy0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char arr2[10] = {};
int pars = 0;
int size = 4 + rand() % 5;
srand(time(NULL));
string dd= "ddddd";
for (pars = 0; pars < gen; pars++) {
for (int i = 0; i <= size; i++) {
arr2 = arr1[rand() % 62];
}
string fulldd = dd + arr2;
Work1(fulldd);
}
}
можно
Нет ну а вообще их используют где-то за пределами либостроения? Обычному студентику их использовать то и негде выходит, или как?
Угу. Писать свой контейнер для каких-то специфических нужд, не более, и 90% возможностей описанных в той книге там всё-равно не потребуются.
Грустно это как-то, вроде и звучит охуенно, и всё круто работает, но в итоге максимум пользы это чтение исходников без слишком большого ахуевания.
Мне кажется, эту фиготу добавили чтобы только чтобы сделать stl с нужными возможностями, это что-то на уровне около компиляторов языка, способ описать правила работы стандартной библиотеки - то есть то что это будет использовать кто-то ещё не подразумевалось. Но такая возможность всё-таки есть и он написал про это книгу.
От чего?
В чем сакральный смысл отсутствия свапа для правых ссылок?
пиши хаки для ксго
Не ну в целом согласен, но заменить stl на любую более-менее большую либу, и тогда норм. Буст тот же чуть ли не полностью на шаблонах написан.
int main() {
int i = 8,b=0;
while(b++!=1)
{
int i =7;
std::cout << i<< endl; // 7
std::cout << ::i<< endl;// 9
}
return 0;
}
Как вывести i=8?
По идее ты ее перекрыл, то есть никак.
Где ошибка? В плане синтаксиса. ink подчеркнуто красным и !=
std::exchange
>Где ошибка?
Нельзя сразу объявлять переменную и сравнивать значение с ней. И написал хотя бы вывод компилятора. MSVC выдаёт:
>conditional expression of type 'std::_String_iterator<std::_String_val<std::_Simple_types<_Elem>>>' is illegal
То есть ожидает условие, а получил что-то невнятное.
Тебе нужно разнести:
>std::string::iterator ink = s.begin();
>while (ink != s.end()) { ... }
A если new добавить перед твоей строкой?
>while ((int x = 2) != 1)
Так? Не компилируется. Проверил Godbolt также и на gcc.
Да и какой смысл несёт эта строка? В начале каждого цикла ты создаёшь новую переменную, которая равняется begin(), и сравниваешь её с end()? Или ты хотел что-то типа цикла for, где можно в начале объявить переменную?
Вообще это странное решение, хз, зачем ему так. Но можно объявить static переменную, тогда должно сработать.
Но это ж в самом деле range-based for, смысл велосипеды строить.
В while нет:
https://en.cppreference.com/w/cpp/language/while
А в if объявление по-другому описывается:
if (auto ink = s.begin(); ink != s.end()) { ... }
https://ideone.com/mYUbVa
В примере рассматривают создание класса-делегата. В нем есть функция-элемент:
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex&) const
{
return QSize(option.rect.width(), 55);
}
Так вот, в самой программе прямого вызова sizeHint нет. Но эта функция точно отрабатывает, изменяя размер элемента из ListView. Вопрос - как так?
Дело не в наследовании. Вопрос - откуда вызывается метод sizeHint(), если явного вызова в коде программы нет?
Задам вопрос по-другому:
https://ideone.com/mYUbVa
Где, как и кем в этом коде происходит вызов SimpleDelegate::sizeHint()
?
https://doc.qt.io/qt-5/model-view-programming.html здесь полюбому что-то полезное должно быть
По ссылке из >>33711 через delegate. можно также посмотреть https://code.woboq.org/qt5/qtbase/src/widgets/itemviews/qabstractitemview.h.html
Она виртуальная.
Её вызывают не из твоего кода, ты лишь меняешь поведение, перегружая её.
Такая фишка зовется - полиморфизм.
Да там свой цирк и свои клоуны есть.
Атмосфера та еще.
Но всё таки по доброму и помнишь наш Радар.
Должна быть точно такая же декларация (возвращаемый тип и тип и количество аргументов). В базовом классе помечается ключевым словом virtual.
Далее в С++ введено специальное ключевое слово - override. Не влияет на поведение программы, но если в декларации перегружаемой функции будет допущена ошибка - компилятор выдаст ошибку.
Имя-то то же самое останется, правильно? Следовательно где-то должен быть вызов функции по-любому, либо он скорее всего перепутал функцию.
Алсо по поводу перегрузки функций:
>Перегруженные функции не обязаны возвращать значения одинакового типа по той причине, что компилятор однозначно идентифицирует функцию по ее имени и набору ее аргументов. Для компилятора функции с одинаковыми именами, но различными типами аргументов — разные функции, поэтому тип возвращаемого значения — прерогатива каждой функции.
Имя конечно.
Мы говорим о разных вещах.
Есть перегрузка функции или метода - это просто одноименные функции с разными параметрами вызова и да - разными возвращаемыми значениями.
Касаемо перегрузки виртуальных функций - перегружаемый метод должен возвращать ковариантный тип.
Перегрузка просты функций
double sum(double, double);
int sum(int, int);
Перегрузка виртуальных функций
class A {
public virtual double sum(double, double) = 0;
};
class B: public A
{
public double sum(double, double) override;
}
Почему не работает?
Нахуя ты этот глючный cin/cout мусор используешь? Ставлю рарку, что там нужно что-то сделать с cin-ом, какой-то режим для него активировать, примерно так же, как для cout-а настройки форматирования дробных чисел можно поставить.
Поставь i=getchar() или i=cin.get() если так хочется вместо cin >> i
Настоятельно рекомендую залезть в файлы компилятора и удалить оттуда iostream, и никогда больше его не использовать.
А, понял, спасибо.
Все-таки мне кажется он просто функцию перепутал, там даже модификатор const стоит, а функция должна менять что-то у него.
Си тред в другой стороне.
Другой символ(символ который надо достать)другой символ.
А там бэкреференсом вытаскиваешь его. Само выражение - это нулевая группа, первые скобки - первая и т.д. Вложенные скобки считаются после тех, в которых они сидят.
То есть ((x)y)(z):
0 группа: xyz
1 группа: xy
2 группа: x
3 группа: z
так может у него символ переменный между двумя другими? иначе зачем ему вообще его доставать, если он его знает? ему наверняка нужно что-то вроде A(.)B или A([A-Za-z])B или A(\w)B и так далее
https://www.youtube.com/watch?v=8ihLJFkrZvU
Надо бы сделать C+=2. С нормальным метапрограммированием. (даже лучше, чем в D). С нормальной моделью компиляции.
Пишу:
imageLabel->setPixmap(QPixmap::fromImage(currentFile.toImage()));
imageLabel->resize(2 * imageLabel->pixmap()->size());
А ему поебать, все равно рисует картинку такого же размера.
Не помогло. А смысл ее ресайзить каждый раз? Я ориентировался на этот пример
https://doc.qt.io/qt-5/qtwidgets-widgets-imageviewer-example.html
А там в методе scaleImage() нету ничего подобного, только пикрил.
Читал Таненбаума по сетям. По архитектуре стоит читать? Я сюда зашёл посоветоваться, чтобы зря 1к страниц не читать.
Стоит, если плохо понимаешь устройство комплюктерна.
потому что ты объявляешь не функцию, которая возвращает указатель на int, а указатель на функцию, которая возвращает int, очевидно же. Приоритет, ептить
Это копия, сохраненная 7 августа 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.