Вы видите копию треда, сохраненную 14 июня 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый - >>970816 (OP) (OP)
Теги: кресты, cpp
А для хранения настроек насколько я понял есть QSettings, который хранит их на диске пока приложение закрыто.
Возможно настройки лучше сделать из QDialog, и создавать и показывть его при нажатии кнопки, он будет блокировать основное окно.
А QSetting под виндой вообще хранит все в реестре, гораздо удобнее.
Может кто пояснить, как работать с функциями? Суть в том, что нужно настроить микроконтроллер следующим образом:
Есть четыре кнопки и 2х16 мониторчик. Надо вывести в первую строку название подменю, а во вторую - какое-то число, которое будет символизировать какой-то параметр настройки. Нажал ввод - вошло в функцию, можно выбирать кнопками "влево" и "вправо" параметр. Нажал отмену - вышел в главное меню, кнопками "влево" и "вправо" выбираешь подменю. Ну, например:
В меню три пункта: Звук, надпись выводимая, время очистки экрана. Нужно выбрать, в какой пункт зайти и выбрать там нужное значение. После выбора нужных значений контроллер начинает выдавать выбранный звук, надпись и через заданное время очищает экран. Скажу прямо: я студент, но не программист, хотя предмет такой есть. Преподу делал много программ, но такую хуйню один потянуть не могу, а он не хочет объяснять, как реализовать это.
Я пришел к выводу, что надо к каждому пункту задать функцию, где в ходе выбора будет задано какое-то значение переменной, которая должна выводиться в void main и выполняться. Но я не понимаю, как, во-первых, ссылаться на функции и как из них выходить в ту часть текста, где была оставлена ссылка на эту функцию. А во-вторых, не понимаю, каким образом мне реализовать выполнение программой действий, которые могут быть выбраны совершенно в рандомном порядке. Ну, то есть, мелодия может быть третьей, надпись первой, а время очистки экрана - 3 секунды. Или наоборот - единицы и одна тройка. Или как угодно.
Надеяться мне больше не на кого.
Подходя к вопросу в лоб ты ничего хорошего не на микроконтролишь. И, судя по всему, ты себе довольно сложные задачи берешь для баловства с МК и изучения С - начинай с попроще чего-то.
Как наводка - гугли "Машина Состояний" (FSM), встретишь простые реализации, и от этого начинай фантазировать.
Если же требуется просто задачу решить а не учиться - то есть готовые либы для подобной задачи - на Хабре видел, ищи.
Такую задачу поставил препод. Сделать подменю я могу, а вот несколько, да еще и с переключением, и с запоминанием результата - уже никак.
Поищу на Хабре тогда. Спасибо.
> В меню три пункта: Звук, надпись выводимая, время очистки экрана.
> Ну, то есть, мелодия может быть третьей, надпись первой, а время очистки экрана - 3 секунды. Или наоборот - единицы и одна тройка. Или как угодно.
Неясно, надписи уже заданы и ты просто выбираешь номер надписи и что?
Двач, решил переписать часть прилаги на крестах и соснул невидимого и неосязаемого, только разобрался с new и delete, как stl-контейнеры:
http://cpp.sh/2bvp4
Вопросы:
1) Почему когда я кладуinsert() что-то в set, у этого чего-то вызывается деструктор?
2) Почему иногда деструктор вызывается больше раз, чем был вызван конструктор, при этом this указывает на другую область памяти?
3) Как правильно создавать объекты, которые я хочу положить в set? Через new и потом разыменовывать?
Ты не можешь вставить в контейнер объект который создан на стеке. Вставляй указатель либо используй emplace вместо insert.
>Ты не можешь вставить в контейнер объект который создан на стеке.
Может переместить temporary. Но он создал дестрактор, что отменило генерацию мув-констракторов.
Вот ещё не понял: есть окно настроек, есть чекбоксы в менюбаре, может ещё что-то, в общем по всему приложению настройки могут измениться. Как это синхронизировать с QSettings? Делать глобальный класс настроек, который будут дёргать другие классы, а он в деструкторе скинет всё в QSettings?
Получается какая-то хуита:
connect(checkbox, &QAction::toggled, settings, &Settings::change())
потом в слоте
name = qobject_cast<QAction *>(QObject::sender())->text()
зато всё взаимодействие с настройками находится в одном классе
Кто тут может объяснить, какого хуя наследники дружественных классов автоматически также не становятЬся дружественными?
каталог-кун пишет:
современое ООП:
толпы быдла долбятся головами об стену невидя двери -
для них выпиливают люк.
Надписи уже заданы. Но это по большому счету не важно.
На проце PIC18F4520. Саму плату назвать не могу сейчас.
У тебя все экземпляры сеттингов завязаны на одни и те же данные, ничего синхронизировать не надо, просто пиши и используй переменные где хочешь:
QCoreApplication::setOrganizationName("TestName");
QCoreApplication::setOrganizationDomain("TestDomain.ru");
QCoreApplication::setApplicationName("TestApp");
QSettings set1, set2;
set1.setValue("Var1",777);
std::cout << set2.value("Var1").toInt(); // 777
Мне нужно написать на Qt widget, имеющий древовидную структуру и поддерживающий несколько типов данных (для начала булевые, числа, строки, но потом будет что-то еще). Нужно что бы разные типы данных по разному представлялись визуально в этом дереве, т.е. булевый параметр представлял собой QCheckBox и т.д. Визуально это должно напоминать сам Qt редактор, а именно область настроек виджета. На какие классы обратить внимание? Я примерно представляю как такое сделать, но вангую, что мой способ это кал ебаный, наверное есть уже специальные классы под это дело. Подскажите, кто знает.
Куда делся ОП, который стихи писал? Сколько раз уже спрашивал - никто так и не ответил. Или это запретная тема?
> гайды по распараллеливанию для чайников
Кончилось время, когда программирование было для чайников. Теперь пока не разберёшься досконально в модели памяти плюсов, можно даже не надеяться. Короче, быдло отсеяно из индустрии.
Ананасы, что означает строчка с new(space){t}; ? Зачем там скобки, не пойму.
спасибо.
Вот блин, в QDialog кнопка apply никаких сигналов не выдаёт, только QDialog::accepted после нажатия ok или cancel, придётся кучу костылей городить чтобы на кнопку apply сигнал повесить и применять изменения настроек на лету.
Послушай совета бывалого человека
ОП-пик сегфолтнулся?
Пробовал ставить локер:
connect(tabs_widget, &QTabWidget::tabCloseRequested, this, &closeTab);
void closeTab(index) {
if(_closing_tab)
return;
else
_closing_tab = true; // Блокируем функцию
tabs_widget->removeTab(index); // Удаляем вкладку
_closing_tab = false; // Разблокируем функцию
}
Но он не помогает, removeTab() работает асинхронно и функция всё равно исполняется несколько раз при закрытии одной вкладки.
Что вообще можно сделать с этим? Почему QTabWidget посылает один и тот же сигнал несколько раз?
Нашёл методом тыка:
disconnect(tabs_widget, &QTabWidget::tabCloseRequested, this, &closeTab);
tabs_widget->removeTab(index);
connect(tabs_widget, &QTabWidget::tabCloseRequested, this, &closeTab);
но такое решение не внушает уверенности
Нашел решение - нужно привязать отдельно openssl либу в проект. На сайте qt конечно же не сказано какая версия, откуда качать и как интегрировать в проект. Естественно, готовую либу и хедеры скачать нельзя - её тупо не дистрибутируют для андроида.
Знач надо билдить из сорсов. Хорошо, смазка у меня заготовлена, кляп в рот и пагнал.
Качаю сорсы, нашел гайд по компиляции либы на сайте openssl. Делаю всё по гайду ХУЯК НЕ КОМПИЛИТСЯ ОШИБКА 0000000A. Ну че епта, гуглим ошибку, неправильная версия питона у тебя такая-то, а надо другая. Ну бля хуле ставим питон. Бля забыл зарегать его снова в гугл бля как это сделать нахуй, виден только старый питон. Нашел, зарегал, ахуеннно. Чето даже начало компилиться, целых 2 минуты компилилось ВЫЛЕЗЛА ошибка 0000000B. Блядь ну пощади меня сучара, что на этот раз. Лезу в гугл.
Оказывается, самая новая версия openssl 1.0.7.4.3.3.0.t не компилится под Android, надо только версию до 1.0.4.6.7.5.b. Блядь а где скачать? На сайте только новая и устаревшая 0.98. Ну блядь лезу ищу по всем сайтам где скачать такую-то версию. Нашел фтпшник со всеми релизами. Качаю.
Распаковал, заново начинаю компилировать. Прошло 10 минут УРА БЛЯДЬ скопилировалось, БЕЗ ОШИБОК. Стоп а куда скомпилировалось? БлЯЯЯЯЯДЬ. Оно скоплилило либу к динамическим сошкам и привязала линки на конкретную папку (то есть чтобы либа заработала, надо будет на андроид закинуть в /usr/lib эту хуйню). Ну еб твою мать мне просто нужны openssl.so без линков нахуй. Лезу в гугол. Че? Надо makefile поменять? Очищаю всё, распаковываю, меняю makefile по гайду. Жду три минуты, не компилится с ошибкой 000000000C. Лезу в гугл, ошибка известная, все кроют хуями разрабом и предлагают свои варики, нахожу гайд 4х летней давности с совсем другой последовательностью компиляции либы. Для компиляции надо скачать специальный скрипт, качаю с сайта требующим реги.
НУ ЩАС ТО ВСЁ ТОЧНО БЛЯДЬ ЗАРАБОТАЕТ!
Удаляю опять к хуям всё, распаковываю, компилирую. БЛЯДЬ опять забыл makefile поменять, пиздец.
Меняю makefile, компилирую. УРА, на выходе ва файлика - openssl.so libcrypto.so, как я и хотел епта. Линкую в Qt Creator. Он мне жалуется при компиляции, что неправильная архитектура. Ебать мой хуй, а че я скомпилил? Ну блядь канеш для x86, а на андроиде arm. Ну хуле лезу в makefile, вроде все переменные указал правильно - путь до SDK, архитектуру и тд. Вывожу на всякий случай на экран - нихуя make эти переменные не видит и юзает дефолтный конфиг. Ок, не буду гуглить и ебаться, просто захардкодю их внутрь configurate скрипта.
Запускаю и УРА блядь готовы отличьненькие либы мои милые вде сошки. Линкую в проект, всё компилится, ПИЗДЕЦ НУ АХУЕТЬ.
Деплою на устройтсво, запускаю приложуху. Вылетает при старте. ЭЭ бля че за нах. Читаю logcat: library Qt-libcrypto not found, library openssl not found. И краш, потому что либы не найти.
Как так в чем проблема?
Лезу в гугл, проблема действительно есть, дело в том, что хоть ты и сбилдил openssl статически, но всё равно там внутри прописывается версии либ, и твоя либа имеет название например openssl.so.5. А Андроид такие либы с точками линковать не умеет, потому что у них имя необычное. Одно из решений - открыть либы librypto и openssl и изменить все упоминания openssl.so.5 на openssl_5.so (например, убрать точку короче лишнюю, точный текст не скажу). Ну достаю из своего уже широкого ануса свой hex-редактор и начинаю пыхтеть над либами и искать че под замену. Раза с 3го у меня получилось всё верно и либы залинковались.
Деплою на устройство - всё видит, всё запускается, https коннект есть, всё работает короче. Слава Украине, Смерть Москалям!
Через день босс заходит недовольный - мой плеер чето не качает нихуя файлы с сервака.
Я тестил на 4м и 5м андроде, а вот у него - новенький 6й нексус, и на нем нихуя не работает. Как так то?
Оказывается вот конкретно вот эта версия openssl содержит баг, при котором не коннектится на 6й версии андроида (там чето внутри порезали в самой системе, внутри чето поменялось и openssl полетел к хуям).
Ну качаю версию openssl с фиксом, и всё проделываю заново.
Прошло еще 3 часа ебли с компиляцией, фиксами, патчами в hexредакторе и МОЯ либонька openssl готова. Пиздец.
А сука жиробас напротив js-макакич, пукич, какич - тупо блядь всё имеет из коробки. И вот тут меня накрывает нахуй завистью.
У красноглазого ублюдка который с этим сталкивается не первый раз наверное бы получилось всё быстрее, но на тот момент я вообще не был готов к такому повороту, пиздец.
Нашел решение - нужно привязать отдельно openssl либу в проект. На сайте qt конечно же не сказано какая версия, откуда качать и как интегрировать в проект. Естественно, готовую либу и хедеры скачать нельзя - её тупо не дистрибутируют для андроида.
Знач надо билдить из сорсов. Хорошо, смазка у меня заготовлена, кляп в рот и пагнал.
Качаю сорсы, нашел гайд по компиляции либы на сайте openssl. Делаю всё по гайду ХУЯК НЕ КОМПИЛИТСЯ ОШИБКА 0000000A. Ну че епта, гуглим ошибку, неправильная версия питона у тебя такая-то, а надо другая. Ну бля хуле ставим питон. Бля забыл зарегать его снова в гугл бля как это сделать нахуй, виден только старый питон. Нашел, зарегал, ахуеннно. Чето даже начало компилиться, целых 2 минуты компилилось ВЫЛЕЗЛА ошибка 0000000B. Блядь ну пощади меня сучара, что на этот раз. Лезу в гугл.
Оказывается, самая новая версия openssl 1.0.7.4.3.3.0.t не компилится под Android, надо только версию до 1.0.4.6.7.5.b. Блядь а где скачать? На сайте только новая и устаревшая 0.98. Ну блядь лезу ищу по всем сайтам где скачать такую-то версию. Нашел фтпшник со всеми релизами. Качаю.
Распаковал, заново начинаю компилировать. Прошло 10 минут УРА БЛЯДЬ скопилировалось, БЕЗ ОШИБОК. Стоп а куда скомпилировалось? БлЯЯЯЯЯДЬ. Оно скоплилило либу к динамическим сошкам и привязала линки на конкретную папку (то есть чтобы либа заработала, надо будет на андроид закинуть в /usr/lib эту хуйню). Ну еб твою мать мне просто нужны openssl.so без линков нахуй. Лезу в гугол. Че? Надо makefile поменять? Очищаю всё, распаковываю, меняю makefile по гайду. Жду три минуты, не компилится с ошибкой 000000000C. Лезу в гугл, ошибка известная, все кроют хуями разрабом и предлагают свои варики, нахожу гайд 4х летней давности с совсем другой последовательностью компиляции либы. Для компиляции надо скачать специальный скрипт, качаю с сайта требующим реги.
НУ ЩАС ТО ВСЁ ТОЧНО БЛЯДЬ ЗАРАБОТАЕТ!
Удаляю опять к хуям всё, распаковываю, компилирую. БЛЯДЬ опять забыл makefile поменять, пиздец.
Меняю makefile, компилирую. УРА, на выходе ва файлика - openssl.so libcrypto.so, как я и хотел епта. Линкую в Qt Creator. Он мне жалуется при компиляции, что неправильная архитектура. Ебать мой хуй, а че я скомпилил? Ну блядь канеш для x86, а на андроиде arm. Ну хуле лезу в makefile, вроде все переменные указал правильно - путь до SDK, архитектуру и тд. Вывожу на всякий случай на экран - нихуя make эти переменные не видит и юзает дефолтный конфиг. Ок, не буду гуглить и ебаться, просто захардкодю их внутрь configurate скрипта.
Запускаю и УРА блядь готовы отличьненькие либы мои милые вде сошки. Линкую в проект, всё компилится, ПИЗДЕЦ НУ АХУЕТЬ.
Деплою на устройтсво, запускаю приложуху. Вылетает при старте. ЭЭ бля че за нах. Читаю logcat: library Qt-libcrypto not found, library openssl not found. И краш, потому что либы не найти.
Как так в чем проблема?
Лезу в гугл, проблема действительно есть, дело в том, что хоть ты и сбилдил openssl статически, но всё равно там внутри прописывается версии либ, и твоя либа имеет название например openssl.so.5. А Андроид такие либы с точками линковать не умеет, потому что у них имя необычное. Одно из решений - открыть либы librypto и openssl и изменить все упоминания openssl.so.5 на openssl_5.so (например, убрать точку короче лишнюю, точный текст не скажу). Ну достаю из своего уже широкого ануса свой hex-редактор и начинаю пыхтеть над либами и искать че под замену. Раза с 3го у меня получилось всё верно и либы залинковались.
Деплою на устройство - всё видит, всё запускается, https коннект есть, всё работает короче. Слава Украине, Смерть Москалям!
Через день босс заходит недовольный - мой плеер чето не качает нихуя файлы с сервака.
Я тестил на 4м и 5м андроде, а вот у него - новенький 6й нексус, и на нем нихуя не работает. Как так то?
Оказывается вот конкретно вот эта версия openssl содержит баг, при котором не коннектится на 6й версии андроида (там чето внутри порезали в самой системе, внутри чето поменялось и openssl полетел к хуям).
Ну качаю версию openssl с фиксом, и всё проделываю заново.
Прошло еще 3 часа ебли с компиляцией, фиксами, патчами в hexредакторе и МОЯ либонька openssl готова. Пиздец.
А сука жиробас напротив js-макакич, пукич, какич - тупо блядь всё имеет из коробки. И вот тут меня накрывает нахуй завистью.
У красноглазого ублюдка который с этим сталкивается не первый раз наверное бы получилось всё быстрее, но на тот момент я вообще не был готов к такому повороту, пиздец.
Кулсторей
Сохранил даже
Я конечно не андоидщик, а js-боярин, но паста ахуенна.
Я тебе больше скажу - на андроиде вообще изкоробки ssl нету.
бля, жиза.
я хочу перегрузить для него оператор << , чтобы выводить эту строку,
сделал глобальную функцию перегрузки operator<<
friend для этого класса, но какого-то хуя я всё равно не могу обращаться к privat полям этого класса в глобальной функции
компилятор указывает на строку объявления глобальной функции в Global.h и выдает кучу ошибок, первая из которых
missing type specifier - int assumed. Note: C++ does not support default-int
какого хера, я вообще не передаю туда int, я передаю туда свой пользовательский класс
https://pastebin.com/TcF7dxCk
я реально не понимаю в чем дело, потому что я делаю всё в соответствии со всеми туториалами,
В хедерных объявлениях пиши полные имена типа (например std::ostream). И еще - не стоит использовать using namespace в хедерах.
убрал, но всё равно те же ошибки(хотя их стало не 22, а 5)
в объявлении функции
std::ostream& operator<<(std::ostream& os, const MyString& string);
он выдает на каждый std::ostream&
missing type specifier - int assumed. Note: C++ does not support default-int
и соответственно
syntax error: missing ',' before '&'
А, все, понял. Ступил немножко.
#include<iostream>
using namespace std;
int main()
{
int i,j,n,m;
cout<<" n="; cin>>n;
cout<<" m="; cin>>m;
int a=new int [n];
for(i=0;i<n;i++) a=new int [m];
cout<<"\n Enter elements:\n";
for(i=0;i<n;i++)
for(j=0;j<m;j++) cin>>a[j];
cout<<"\n Result;\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++) cout<<a[j]<<" ";
cout<<endl;
}
int s = 3;
cout<<"\n Result;\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
a[j] = s; cout<<a[j]<<" ";
cout<<endl;
}
system("pause");
}
#include<iostream>
using namespace std;
int main()
{
int i,j,n,m;
cout<<" n="; cin>>n;
cout<<" m="; cin>>m;
int a=new int [n];
for(i=0;i<n;i++) a=new int [m];
cout<<"\n Enter elements:\n";
for(i=0;i<n;i++)
for(j=0;j<m;j++) cin>>a[j];
cout<<"\n Result;\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++) cout<<a[j]<<" ";
cout<<endl;
}
int s = 3;
cout<<"\n Result;\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
a[j] = s; cout<<a[j]<<" ";
cout<<endl;
}
system("pause");
}
Покажи весь изменённый код.
#include<iostream>
using namespace std;
int main()
{
int i,j,n,m;
cout<<" n="; cin>>n;
cout<<" m="; cin>>m;
int a=new int [n];
for(i=0;i<n;i++) a=new int [m];
cout<<"\n Enter elements:\n";
for(i=0;i<n;i++)
for(j=0;j<m;j++) cin>>a[j];
cout<<"\n Result;\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++) cout<<a[j]<<" ";
cout<<endl;
}
int s = 3;
cout<<"\n Result;\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
a[j] = s; cout<<a[j]<<" ";
cout<<endl;
}
system("pause");
}
#include<iostream>
using namespace std;
int main()
{
int i,j,n,m;
cout<<" n="; cin>>n;
cout<<" m="; cin>>m;
int a=new int [n];
for(i=0;i<n;i++) a=new int [m];
cout<<"\n Enter elements:\n";
for(i=0;i<n;i++)
for(j=0;j<m;j++) cin>>a[j];
cout<<"\n Result;\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++) cout<<a[j]<<" ";
cout<<endl;
}
int s = 3;
cout<<"\n Result;\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
a[j] = s; cout<<a[j]<<" ";
cout<<endl;
}
system("pause");
}
ОП-пик снесли, не знаю почему.
Возможно, вместе с предыдущим неудачным перекатом. В этой теме и предыдущей был один пик.
Попробуй так: https://pastebin.com/KNffk3wV
Но я сам ньюфаг с дивана. Только не забудь еще прописать определения для конструкторов в файле MyString.cpp.
А вообще не стоит использовать имена переменным, которые уже есть в стандартной библиотеке, типа string. Так что я бы написал что-то типа такого: https://pastebin.com/ZAbjiPB6
Ньюфаг-кун >>981179
Clion vs MS Studio 15 Community vs Kdevelop(yoba.jpg)
Clion или студия с решарпером. Только студия что без него, что тем более с ним будет куда тормознутее, так что выбор очевиден.
Студия тож
А kdevelop:
а) На шинде утрахаешься;
б) Не умеет нихуя, даже с цланговским парсером.
У CLion нет отладчика для MSVC тулчейна, только MinGW.
В студию можно подключить решурпер но будет работать как CLion, хотя, я бы сказал, даже чуть шустрее. У решарпера конченые code templates (которые у всех называются сниппетами, в которых из коробки функционала нихуя почти нет и придется писать свои (не шаблончики, а именно модули для решарпера). В студии быстрее показываются подсказки по подстановке символов, в то время как у CLion'а у тебя сначала вывалятся куча дефайнов, которые тебе нахуй не нужны, а потом через 0.5 секунд что-то действительно необходимое.
CLion криво парсит названия проектов (если, например у тебя в одном проекте несколько подпроектов, то, создавая хедеры, там будет генерироваться ifndef-guard с названием корневого проекта, жутко бесит блять).
У CLion-а есть жесткие косяки с парсингом шаблонов, то есть красные линии будут вылазить там, где ты их не ждешь вообще, хотя собираться это будет даже без предупреждений.
В CLion можно делать автоматический перенос выражений и слов, даже комментарии будет переносить, хотя вот например бинарные выражения он переносит пиздец как весело, сделав, например, сделав из этого:
bool my_flag = (mask & MT_1) || (mask & MT_2) && (var_b == var_c);
вот эту хуйню:
bool my_flag = (mask & MT_1) || (mask &
MT_2) && (var_b == var_c);
То есть, перенос он есть, но семантика хотя и неизменна, становится плохочитаемой.
В то время, как в вижуал студии нихуя переноса нет, более того, нет и никогда не было ограничительной линии, поэтому щелкать будешь сам (хотя вот недавно появилось расширение, чтобы добавить вот эту самую линию без заебов, хотя переноса слов можешь и не ожидать вообще).
В CLion можно настроить кодировку файлов по-умолчанию, а вот в MSVC этот ебыч будет тебе постоянно прописывать системную кодировку (а какая же она у нас там, не CP-1251 случаем?!), в других редакторах будут ёба-символы вместо кириллицы.
В CLion ты видишь файловую структуру проекта (хотя есть и другие виды, но они мне нахуй не нужны), в то время как студия при создании нового файла серит ими в одну кучу, получается такое месиво в проекте.
В CLion есть семантическая подсветка переменных, которая нахуй никому не уперлась. От дополнительных цветов режет глаза только.
Для студии дохуища аддонов, и, как ни странно, поддержка того же CMake в плагине для студии сделана более кошерно, чем в CLion (мало того, что там все в кучу одного цвета, как в болоте, так и переменные он нихуя не подсказывает), да и многие плагины по-лучше, чем в CLion.
В CLion больше настроек форматирования текста (спасибо IntelliJ Idea), когда студия со своими полутора настройками скобочек будет постоянно твои лямбда-функции опускать на пару отступов вниз.
У CLion, не смотря на то, что богаче настройки форматирования текста, достаточно кривой format-on-type (не придумаю так быстро русичного названия этой штуке).
У CLion дохуя багов, которые правиться будут не скоро, зато поддержка тестов зачем-то пилится активнее всего (нахуя?!)
Поддержка тулчейна MSVC в CLion кривая (забавно то, что он не может найти тип size_t. SIZE_T ЕБ ТВОЮ МАТЬ!)
У CLion нет отладчика для MSVC тулчейна, только MinGW.
В студию можно подключить решурпер но будет работать как CLion, хотя, я бы сказал, даже чуть шустрее. У решарпера конченые code templates (которые у всех называются сниппетами, в которых из коробки функционала нихуя почти нет и придется писать свои (не шаблончики, а именно модули для решарпера). В студии быстрее показываются подсказки по подстановке символов, в то время как у CLion'а у тебя сначала вывалятся куча дефайнов, которые тебе нахуй не нужны, а потом через 0.5 секунд что-то действительно необходимое.
CLion криво парсит названия проектов (если, например у тебя в одном проекте несколько подпроектов, то, создавая хедеры, там будет генерироваться ifndef-guard с названием корневого проекта, жутко бесит блять).
У CLion-а есть жесткие косяки с парсингом шаблонов, то есть красные линии будут вылазить там, где ты их не ждешь вообще, хотя собираться это будет даже без предупреждений.
В CLion можно делать автоматический перенос выражений и слов, даже комментарии будет переносить, хотя вот например бинарные выражения он переносит пиздец как весело, сделав, например, сделав из этого:
bool my_flag = (mask & MT_1) || (mask & MT_2) && (var_b == var_c);
вот эту хуйню:
bool my_flag = (mask & MT_1) || (mask &
MT_2) && (var_b == var_c);
То есть, перенос он есть, но семантика хотя и неизменна, становится плохочитаемой.
В то время, как в вижуал студии нихуя переноса нет, более того, нет и никогда не было ограничительной линии, поэтому щелкать будешь сам (хотя вот недавно появилось расширение, чтобы добавить вот эту самую линию без заебов, хотя переноса слов можешь и не ожидать вообще).
В CLion можно настроить кодировку файлов по-умолчанию, а вот в MSVC этот ебыч будет тебе постоянно прописывать системную кодировку (а какая же она у нас там, не CP-1251 случаем?!), в других редакторах будут ёба-символы вместо кириллицы.
В CLion ты видишь файловую структуру проекта (хотя есть и другие виды, но они мне нахуй не нужны), в то время как студия при создании нового файла серит ими в одну кучу, получается такое месиво в проекте.
В CLion есть семантическая подсветка переменных, которая нахуй никому не уперлась. От дополнительных цветов режет глаза только.
Для студии дохуища аддонов, и, как ни странно, поддержка того же CMake в плагине для студии сделана более кошерно, чем в CLion (мало того, что там все в кучу одного цвета, как в болоте, так и переменные он нихуя не подсказывает), да и многие плагины по-лучше, чем в CLion.
В CLion больше настроек форматирования текста (спасибо IntelliJ Idea), когда студия со своими полутора настройками скобочек будет постоянно твои лямбда-функции опускать на пару отступов вниз.
У CLion, не смотря на то, что богаче настройки форматирования текста, достаточно кривой format-on-type (не придумаю так быстро русичного названия этой штуке).
У CLion дохуя багов, которые правиться будут не скоро, зато поддержка тестов зачем-то пилится активнее всего (нахуя?!)
Поддержка тулчейна MSVC в CLion кривая (забавно то, что он не может найти тип size_t. SIZE_T ЕБ ТВОЮ МАТЬ!)
Ищи гайды по OpenMP, хули ты как дурак-то. Там все на препроцессорных вставках как раз и делается.
Все гайды сводятся к "вот сюда вот напишите #pragma omp parallel, а перед циклами можно писать #pragma omp for. А теперь, смотрите как ОГОГО, ЁБАНЫ В РОТ, printf("Hello, world!\n") ВЫВОДИТСЯ В 50 ПОТОКОВ!!!" Организацию данных, потокобезопасность - что это вообще, кому нужно? - нихуя нигде ни одного слова нет, ебитесь как хотите. Как я мапы и векторы в распараллеленом цикле менять то буду, ёпта, как данные модифицировать?! Чё, совсем мудак что ли, покажи мне, как я буду контейнеры в многопотоке использовать, ёпта!
На оп-пике было петросянство, которое не понравилось моду (скрин из стрима Outlast с крестами).
Ебал.
>а он не хочет объяснять, как реализовать это.
С вертушки въеби ему, это ненормальный препод.
>>980246
1) Потому что вставляется копия, а временное значение разрушается.
2) Потому что в строке 34 течёт память - ты создаёшь объект, который никогда не разрушится, так как ты проебал указатель на него.
3) insert(L()) нормально, ещё можно emplace(). В чём разница:
insert(L(zalupa));
emplace(zalupa).
С emplace может быть быстрее.
2) сказано верно, но к проблеме не относится.
Что такое "this указывает на другую область памяти" - я не понял.
Есть вроде страничка с литературой https://proglib.io/p/cpp-books/ . Но я хз куда там лезть. В начальный, средний или продвинутый уровень? Не хочется заного читать то что уже знаю, посоветуйте плиз
Не ебу, но подозреваю, что тебе нужна "Лучшая практика" из начального уровня и далее.
Двачая
А дальше - базовая архитектура компьютера, алгоритмы и структуры данных,
без знания этих дисциплин ты просто обезьяна
а с знанием этих дисциплин, ты обезьяна, которая их знает, но ты это поймешь только потом
Конструктор по умолчанию.
В функции - мусором, если не напишешь "= {}".
C++ не делает того, о чём его не просят. Ибо скорость. Исключение - глобальные переменные. Цена инициализации нулевая, так что в этом случае инициализация будет. У Майерса про это даже видео есть.
Не так уж много и у каждой свои недостатки. Сейчас единственный способ сделать всё под себя это писать плагины для вима или емакса, предварительно потратив полгода на то чтобы освоиться в редакторе, и в результате эти скрипты всё равно будут работать медленно.
Либо сделать свою IDE, шуструю и с красивым гуем на Qt, но один человек здесь не справится.
Людям не понятна твоя мотивация. Даже если ты объяснишь нормально, то не факт, что с тобой согласятся.
Проблема в том, что уже есть кдевелоп и кутикреэйтор, которые тоже на Qt и используют цланговский парсер. Чем тебя не устраивает вариант настроить их под себя или написать у ним плагины?
>и в результате эти скрипты всё равно будут работать медленно
В емаксе режимы для крестов - это обертка к тому же clang-у.
>предварительно потратив полгода на то чтобы освоиться в редакторе
>Либо сделать свою IDE
Потратив минимум пару лет
Аноны, поясните, в чем смысл делать assert(this) в конструкторе класса?
> Есть желающие разработать собственную IDE? Интерфейс и логика на Qt
Нет, только если интерфейс полностью на нативных компонентах Windows.
Eclipse
> Пока даже самые новые версии распространенных компиляторов (можно проверить с помощью сервиса GCC Explorer) не выполняют таких оптимизаций, так что пока "все работает", правда же?
Уже выполняют.
Yoba foo(int type, T val) {
switch(type) {
case 0 : return new Yoba1(val);
case 1 : return new Yoba2(val);
...
}
Но компилятор посылает меня нахуй сообщением, что не может найти соответствующий конструктор. Поиск такой ошибки можно как-то отложить на рантайм, ведь я сам себе гарантирую, что буду передавать только корректные аргументы.
Где-то ты темнишь.
Ну если кратко, то ты не можешь этот момент отложить. Да и в каком языке ты сможешь?
Посмотрим, как ты будешь парсер кода писать. Вот тут то ты обосрешься в первый раз.
Посмотрим, как ты будешь тефакторинг писать, тут то ты и обосрешься во второй раз.
Посмотрим, как ты будешь нарсер систем сборки писать, тут то ты обосрешься в третий раз.
Неожиданно, но тут уже полные штаны говна. несите следующие ...
Можешь попробовать конструктор на шаблонах сделать, перегружать готовые, в стандартном бросать исключение или ещё чё делать.
http://ideone.com/eD69WY
Но мне кажется, что это просто очередное место, где можно поиметь проблем и решение несколько неадекватное. Я бы постарался такого не делать оправдываю себя за говнокод ITT
Мы о POD говорим. У любого объявленного класса вызывается конструктор, в твоём посте нет смысла.
>>982352
Куты можно настроить для использования нативных элементов, ЕМНИП.
>>982438
Во многих языках с динамической типизацией.
>>982443
Я сам только на сях писал, потом начал медленно писать программу под свои нужды, и многое узнал во время гугления и чтения cppreference.com, но это было небыстро.
>>982431
>Но компилятор посылает меня нахуй сообщением, что не может найти соответствующий конструктор.
1) Какие аргументы ты передаёшь в foo?
2) У тебя не может быть ошибка типизации в функции. В C++17 завезли if constexpr, в его ветвях могут быть ошибки, и инт типа нужно будет в аргументы тимплейта пихнуть.
А без (2) можно только тимплейты плодить.
http://ideone.com/qhaNjs - ошибки начнутся только тогда, когда ты вызовешь foo с таким типом, который несовместим хотя бы с одной версией Ёбы.
Дело не столько в оптимизациях, сколько в том, что это UB. А всё, что вызывает UB, нужно обходить за триллион километров. UB - это самый серьёзный косяк, хуже, чем любая ошибка компиляции, чем любая неверно вбитая формула. Нужно всегда держать в голове: "Если я пишу код, который может привести к UB, то руки мне отрубить надо".
>Во многих языках с динамической типизацией.
Я сам не особо знаком с такими языками, даже JS не трогал толком. Можно пример кода, где упоминается конструктор класса, которого не существует, и этот код работал?
Угомонись, дегенерат.
Ну анон говорил, что оно просто не дойдёт до того места. Этот конструктор "лишний"
Весь код инстанциированного тимплейта компилируется. Он не скомпилируется потому, что анализ программы - не задача компилятора.
Пример языка, в котором всё ок: PHP. Динамическая типизация, тип переменной может быть любой, соседние невыполняемые строки кода не проверяются.
Это элементарное отличие динамической типизации от статической.
>>982653
Гугли default constructors/destructors. Больше компилятор ничего не генерирует (не считая тимплейты функций, в которые передавался класс).
Скачал релиз (4), установил, но почему-то нет кучи тулз, памятных мне по llvm какой-то старой ветки (3.4 кажется), LLC, LLI, llvm-dis и многих других). Что-то изменилось или на винду это все не завезли? Тогда (году в 2014) я качал какие-то билды с гитхаба, вроде официального на тот момент не было.
А где?
Copy/move assignment
С базовой архитектурой всё ок. Читал с 4-8 классы хуеву гору книг по микроархитектуре ЭВМ, немного знаю ассемблер.
Как смочь в качественную алгоритмизацию если у меня школы 9 классов и в математику я можно сказать не могу совсем? Придётся учить матан?
Нетбук не сможет в VS, нормально ли будет с Qt?Мне только пилить проги уровня "жмякнул кнопку - вылезла картинка"
В ньюфаготреде посоветовали Visual Studio, какая версия лучше?
g++ бери. В VS своя версия компилятора, ещё привыкнешь. из IDE Clion норм
Очень годно. Прям то, что искал. Спасибо.
В ньюфаготреде посоветовали Visual Studio, какая версия лучше?
Ахо, Ульман: Компиляторы
>>982868
Есть IDE и есть компилятор. Компилятор нужен не для редактирования кода, IDE нужна не для компилирования.
Visual Studio - это IDE с компилятором. Я считаю, что в ней слишком много кнопок для ньюфага.
Идеальный вариант - ideone. НИЧЕГО лишнего, ошибки подсвечиваются после попытки компиляции.
Ещё можно Qt Creator поставить, в нём интерфейс минималистичный.
ideone.com т.е.
>ideone
До первой ньюфажей ошибки. Тогда такой перец идёт в этот тред/форум или таки учится пользоваться дебаггером в своей IDE.
как исправить эту ошибку,
она выскакивает на 2х классах, в которые содержат вложенные классы (в том числе 1 из них вложен в другой)
с чем вообще связана эта ошибка?
Чо толсто-то? Можно просто пропустить главы от лексического анализа до модулей, дальше там описано,
Да я уже нашел, всё из-за сраных заголовочных файлов - в одном подключил один, потом туда же подключил другой, где первый уже подключен и так получается два раза подключение,
нигде нормального гайда не нашел как их подключать, чтобы не запутаться и что б всё работало
вроде не все компиляторы ее поддерживают. может у тебя версия старая? пиши #ifndef HEADER #define HEADER
Ну в смысле если объект был создан в динамической памяти, он работу по удалению его самого без дополнительных указаний сделает?
Как можно осуществить вывод двух и более связанных таблиц в один DataGridView в Visual C++?
БД - Access.
Искал - по плюсам ничего не нахожу, по шарпу информации как говна.
Пытался переписывать код с шарпа - ничего. Плюс еще надо в коллекции и коломсы прописывать связанные таблицы, а я хз что куда.
Подскажите пожалуйста, родные, последняя надежда.
Первый пик - моя прога.
Второй - то как это выглядит в моей голове и как должно будет быть. взято тут sernam(точка)ru/book_cbd.php?id=43
shared_ptr<kokoko>(new kokoko(kukarek))
В наше время delete пишут только праздникам и только.
Ну не знаю. Я лично в компьютерной графике вообще не юзаю никакие фичи. Код представляет из себя си с классами + std и иногда штуки из с++11, типа unsigned long long.
А нафига тебе указатель на массив? Возьми просто std::vector, он сам удалит содержимое.
Если уж очень нужно динамически распределять память, заюзай std::unique_ptr\std::shared_ptr, они сами будут удалять содержимое при вызове их деструктора.
Лол, 2017 год на дворе, если что. make_unique\make_shared и не нужны никакие delete.
Держи всех в курсе. Писать голые new и delete (не в конструкторах и деструкторах) в 2017 - зашквар зашкварыч.
>зашквар
Если ты с пацанами крутой современный стартап мутишь, где никакая высокопроизводительность не нужна, то можешь смело обёртками оборачивать другие обёртки.
Не вижу ничего плохого в том, чтобы использовать new/delete.
Мне очень не нравится эта тенденция, когда тупое говно типа тебя все новое, что им влом учить объявляет выдумками неких хипстеров, а ты-то олдскульный пацан, пишешь высокопроизводительный код, как деды завещали.
Только хипстеров этих зовут Страуструп и Саттер. На, читай, https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#r11-avoid-calling-new-and-delete-explicitly и просвещайся.
Я миллион раз эту хуйню слышал от динозавров за 30, которые просто слишком тупы, чтобы выучить что-то новое и пишут как деды завещали. Нет ничего хуже вот этой отстаиваемой тупости.
Все эти обертки инлайнятся и никакого влияния на производительность не дают. Есть просто тупые говнюки, которые вместо того, чтобы почитать последние статьи Страуструпа (вот уж стартаперы бугогого, самое время вставить шуточки про хипстеров и старбакспротив РЕАЛЬНЫХ ПАЦАНОВ типа тебя - мудака, ну да, куда Саттеру и Страуструпу до тебя), а есть люди, которые знают свой инструмент и как им пользоваться. Если ты думаешь, что голые указатели производительнее RAII-контейнеров, то ты тупой мудак, не знающий свой инструмент. А если ты так не думаешь, но все равно лепишь new и delete, то ты просто тупой мудак. Вот и все.
Ну если стартап, который умрет в говнокоде, не дойдя до продакшена, то может быть. Память, сука такая, олдскульно течет.
А еще, когда мне говорят о производительности, я спрашиваю, а как ты профилируешь? Средний кодер оптимизирует хуже среднего компилятора.
Так а разве он не о конструкторах и деструкторах говорит?
Я вот лично тестировал std::shared_ptr и собственную реализацию подсчёта ссылок с new и delete this. Мой вариант в полтора раза быстрее.
У меня имеется 2 массива.
Первый состоит из некоторого количества элементов определенного типа, допустим int. ArrayInt<int>
Второй является набором указателей на тип int, и каждый из его элементов хранит указатель на некий элемент первого массива. ArrayPInt<int>
В функцию вида void funcName(int & ref); передается некое значение с помощью второго массива, выглядит это так:
funcName (ArrayPInt);
, где i равен индексу заведомо существующего элемента массива
Вопрос состоит в следующем, будет ли это работать, если я хочу с помощью функции funcName изменять значения элементов исходного массива?
Спрашиваю потому что не очень понимаю, что происходит при разыменовании указателя, значение копируется в новый раздел памяти или я получаю доступ к исходному значению? И если я не получаю доступ к исходному, то можно ли как-то запихнуть в функцию, в которую передается реф переменная пихнуть эту переменную из указателя?
А смысл? Различные решения, которые используются в shared_ptr, вполне имеют смысл. Стандарт обязывает его удовлетворять определённым требованиям. Если я в свою реализацию добавлю эти совершенно ненужные мне требования, думаю, я сильно отстану по скорости.
Но фишка-то в том, что тебе не всегда нужно то, что предлагает стандарт. А оверхед там просто огромный.
там [ i ] после ArrPInt
Короче, главное вопрос, при разыменовании указателя с помощью звездочки смогу ли я получить доступ к тому значению и изменить именно его?
отлично! Если я правильно понял, то в таком случае у меня все должно работать. Спасибо!
Это хорошо, что вы всё понимаете. Всегда проще пользоваться стандартными решениями. В 99% случаев создание своего умного указателя не даст видимого ускорения.
А твой вариант поддерживает многопоточность, например? Я shared_ptr в принципе не очень люблю, но это не значит, что нужно бежать использовать голые new и delete в коде.
>В 99% случаев создание своего умного указателя не даст видимого ускорения.
Очень даже даст. Потому что shared_prt мультитредовый, и это сильно сказывается на производительности.
В 99% случаев shared_ptr между тредами не передается.
99% ресурсов имеют явного владельца, и shared_ptr не нужен.
1>------ Сборка начата: проект: B, Конфигурация: Release Any CPU ------
B.vb(38,9): error BC36595: Метод не может одновременно содержать оператор "On Error Resume Next" и определение переменной, которая используется в лямбда-выражении или выражении запроса.
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Что делать, аноны?
Если в функцию передаешь как int& ref, то получаешь доступ к исходному значению и всегда его можешь поменять. Если же в функцию передаешь как const int& ref то код меняющий переданное просто не скомпилится.
А вообще дизайн у тебя уж очень стремный, достаточно уменьшить размер первого массива и указатели в конце второго уже указывают в никуда.
Я в детдом попал.
Это ты про синхронизацию доступа? Но она мне не нужна, я никогда не пытаюсь получить доступ к подобным объектам из разных потоков.
Я и не говорю, что моя реализация лучше стандартной, но в моём случае мне не нужны некоторые специфические фичи стандартного варианта, которые его замедляют.
Самая частая операция умного указателя - разыменование, и оно имеет нулевой оверхед. Если же ты делаешь множество копий своего говна, и при этом взятие мьютекса/инкремент-декремент атомика составляет большую часть операции копирования, а не непосредственно копирование, значит ты копируешь безумное множество мелких объектов и тебе не нужны указатели на счетчиках ссылок в принципе. Скорее всего имеет смысл копировать сами данные и использовать unique_ptr. Если же данные крупные, то взятие мьютекса в процентном отношении ничего не замедлит.
Иными словами, там, где shared_ptr нужен, он хорош - особенно если использовать pool-аллокатор. А там, где он плох, счетчики ссылок не нужны.
Вот типичный пациент, который наступил на все возможные грабли http://webcache.googleusercontent.com/search?q=cache:2vEXBHdabHkJ:love5an.livejournal.com/365174.html+&cd=1&hl=ru&ct=clnk&gl=ru&client=ubuntu
К примеру, если у тебя есть иммутабельное AST с мелкими нодами и ты постоянно что-то там копируешь удаляешь, или же такой же граф, и ты за каким-то хуем пишешь такой код на С++, - пиши копирующий сборщик мусора. Производительность будет сумасшедшей, так как он в 99% случаев не будет отрабатывать. А указатели на счетчиках ссылок в любом случае будут сосать, даже если вырезать оттуда поддержку многопоточности.
>пиши копирующий сборщик мусора
Нахуя? Достаточно двух буферов/потоков. Из одного читаешь, в другой пишешь все дерево, потом их меняешь. Для батч-процессинга вообще глупо использовать умные указатели. Они нужны, например, для гуйни, там где данные мутабельные и персистентные. И на оверхед там насрать, потому что латенси и так миллисекунды.
Ты в общем-то и описал простейший сборщик мусора.
В гуйне, как правило, есть дерево овнеров, чтобы не возникло циклических ссылок. Но вообще С++ для гуйни сильно на любителя, мелкий софт ушел в инет, а крупный софт типа КАД в любом случае легаси на легаси, и ты будешь делать так, как повелось в конкретной фирме.
У меня есть библиотечный класс. В нём есть поле float values[] , состоящее всегда из 3 элементов.
И у меня есть класс Vector3, в котором есть 3 поля x,y,z.
Можно как-то записать значения values[] из объекта первого класса в x,y,z объекта второго класса (кроме простого почленного присваивания, типа x = values[0], y=values[1]...)?
Я не знаю, с помощью там какого-нибудь memcpy или как-то еще?
На этой картинке из твиттера тоже не совсем верно понимают, что такое интерфейс. Интерфейс - это совсем не абстрактный класс, нет. Интерфейс - это простое требование "класс обязан иметь такие-то методы".
Знаю, на первый взгляд разница незаметна. Но она есть:
- Абстрактный класс предполагает наличие таблицы виртуальных функций, т.е. все классы, которые от него наследуются, будут вызывать функции только через эту таблицу.
- Интерфейс же ничего такого не предполагает. Если ты видишь где-то, что такой-то объект реализует такой-то интерфейс, значит, у него есть методы этого интерфейса. И вызов метода происходит как обычно, без всякого оверхеда.
В C++ подобный функционал без оверхеда должен реализовываться через SFINAE, но никак не через абстрактные классы.
Используй почленное присваивание, остальное может не работать на железе с другим padding'ом у полей, например. А так, memcpy можно заменить union'ом. Но не надо. Даже если у тебя там 20 полей будет. В С++, к сожалению, нет средств избавиться от копипасты при итерации полей структуры метапрограммированием.
>вижу точку аш в библиотеке, кудахчу про то, что пишу на плюсах а не на Си
Выкини точку аш и добавь в начале букву эс как русская. h — это "эйч", быдло
Всё, теперь ты пишешь на C++.
Я бы порекомендовал std::copy , у него вполне может быть подходящая перегрузка, которая целиком через memcpy все скопипастит. Ну или вариант эту перегрузку самому написать.
спасибо, и спасибо за критику.
Идея состоит в том, что первый массив остается неизменным после создания (меняются только значения его элементов).
Во втором массиве не обязательно содержатся указатели на все элементы первого, а лишь нужные в конкретный промежуток времени.
Делается это для того, чтобы каждый раз при поиске нужного элемента не было необходимости целиком пробегать первый массив, а лишь необходимую выборку, на которую указывает второй массив.
Может быть есть лучшие способы?
гугл, гугл мазарфакер, гуглить умеешь?
http://en.cppreference.com/w/cpp/string/basic_string/stol
Я пародировал "аш", если кто не понял.
Это латынь
Мнение никогда не видевшего буст: не нужно в него углубляться, он огромен. Нужно искать в нём решения задач, с которыми не справляется STL.
>>984164
>Мой вариант в полтора раза быстрее.
В коде, состоящем только из созданий и удалений?
>>984408
memcpy непортабл. Краткий ответ - нет.
>>984965
Ни разу в жизни не видел. Разве что для того, чтобы имя читалось быстрее (нахуя?).
параметры возвращаемые функции на одной строке, а имя на другой, так писали инженеры для облегчения поиска, пока в ит не вкатились всякие хипстеры пидарасы
Кто все то, кто все то?! Мы тут одни с тобой епта.
Так вроде как проще грепать названия функций из исходников. Что-то в этом роде.
Ещё в 90-0х такой стиль активно использовался. А в оригинальном си вообще параметры под названием объявляли и тоже на новой строке ествественно
подскажите какое приложение можно написать что бы значительно поднять скилл по плюсам, сам плюсы знаю плохо.
благодарствую
};
class Base1 : public Parent {
public:
explicit Base1(const char c) : m_char(c) {};
const char m_char;
};
class Base2 : public Parent {
public:
explicit Base2(int c) : m_int(c) {};
int m_int;
};
class X {
public:
template<typename T>
static Parent fabric(int t, T x) {
switch (t) {
case 0: return new Base1(x);
default : return new Base2(x);
}
}
};
int main(int argc, char const argv[])
{
Parent* p = X::fabric<int>(1, 3);
delete p;
return 0;
}
Компилятор генерирует ошибку, мол не нашел подходящего конструктора для Base1(нельзя конвертировать инт в строку).
Почему так делать нельзя? Какого хуя компилятор за меня решает, какие типы я буду передавать? И как лучше, в таком случае, написать фабрику?
};
class Base1 : public Parent {
public:
explicit Base1(const char c) : m_char(c) {};
const char m_char;
};
class Base2 : public Parent {
public:
explicit Base2(int c) : m_int(c) {};
int m_int;
};
class X {
public:
template<typename T>
static Parent fabric(int t, T x) {
switch (t) {
case 0: return new Base1(x);
default : return new Base2(x);
}
}
};
int main(int argc, char const argv[])
{
Parent* p = X::fabric<int>(1, 3);
delete p;
return 0;
}
Компилятор генерирует ошибку, мол не нашел подходящего конструктора для Base1(нельзя конвертировать инт в строку).
Почему так делать нельзя? Какого хуя компилятор за меня решает, какие типы я буду передавать? И как лучше, в таком случае, написать фабрику?
>И как лучше, в таком случае, написать фабрику?
Писать её на другом языке. Тут уже был парень с таким же вопросом если это не ты опять
Делай абстрактную фабрику фабрик и фасоль не забудь.
Компилятор ничего за тебя не решает, он лишь проверяет валидность кода. Это не задача компилятора - анализировать программу, и если в одной из веток будет бобо, он стопорится.
Варианты:
1) Костыльный.
Сделать no-op конструкторы для всех Base*
2) Современный.
if constexpr завезли в ++2017, в его ветках могут быть ошибки типизации.
3) Сбалансированный.
template specialization.
class X {
public:
template<typename T, int t>
static Parent fabric(int t, T x) {
return new Base1(x);
}
template<typename T, 0>
static Parent fabric(int t, T x) {
return new Base2(x);
}
}
};
Или как оно там пишется? Забыл уже с тех пор, как читал об этом.
unregister
Виртуалочка.
потому, что это хороший кодстайл
Можешь заморочиться и перенести все компоненты в одно удобное место, а вместо них подсунуть симлинки.
Достаточно было написать один раз батник.
int arr[256];
std::string s = text;
for(int i=0; i<s.size(); i++) {
f( arr );
}
s воспринимается как signed char, т.е. вместо какого-нибудь 252 оно принимает значение -4. Это нормально вообще?
int arr[256];
std::string s = text;
for(int i=0; i<s.size(); i++) {
f( arr\[s\[i\]\] );
}
s\[i\]
fix
char - это либо знаковый, либо беззнаковый тип. Если нужно что-то одно - кастуй или используй соотв. string (не помню, есть ли он).
Короче, читай вот тут, а то двач залупается про какое-то слово из спам-листа
https://pastebin.com/rK0xafPX
GTK, сер.
Например, 4chan programming challenges
Enterprise-ready IDE.
Чому бы не гонять protobuf или flatbuffers, которые позволяют генерировать схемы для настроек, пиздатая вещь, на самом деле.
boost::spirit
Если понимаешь ООП то да.
Ну а хули нет?! Только вот Шлее не читай, он пишет про устаревшие вещи, хотя, в целом, все, что там написано, применимо и по сей день.
а можете подкинуть годных курсов или видосов, только не учебники, хочется сразу в практику
Смотри на их вики официальной, очень много примеров с объяснениями. Когда будешь устанавливать, можешь вытянть примеры.
http://wiki.qt.io/Main
Как мне воплотить такую логику:
1 читаю файл с начала
2 почитал, скипнул (скипнуть могу только в точности за конец файла, размеры записанного известны)
3 если не eof, goto 2
КАК? peek не помогает - eof не обновляется.
Попробуй get. peek просто смотрит на следующий символ, из потока его не забирает.
Мне не нужен get, мне нужно только затестить.
Сделал так:
.seekg(0);
.read(...)
while(!.eof()) {
почитать
скипнуть
.read(...)
}
Нихера.
Правда ли, что в основном работа на плюсах заключается в поддержке легаси кода, а что то новое пишут с крайней неохотой? Для промышленного формошлепства есть шарп и жаба, для микроконтроллеров си, для веба всякие руби\питоны\го, биг дата в основном на питоне, что делают то?
Ну так вопрос про область применения крестов. Получается, что смысла особого нет, если хочешь именно писать что то новое, а не поддерживать легаси?
Выходит, что так. Вроде как и пишут на крестах разные крутые штуки, но если смотреть на вещи трезво и выбирать между бедным крестовым ынтырпрайзом и жырненьким Джава интерпрайзом, например, то выбор очевиден.
Так тот код, который ты кинул, будет что-то делать. Сам-то что пытаешься сделать?
Паттерны для подсветки собираюсь тоже в json вынести, чтобы можно было полностью настроить. Тот же Sublime например ни в какую не хочет операторы подсвечивать
члены класса? Может быть есть какой нибудь грамотный подход к делегированию вызовов функций с аргументами или типа того?
inb4 ООП для пидоров, нахуй ООП, пиши в процедурном стиле - на данный момент интересует решение проблемы именно в контексте классов.
Код дай. Сдалось нам эту поляну разбирать.
Попробуй анализировать контекст, из которого вызывается процедура. Что знает процедура, когда она вызывается хуком? Сделай таблицу соответствия данных о контексте классам и в процедуре ищи класс в этой таблице, во время добавления хука добавляй данные в таблицу.
Олсо, что такое HOOKPROC? В дефайнах MinGW не нашёл. Это может быть метод COM?
Имею опыт в Code::Blocks, Codelite и DevC++.
Первый мощен, но часто сильно тупит и подсказки говно.
Второй ничего так, но серьёзные проекты ему лучше не доверять.
Третий красив и аскетичен, но подсказок нет от слова совсем. Т.е. что-то есть, но хз.
До этого была студия и дотнет, можешь себе представить, как это всё больно.
>Тред при этом создаётся через CreateThread()
пизда тебе
>>986463
>Может быть есть какой нибудь грамотный подход к делегированию вызовов функций с аргументами или типа того?
Обычно делают С-функцию коллбек, в которой как-либо получают указатель на экземпляр класса, и дергают его метод. Опционально коллбек объявляют френдом класса, чтобы дергать приватные методы.
friend, ебаный насрал, я совсем про него забыл. Спасибо тебе.
>пизда тебе
Ды епта, лабораторная на WinAPI, простите-извините.
>>986572
Процедура для хука ничего не знает для выполнения необходимой задачи, потому что даже будучи статической функцией класса, this у меня всё равно не будет. Вот сейчас про friend мне напомнили, мб прикручу по уму, а то я уж отчаялся и в main захуярил всё.
>Процедура для хука ничего не знает для выполнения необходимой задачи
Не может быть. Неужели нету функций для получения информации о среде? О стеке вызовов, например.
> В C++ подобный функционал без оверхеда должен реализовываться через SFINAE, но никак не через абстрактные классы.
Скажи, что ты так пошутил. Или что SFINAE стоит применять для оптимизации уже существующего кода, использующего абстрактные классы как описание интерфейсов.
Если же ты прав, то зачем тогда вообще нужны абстрактные классы в крестах? Как внедрять зависимости, не используя их? Я испытываю когнитивный диссонанс, мой уютный мир умных указателей типа интерфейсов на объекты в куче рушится. Я ньюфаг, не бей если несу чушь.
Подскажите, плз:
есть строка (массив char) - "МАМА_ПАПА_ЕСЬЖИ"
Как мне проверить каждое слово (разделитель "_") с текстовым файлом?
Вот код, который проверяет одно слово
if (strcmp(str1, str2) == 0) {
printf("Совпало" %s, str1);
}
>>986669
То есть мою лабу будет е стыдно вгитхаб залить и на собеседованиях показыввать? Там что-то около 800 строк кода.
Распидорашиваешь строку на слова (strtok если ты решил угореть по С строкам, или std::istringstream + std::getline) и ищешь их в словаре. strcmp тебе ничем не поможет, если только твой словарь не вектор строк в котором ты ищешь вхождения линейным поиском.
Хуям на собеседовании будет интересно увидеть что ты пишешь также как они (например правильно разбиваешь код на модули, используешь нужные идиомы), то есть тебя не придется учить писать код. Сколько там у тебя строк и вообще что там написано имеет мало значения. Естественно, кроме случая какой-то твоей собственной уникальной разработки.
Имелась ввиду хуйня типа https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md/
Естественно это не высеченная в камне истина, у парней на собеседовании могут быть противоположные мнения по не которым пунктам, и они даже могут оказаться правы.
Сап, анон. Помоги разобраться в том, почему цикл в этом примере написан именно так: http://ru.cppreference.com/w/cpp/algorithm/adjacent_find
>for (next != last; ++next, ++first)
Для чего в блоке инициализации написано сравнения? Что это дает?
Каким образом условие ++next может стать ложным? Если, например, итератор end() контейнера можно интерпретировать как false, то для произвольного диапазона это неверно (допустим, если диапазон выбран в середине контейнера).
Давай объясню подробнее. Наследование от абстрактного класса переводится как "B является A". Реализация интерфейса - как "B может то, что говорит A". Никакого "является" тут нет.
На программном уровне разница будет в том, что в случае абстрактного класса в наследниках функция остаётся виртуальной.
Вот примерное объяснение в коде:
https://pastebin.com/1cSV7itY
Сейчас это можно сделать через SFINAE. И вместо
`void Func(Interface* A)`
где Interface имеет метод F, писать
`template<typename Interface>
void Func(Interface A)
{
if constexpr(Has_Method(Interface, "F"))
{
//Blablabla
}
}`
Ничего, скоро добавят концепты, с ними будет возможно то же самое.
>ru
Не читай ru-сайты, а то постоянно будешь иметь подобные проблемы. Они забыли ; в начале условия.
Читни на ангельском, там всё правильно: http://en.cppreference.com/w/cpp/algorithm/adjacent_find
каталог-кун пишет:
современое ООП:
толпы быдла долбятся головами об стену невидя двери - для них выпиливают люк.
Я не знаю, к чему ты это сказал, но иногда бывает нужно знать, что переданный объект точно-точно содержит такой-то метод. А наследование в данном случае будет костылем.
>Абстрактный класс предполагает наличие таблицы виртуальных функций
но ведь в стандарте про vtable ничего нет, и компиляторы свободны имплементировать нахождение виртуальных функций как хотят.
так что все вопросы к компиляторам
Тогда просто "Абстрактный класс предполагает, что все его методы виртуальные". Всё равно это не всегда то, что нужно.
Обычно экземпляр шаблона создается с указанием типов или значений в треугольных скобках. Каким образом компилятор здесь https://ideone.com/BDfVA6 вычисляет длину массива и подставляет ее вместо N? Как вообще создается экземпляр шаблона без треугольных скобок, как выводятся типы, как подставляются значения и почему она встают на правильные места?
Длина статического массива, который создаётся на стеке, известна компилятору с самого начала. Он же в 13-й строке откуда-то узнаёт размер? Вот и при передаче в функцию знает.
Типы в угловых скобках указывать не нужно, потому что есть единственный вариант типа и размера. А значит, компилятор и так знает, что нужно подставить туда.
>вообще создается экземпляр шаблона без треугольных скобок
Выводится тип переданного аргумента (гугли template deduction).
>как выводятся типы
По типу выражения в правой части.
>почему она встают на правильные места?
И почему же он ошибаться-то должен? Подставляет по типу, логично жи.
Есть мнение, что наследование в принципе всегда является костылём. Недаром в этих ваших новомодных Rust и Go их заменили интерфейсами и трейтами.
У наследования есть пара преимуществ, когда нужно вынести общий код, а публично доступным для всех его делать не нужно. Но это мне нужно было довольно редко, часто наследование выглядит каким-то натянутым. Как будто кто-то очень хотел прикрутить наследование, но не совсем понимал, зачем оно в этом случае нужно.
Возможна ли активация ToolTip'a без наведения на заданный
Button - мыши.
##########
ToolTip1->SetToolTip(button1, "Text1");
При наведении мыши на button1 - Открывает ToolTip1 с Text1.
Возможна ли активация ToolTip1 без наведения на button мыши?
К примеру, добавляю метод Button1_Click по нажатию на который высвечиваются все заданные ранее ToolTip'ы.
Вот этот вроде не совсем дебил, и мнение не совсем говно - что удивительно для параши уровня /зк.
Не знаю с какой технологией ты работаешь, но у tooltip'а нет свойства/поля isVisible или метода типа show()/enable()?
Я тебе больше скажу: оно так вообще везде.
Во всех новых языках наследование давно заменили композицией.
Проблема композиции в том, что внутренние классы должны торчать полями и методами наружу, чтобы их мог использовать внешний класс. Особенно это хреново, когда кроме как внешнему классу, никому больше эти методы и не нужны.
Подключение кириллицы в консоль С++
https://pastebin.com/Pc5jM2VG
Залил на пастебин для удоства.
Иди уже нахуй, гатаридебил.
>модулями
Цпп макакичам даже нормального способа переключения кодировки твывода в терминал не завезли, модулями ему косяки композиции прикрывать видите-ли надо.
Обычно каждый исходный файл компилируется отдельно в объектный код (что типа g++ -o user.o -c user.cpp), дальше линкеру скармливаются все файлы с объектным кодом и он уже и собирает готовый исполняемый бинарник (g++ -o myapp user.o my.o)
https://pastebin.com/JcFdXneJ
Это задание на наследование и прочее. И вот возникает странная ошибка из-за делегирования конструкторов и значений по-умолчанию. Если вы скомпилируете, то увидите, что цепочка, в итоге, приводит к обнулению переменных w,d,h. При том weight, которая находится всего на один уровень выше - задаётся корректно.
Что это и как это исправить?
Ну, в смысле, вон, если убрать комментарий в конструкторе UberBox, то, несомненно, я получу нужные значения. Но мне бы хотелось воспользоваться предыдущими конструкторами.
> Dev cpp
Это IDE, а не компилятор, проверь, возможно ты скачал версию без компилятора. То что нужно два файла компьютер не поймет никак. Обычно за этим следит IDE - ты создаешь проект, добавляешь в него файлы, а IDE уже скармливает компилятору все файлы в проекте. Посмотри, возможно стоит Qt Creator использовать - потом сразу в Qt вкатишься.
Используй для Box дефолтный (без параметров) конструктор. А вообще наследование ромбом хреновая идея.
>обнулению переменных w,d,h
Они не обнуляются, а изначально равны 0 - в твоем классе есть два набора переменных w,d,h. Один ты изменяешь, а второй нулевой.
У тебя РОМБ КЛАССИЧЕСКИЙ. Енджой йор МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ.
А почему Qt Creator, а не какую-нибудь Visual Studio? И нет, версия у меня точно с компилятором, и я эти файлы и через проект создавал, и по отдельности - никак не работает.
>>987667
Такс. А ромбы нельзя? У нас в примере с лекции было такое, там про virtual, собственно, только сказали.
За просто Box спасибо
Ромб можно, но только в С++. В нормальном обществе за ромбы бьют якорем по яйцам.
В студии специфическая версия плюсов, и она несколько жирнее креатора (с учетом фреймворка). Так-то студия это оптимальный вариант, если тебя не смущают нюансы. И ты на используешь операционную систему виндоуз.
Ну, в моей любимой джавочке это в принципе невозможно.
Такс. А как мне избавиться от второго набора переменных сохранив ромб (лол. Никак, да?)? Или как мне ,однозначно, обратиться к тому набору переменных который инициализировал тот конструктор?
мдя. Чому так сложно? Не хочу заниматься памятью:\
Избавиться нельзя. Обращаться указывая нужный класс, что-то типа BoxWeight::w = 77;
понятно. Спасибо большое.
А.. Как сделать приведение типа, скажем, от BoxNamed к Box? Я не совсем понимаю как это именно написать, видимо, косячу с самим синтаксисом перегрузки оператора. Оно то предлагает сделать его void, то говорит, что "'Box' is an inaccessible base of 'BoxNamed'"
Потому, что этого легаси ещё лет на 10 хватит. А в странах третьего мира и на все 30. Но офк глупо ограничиваться этой еботекой с указателями(не в обиду, господа)
не понимаю. А в чём разница того что уже есть с тем, что в статье?
Это универсальный переносимый язык с промышленным стандартом и довольно небольшим оверхедом.
Легаси это не про языки, легаси это про подход к разработке (куча горизонтальных зависимостей, протекшие абстракции, отсутствие тестов).
Если у тебя приведение типов происходит снаружи (а не в имплементации класса) то наследование нужно делать публичным.
О... Да. Это помогло. Теперь я немного лучше понимаю табличку и вообще, что именно та ошибка имела ввиду. Спасибо.
Легаси это именно что совокупность говна мамонта.
Помню где-то скрин видел с форума, где был запечатлен пост защитника VB6 относительно свежей даты, который рассказывал что ЯП это тебе не залупа и в нём новых косяков не появляется со временем, то есть он не стареет эх, а ведь он даже не подозревал насколько неправ.
Ладно, с этим вроде понял, для хука нужна прослушка сообщений через GetMessage(). Теперь другой вопрос: если я закончил прослушивать нажатия клавиш, как мне из другого треда послать в основной сообщение WM_QUIT? Всякие PostMessage, PostQuitMessage, судя по описанию на msdn, посылают сообщение в своём треде.
В наличии есть id обоих тредов а может еще что то, о пользе чего я не знаю
Всё, проблема решена. PostThreadMessage в совокупности с GetMessage работает пэрэекарасно.
Это немного не то. И думает он по полтора часа. Да и с гпрофом я уже разобрался - надо было просто статически слинковать.
Ботлнек получается и в итоге все работает медленнее чем в однопотоке. Если б на каждый поток можно было завести по пайпу, в который скидывался бы результат, а потом по окончании их работы эти пайпы собрирались бы в контейнер, может и вышло что-нибудь.
>Сейчас будет тупой вопрос, как называются переменные в классах? Гугление только усугубило проблему, мне кажется что у них десятки наименований которые все обозначают тоже самое, говорит ли что-то об этом стандарт?
ЧЛЕНЫ! ИХ МОЖНО ДЕРГАТЬ!
— Смотри, я… вот у нас здесь функций много… ой-ой… функций много, понимаешь? Смотри, функции, они тебе спать мешают. А я вот, давай вот я функции прямо в структуре объявлю, и они все в структуре будут, и мы их методами назовем, слышишь, членами назовем? И тебе тогда спать, ой, спать будет хорошо. Давай? Ну, куда им ещё, ихнее место-то тока здесь. А структуру - классом.
— Ты можешь просто помолчать, всё, пиздец?!
— А еще в классе два члена сделаем, конструктор и деструктор, и они сами собой эти члены дергаться будут. Вот так, дерг, дерг.
— Заебал, блядь!
— А еще у класса родитель может быть, а этот класс тогда дочка. И у дочки тогда все члены родителя будут, ну они же наследуются, ну. Понимаешь, братишка. У дочки члены родителя будут. И их тоже дергать можно будет.
— Ёб твою мать! Блядь! Иди отсюда на хуй, блядь!
— Но не все члены дергать можно будет, будут публичные члены, которые все могут дергать, вот ты мой публичный член, например, можешь подергать.
— Сука, блядь, пидорас, блядь!
— А другой член только родитель сможет дергать, и больше никто. А еще будут члены, которые только родитель и дочка дергать смогут. Братишка, братишка... Дочка у родителя член дергать сможет, понимаешь, братишка.
— Иди под струю, сука! Мойся!
— А еще можно будет класс-дружочек сделать. И тогда этот дружочек все членики у своего дружочка дергать сможет.
— А блядь на хуй! Ну, иди сюда сука, блядь! Дерьмо собачье, блядь! А блядь!
— А у дочки много родителей будет, и все членики родителей у дочки тогда будут. Их можно будет дергать и другим не мешать дергать, понимаешь?
— Мудак, блядь, ну ты мудак. Я тебя сейчас убью нахуй, а тебя, бля, сейчас убью, блядь!
To get to the requested page you must first login.
>После десятого dx на экран выводятся слишком большие значения.
Возможно где-то переполняется переменная. (или становится равной нулю)
Или, со знаком что-то происходит.
Убедись, что у тебя все переменные double.
Запиши все значения всех переменных на каждой итерации в лог.
Называешь как хочешь. Я предпочитаю _field_name или _fieldName, подчёркивание отделяет приватные от публичных в автодополнении и всяких списках в IDE если такие есть.
Тип sum.
Если в объекте нет ничего виртуального и нет указателей: file.write((char*)object,sizeof(object));
А по-взрослому это делается так: для кажлого объекта надо определить operator>> и operator<<, в которых ты ручками пишешь порядок вывода всех членов, и делаешь их френдами объектов, если есть приват-члены.
https://isocpp.org/wiki/faq/serialization
Нутыпонел.
>>988288
>При такой записи ( не по-взрослому ) ошибка при чтении и гроб-гроб
??? Оберни в trycatch.
Попробовал я с JSON в Qt разобраться. Записать-то я записываю. Но по клику мышки можно записать хоть сколько json-ов. Как мне их теперь читать-то?
>по интерполяции ньютона есть кто?
Я тебе вроде уже отвечал.
Чтобы ты все расчеты залогировал.
Ты на листике считать можешь эту интерполяцию?
Ты походу с самим json не разобрался, неправильно ты пишешь в файл, батенька.
Тебе нужно создать массив объектов в json.
Либо:
[
{
//good1
},
{
//good2
}
]
Либо:
{
"goods": [
{
//good1
}
]
}
А ты пишешь в json:
{
"price": 10,
"count": 50
...
}
{
"price": 50
}
что валидным json не является.
Ты походу с самим json не разобрался, неправильно ты пишешь в файл, батенька.
Тебе нужно создать массив объектов в json.
Либо:
[
{
//good1
},
{
//good2
}
]
Либо:
{
"goods": [
{
//good1
}
]
}
А ты пишешь в json:
{
"price": 10,
"count": 50
...
}
{
"price": 50
}
что валидным json не является.
спс анон
const int size = 7;
int i_array[size];
и
int i_array[7];
Ничего непонимаю.
Это С++ на пикрелейтед?
Почему не макароны, как у анона которому ты отвечаешь?
И что за подсветка синтаксиса, и откуда?
Представь себе:
1) что этот волшебное число 7 у тебя по всему проекту в 256 местах.
2) что у тебя в одном хедере написано конст нормально имя переменной, четко понятное размер чего это и зачем = 7
Теперь тебе надо сменить это значение на, допустим 9. Или даже не тебе адруглму уебку, тошо ты давно уволился.
В каком случае уебок соснул?
А что ты сам можешь задержаться на этом месте дольше месяца ты не рассматриваешь как вариант, я полагаю? За такой код тебя пидарнет нахуй сеньер помидор после первого же код ревью, быдлокодеров типо тебя в любой шараге можно набрать за 100$ пучек. А пояснять инвестору почему сменить количество рабочих часов в дне займет 3 месяца и еще 2 месяца багтестинга ему не захочется.
Список пар смежностей и весов, лол.
Знать фишечки новых стандартов, понимать наследование\тимплиты\эксепшены. Знать алгоритмы хоть немного, заглядывать в многопоточку.
Функция check принимает ссылку на строку с информацией об исключении. Операторы ++ и -- вызывают ее в самом начале. При компиляции этих операторов возникла ошибка "Нелья преобразовать const char * в std::string&", связанная с передачей ASCII-строки. Чтобы избавиться от этой ошибки, пришлось явно создавать объект std::string. Почему возникла эта ошибка?
>Использует ли тут кто Makefile?
Я.
> Я что-то ни черта понять не могу, что делают шаблонных правила? Можете объяснить своими словами?
Ну работают по шаблону)))00
В большинстве случаев лезть в шаблонные правила не нужно, они и так есть неявно. Достаточно переопределить всякие CPPFLAGS, CXXFLAGS, LDLIBS и указать зависимости бинарников от объектных файлов. А остальные зависимости находить с помощью компилятора и подключать *.d-файлы.
Ах, да. Самое главное — не забыть написать
LINK.o=$(LINK.cc)
>"Нелья преобразовать const char * в std::string&"
Каждый божий день такой вопрос, блеать.
Потому что неконстантные ссылки не биндятся к временным объектам.
> Чтобы избавиться от этой ошибки, пришлось явно создавать объект std::string
Если компилятор пропустил что у тебя в 15-й строке, то это значит, что у тебя MSVC.
Сап
Нужно заменить первый столбец матрицы "x" на столбец матрицы "у",выполнить функцию, вернуть все обратно, заменить второй столбец, функцию и все эти действия до конца матрицы "x".
Как заменить конкретный столбец? А то у меня вообще все заменяются
https://pastebin.com/C3D8yjeP
За сколько времени можно вкатитсья в кресты, если буду хуярить по 4-5 часов в день?
Это не лаба.
А смысл тогда этих тредов? Вверху один срач, и я не думаю, что мой вопрос требует много времени для ответа более опытных кодеров.
>>989248
Двумерный массив - это может быть указатель на массив чисел, он же двойной указатель он же указатель на массив указателей, каждый из которых является адресом первого элемента массива.
Короче, тебе надо сделать что то типа такого:
for (auto i = 0;i<2;i++)
X=Y;//Или Y[0], если у тебя Y - не одномерный массив, а двумерный.
проебался. в цикле X конечно же.
Ах блять, разметка. В цикле X квадратная скобочка открывается))) i квадратная скопочка закриваеться))0.
Ничем вкатываюсь с нуля. Пока правда не думал чем буду заниматься. Хотел с лаб начать, потом уже определиться что хочу на нем делать.
STL - это такая вещь, которую, грубо говоря, можно хоть из другого компилятора взять. Если есть компилятор, есть и STL.
Бляя, все через пизду, еще один тупой вопрос, не ругайте. Замена работает правильно но ебучий детерминант считается правильно только для первой замены, дальше все по пизде едет.
При втором вызове функции det_x присваивается значение первого детерминанта, а не единица, как исправить?
Имхо, учить плюсы с нуля плохая идея. Я сам начинал в универе с плюсов, потом продолжил на С#, и только потом совсем недавно вернулся на кресты. Тебе тоже посоветую начать с шарпа, потому что на шарпе ты сразу же будешь учиться именно программировать, а не ебать мозги с особенностями синтаксиса и компиляции крестов. А потом, когда на шарпе разберешься с ООП, паттернами программирования, многопоточностью/асинхронность, сетевым программированием и почувствуешь, что шарпа тебе недостаточно для твоих целей, тогда можешь осваивать синтаксис и тонкости крестов. А так, бросясь с нуля сразу в кресты, ты только усложнишь своё обучение программированию и повысишь риск того, что тебе оно надоест/станет слишком сложным для освоения.
Вообще, шарп тоже неплохой язык и на нем можно делать деньги, правда делают на нём в основном не то, что на крестах.
Ну с лаб и начинай.
Есть много литературы по плюсам с теорией и самостоятельными заданиями, их и решай
Потому что "строка" - это куча символов где-то с нулём в конце, а std::string - объект известного размера, и компилятор не обязан создавать string из "строки" (ака строчный литерал).
a, ok.
Вот тут мнения почему-то расходятся. Одни говорят, что надо с чего-то сложного начинать типа крестов. Другие наоборот - с простого.
Имелась в виду не только библиотека шаблонов контейнеров, а вообще вся плюсовая (C++11 хотя бы) библиотека: <thread>, <atomic>, <chrono> и т. д.
https://developer.android.com/ndk/guides/cpp-support.html
Тут, например, про LLVM libc++ они пишут, что она у них нихрена не стабильная. И вообще предлагают выбирать из нескольких плюсовых библиотек. Значит у всех них, вероятно, есть какие-то проблемы, иначе они бы написали "юзайте вот эту библиотеку и всё будет нормально".
Начинать программировать с ооп макарон и тонны ключевых слов? Пускай учит Perl/Python
Учу плюсы с нового года (медленно и неторопливо), все никак понять не могу, почему кодеры используют char* вместо string?
Головка от хуя.
>>989434
ЕМНИП, потому, что, если надо передать часть строки, надо копировать её. Олсо, некоторым больше нравится набор str*(), чем методы string, а результат всё равно один - байтоёбство и хорошая скорость.
В C++17 завезли string view, вот тут и заживём (что мешало сделать const string-конструкторы, которые ничего не меняют?).
Тому что стринг это не базвый тип. Не у всех подключено. Даже если ты в своем проектике и пользуешься каким-либо библиотечным стрингом, всеравно любые связи с другими либами будут через чар указатель, тошо каждый мудак мечтает написать свою реализацию стринги.
Без надобности тратится процессорное время и память на создание и удаление объекта string.
>всеравно любые связи с другими либами будут через чар указатель, тошо каждый мудак мечтает написать свою реализацию стринги.
Из чего делать связи со статическими либами - пофигу (хоть через std::set, хоть через vector, хоть через аллаха), а вот с динамическими могут быть проблемы.
обратная совместимость с C.
неверно, пошел ТЫ
>>989587
обломится, я знаю, это тебе он не обломится
но все же помощь с пониманием рекурсии и формул ньютона была бы замечательной
Так рекурсия или полиномы? Судя по всему, нет даже базовых навыков? Сходи на Степик, найди курс Шеня. Через месяц инварианты начнёшь видеть даже в небе.
Ну или Кормена почитай, например.
у меня есть базовое понимание рекурсии, но я не знаю как превратить полином в рекурсию
Я бы тебе даже ответил, но я не знаю, что ты спрашиваешь. Начни с википедии.
Библиотека может быть статической и динамической. Динамическая библиотека может быть прописана в зависимостях PE, а может подгружаться кодом.
Для того, чтобы динама подгрузилась сама, тебе не нужно ничего делать в коде.
http://stackoverflow.com/questions/32562242/static-and-dynamic-linking-in-visual-studio
Дальше сам гугли.
Это параметр на картинке?
С одним из параметров есть информация об именах всего мною перечисленная, а при другом - вообще никакой информации?
Картинку забыл, блять.
Информацию о том, что ты использовал, можно выудить косвенно, но намеренно вписывать её, если вот эта шняга выключена, компилятор не будет.
Я спрашиваю, потому что читал про использование уточнение декларации extern "C" { }, но не особо въехал в причины необходимости. На msdn'е что то говорится, что компилятор C++ имена функций и переменных являются не то виртуальными не то еще какими то, а в C, мол, такого нет, и чтоб C мог подхватывать функции из хэдеров C++ нужно их вот так объявлять. Так во что или как тогда компилируются имена переменных и функций в крестах и на си?
что компилятор C++ имена функций и переменных делает не то виртуальными, не то еще какими*
Так бы и сказал, что либу пишешь. В выводе компилятора будут все extern-переменные с именами и все extern-функции с именами. С extern C они могут быть использованы программой, собранной любым компилятором (аргументы не включены в описание процедур, вроде), без него - только с тем компилятором, который шифрует имена таким же образом (гугли name mangling, это кодирование аргументов функций).
В статических либах это неважно.
>и компилятор не обязан создавать string из "строки" (ака строчный литерал).
Обязан, см. 5-й конструктор http://en.cppreference.com/w/cpp/string/basic_string/basic_string
Зачем ты лезешь с умозрительными рассуждениями? Проследуй в ньюфаг-тред.
Тупой ебанат. Прочти сообщение, на которое я отвечал - чувак хочет передавать строчный литерал вместо std::string без создания std::string.
Нассал тебе в ушко.
overload-ов по возвращаемому значению в C++ нет.
Речь видимо идёт о name mangling. Смотри, вот тебе пример на крестах ( https://godbolt.org/g/A1D5Bp ):
int add(int x, int y) { return x + y; }
int add(int x, int y, int z) { return x + y + z; }
Эти функции не могут храниться под одинаковыми именами. Поэтому компилятор генерирует функции с именами, в которых содержится дополнительная информация о типе аргументов например. Но сишка-то об этом не знает, в сишке mangling'а нет, так что для сишки нужно объявлять без mangling'а.
https://en.wikipedia.org/wiki/Name_mangling#C.2B.2B
Тупой ебанат. Компилятор создаёт временный std::string, если ты передашь const char[N] в месте аргумента std::string.
А теперь вернись в php-тред.
Посоны, дайте наиболее правильный и простой пример заполнения динамического массива с задаваемой пользователем размерностью рандомными ДЕЙСТВИТЕЛЬНЫМИ числами.
Идиот, блядь.
>ДЕЙСТВИТЕЛЬНЫМИ числами
Современная вычислительная техника все еще находится на приблизительно уровне каменного века, и работать с действительными числами не умеет. Еще даже вроде 128-битных регистров нет. Жди появления процессоров с бесконечным размером регистров.
KEK
Создаёшь указатель
float* floatArray = new float[n]
на массив чисел типа float (или double для большей точности). n - переменная, определяемая пользователем, необязательно константная. А если хочешь поведения как у vector, но создавай структуру-обёртку типа
struct myVector<T>
{
}
и определяй в нём методы push, pop, reserve. Думаю, в STL'овских векторах там либо те же new-delete, либо через WinAPI VirtualAlloc какой нибудь.
Как правильно иницировать цикл от нажатия определенной клавиши до нажатия другой?
Если я допустим делаю
char y = getch();
while (y = 'y'){}
То как я смогу изменить значение y, не заставляя цикл остановиться?
>>989956
http://en.cppreference.com/w/cpp/numeric/random/
>>990067
>То как я смогу изменить значение y, не заставляя цикл остановиться?
Ты либо хочешь бесконечный цикл, либо ты перепутал = с ==, либо тебе нужно сохранять y во вторую переменную, менять и восстанавливать в конце тела цикла из копии.
Как я могу в цикле изменить значение у, не заставляя его остановиться.
Ведь если я сделаю
char y = getch();
while(y == 'y'){
/*/
y = getch();}
он выполнит цикл однажды, а затем будет ждать другого нажатия кнопки.
Давно убрал. Просто я люблю тыкать людей в их незначительные ошибки.
Пожалуйста, скажите это же пузырек?
Не скажу.
Бля почисти интерфейс и настрой подсветку
нет
Почему?
Тип и две звёздочки
Используй std::array
Порядок изложения вопроса - пиздец. Тебе не переменную менять нужно, тебе нужно асинхронно читать из stdin. Нет способа для того, чтобы посмотреть, есть в stdin новые символы или нет. stdin - это не интерактивная сущность, у него есть только два состояния: eof и "щас прочитай что-нибудь, и если появится eof, я те скажу". Для интерактивной работы с клавиатурой нужны другие инструменты, и для того, чтобы сделать то, что ты хочешь, и именно через stdin, где-то в этом инструменте должна быть асинхронность (два потока - один main, другой читает).
>>990140>>990367
В глазки любишься? Посмотри все овтеты на свои посты.
>>990182
Родина дала тебе std::swap. Олсо, за один проход пузырёк не работает, так что нет.
>>990427
std::array - его можно использовать везде, где ты можешь использовать сишный массив.
Вообще, проблема, кажется, в tableView...
Вылетает на
"
ui->tableView->setModel(model);
ui->tableView->show();
"
https://pastebin.com/NpNtPs2b
Вот исходники
>Это чистый СИ,
Это крестотред. Очень приятно, чаю хотите?
>>990715
Всё-таки, на какой из двух?
Не понял вопроса.
Форма и класс под нее, по сути, автосгенерированы QtCreator'ом
>>990749
На setmodel вылет.
Что за цветовая схема? Поделись, пожалйста
Тогда можно потелепатировать: как сделать в QtC такую форму, с которой программа будет вылетать?
>private Ui::Dialog
Зачем наследовать сгенерированный класс? Никогда такого не видел, он должен быть полем в классе (указатель на не существующий в хедере тип), а "ui_dialog.h" подключается в cpp файле. setupUi(this); вызывается в самом начале конструктора.
Если что-то другое сегфолится - запускай дебаггер и смотри где проблема.
>>990813
https://yadi.sk/d/mFpUP-fP3JA3eW
Вот файл проекта. Наследование прописалось автоматически при , опять же, создании формы в QtC
Если тебе на мейлаче скажут, что нет, а работодатель скажет, что да - будешь в этот тред ссылаться?
Если у тебя есть два потока, которые, для примера, должны выполняться на разных ядрах процессора, то вполне может сложиться ситуация такая:
на первом ядре:
1. значение х считывается из памяти
2. что-то делается со значением х
на втором ядре (и втором потоке соответственно):
1. переменная х изменяется
2. что-то еще
Так вот, синхронность операций между потоками не оговорена, поэтому первый поток может считать устаревшее значение, даже если второй поток уже изменил его, потому что первый поток на своем первом ядре полезет в горячую память кэша, не промахнется при этом и увидит, что там значение, скажем 2. А второй поток уже в тот момент времени записал в ту же ячейку памяти значение, скажем 3. Так вот до тех пор, пока область кэша, где хренится х не инвалидирована, каждое ядро будет видеть такое значение х, которое было получено при предварительной выборке.
Для этих дел уже издревле придумали атомарные операции. Но с "небольшим" промедлением они попали в 11 стандарт.
А своего воображаемого коллегу ты не можешь спросить про то, на чём он основывает свой бред?
>>991694
Это не специфично для ссылок.
Любой объект можно хранить по ссылке. Тот же указатель только со слегка измененной семантикой.
Ничто не мешает тебе сделать такое, к примеру:
class A {
public:
A(int &x) : _x(x) { }
private:
int &_x;
};
Конкретно ссылка не может не "обновиться", потому что ссылка реализуется через указатель. Но в некоторых ограниченых случаях компилятор действительно может соптимизировать и закешировать значение переменной (в регистре процессора). Для таких случаев есть ключевое слово volatile которое запрещает кеширование. Но это касается переменных вообще всех, а не именно костантных ссылок. Очень маловероятно что константные ссылки как-то еще более агрессивно оптимизируются, так как это будет приводить к слишком не предсказуемым результатам, причем в и так изначально очень ошибконебезопасной ситуации (многопоточность с разделяемым состоянием).
delete [] arrayName;
Нарисуй макет крутяшки, в ФШ или еще где сотри весь фон (шоб прозрачно всё было, кроме рисунка), потом налепи на canvas/image и крути его изменением угла наклона
Мы очень за тебя рады.
В общем как мне посимвольно считывать текстовый файл? Функция get из библиотеки ifstream упирается в конец первой строки не переходя на новые строки.
Гугли Ахо, Ульман Компиляторы. Принципы, технологии и инструменты
Не устанавливаю никакие локали. Пробовал даже английскую ставить специально - хуй. Проверял, и SetConsoleOutputCP, и SetConsoleCP обе возвращают тру. Пробовал проверять кодировку GetConsoleCP, она говорит, что все норм и кодировка действительно 850.
Попробуй чисто для прикола создать буфер, заменить им текущий, а для оригинального - закрыть хэндл и удалить, и уже на новом буфере воткнуть новую кодировку.
Это зашитый текст в исходниках неправильно выводится (попробуй сменить кодировку исходников)? А если считать строку и вывести?
Короче, вот код:
[CODE]void main(void)
{
HANDLE wHnd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCP(850);
SetConsoleOutputCP(850);
CHAR_INFO consoleBuffer [256];
for(int i = 0; i < 256; i++)
{
consoleBuffer.Char.AsciiChar = i;
consoleBuffer.Attributes = 15;
}
COORD charBufSize = {64, 4};
COORD characterPos = {0, 0};
SMALL_RECT writeArea = {0, 0, 64, 4};
WriteConsoleOutputA(wHnd, consoleBuffer, charBufSize, characterPos, &writeArea);
COORD cursorPos = {0, 4};
SetConsoleCursorPosition(wHnd, cursorPos);
printf("%d\n",GetConsoleCP());
printf("%d\n",GetConsoleOutputCP());
char str[80];
scanf("%79s", str);
printf("%s\n", str);
system("pause");
}[/CODE]
Пикрелейтед - результат его работы. Символы кириллицы при печати отображаются вопросами, но через WriteConsoleOutputA настойчиво печатаются именно они, какая бы кодировка не стояла. Пробовал даже греческую ставить - хуй там, кириллица.
Короче, вот код:
[CODE]void main(void)
{
HANDLE wHnd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCP(850);
SetConsoleOutputCP(850);
CHAR_INFO consoleBuffer [256];
for(int i = 0; i < 256; i++)
{
consoleBuffer.Char.AsciiChar = i;
consoleBuffer.Attributes = 15;
}
COORD charBufSize = {64, 4};
COORD characterPos = {0, 0};
SMALL_RECT writeArea = {0, 0, 64, 4};
WriteConsoleOutputA(wHnd, consoleBuffer, charBufSize, characterPos, &writeArea);
COORD cursorPos = {0, 4};
SetConsoleCursorPosition(wHnd, cursorPos);
printf("%d\n",GetConsoleCP());
printf("%d\n",GetConsoleOutputCP());
char str[80];
scanf("%79s", str);
printf("%s\n", str);
system("pause");
}[/CODE]
Пикрелейтед - результат его работы. Символы кириллицы при печати отображаются вопросами, но через WriteConsoleOutputA настойчиво печатаются именно они, какая бы кодировка не стояла. Пробовал даже греческую ставить - хуй там, кириллица.
И что это должно было поменять?
Что будет, если выводить коды символов а не сами символы (выводи вместо символов числа, проще говоря). И второе, какого хуя вонючий WinAPI делает в треде про кресты, это ж ЦЭ!
Тогда он выводит числа с 0 по 127 по порядку, затем идет -128, -127, -126 и так до -1. При любой кодировке.
У меня все норм(кроме ру ввода). Зачем тебе 850ср если есть юникод?
Ну вот почему у тебя норм, а у меня - нет? Я это хочу понять. В гугле вообще инфы нет.
Ну вообще на крестах нет смысла сидеть, если хочешь какой-то бабос получать.
как?
Действительно, после смены шрифта работает. Только в других шрифтах первые символы, которые заменяют непечатные (☺☻♥♦♣♠ и тд) отображаются квадратами. Какой шрифт у этого >>993063 ?
Consolas, похоже
Вангую что-то из base16
Такой вопрос: Почему для инстанцированных классов создаются только те методы, которые были использованы?
Вы видите копию треда, сохраненную 14 июня 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.