1

(564 відповідей, залишених у Інше)

FakiNyan написав:

в мене тут думка з'явилась, а що, якщо ми не будемо перемножувати те, що виділене жовтим, а просто розкриємо дужки?

про яке перемноження ви говорите? зелене і синє рівняння якраз є наслідком розкриття дужок жовтого і зведення подібних доданків

2

(564 відповідей, залишених у Інше)

висновок ваш виглядає правильниним

стосовно синього рівняння, продовжу з моменту коли ми розклали жовте на

зелене - синє

тепер додамо до нашого ріняння таку конструкцію яка ніяким чином його не змінить

зелене - синє + оранжеве - оранжеве

погрупуємо їх

(зелене + оранжеве) - (синє + оранжеве)

і тепер відповідно перша група перетворилась на червоне, а друга - на сіре
можете це перевірити вручну розкривши квадрат сірого рівняння

Betterthanyou написав:

Так в С++ використовується std::array, хіба ні ? Те що ви написали це С стиль.

C стиль, який успішно перекочував в С++
до речі ось і сам стандарт, де на 179 сторінці 8.3.4 йдеться про оголошення масивів

а std::array це бібліотечна обгортка над звичайними масивами

Betterthanyou написав:

Так я можу написати
https://msdn.microsoft.com/en-us/library/zb1574zs.aspx

Звичайно можете, тільки раз ви послуговуєтесь с++ ним бітсетом, то і не вмішуйте сюди сішний стандарт,
а с++11 стандарті масив ініціалізується constant-expression'ом


Yola написав:

Дійсно нема причин окрім бажання/небажання постачальників компліторів, щоб втілити масиви розмір яких визначається під час виконання. gcc дозволяє такі масиви. Але це інше ніж відмінні типи.

З масивами це всього лише скільки пам'яті виділити на стеку. І це можна визначати кожен раз при виклику функції в якій цей масив оголошено.

З типами інакше, щоб використовувати тип потрібно знати адреси всіх його функцій, і це треба знати під час компіляції. І взагалі, чи ця функція у типа є, бо bitset<5> і bitset<6> можуть мати різні набори членів.

Я розумію, я хотів донести інше, що як з шаблонами так і з масивами - їх тип\розмір повинен бути відомим на етапі компіляції, тому просту змінну туди і не засунути

Betterthanyou написав:

Можна вставити не константне значення у виклик функції з нетиповими параметрами шаблонів?
наприклад bitset

int b;
std::cin>>b;
std::bitset<b>(0b1100);

(Я вже пробував використовувати явні конвертації - не допомагають, помилка error: the value of ‘b’ is not usable in a constant expression)

По тій же причині, що ви не можете написати так:

int a;
cin >> a;
int arr[a];
Прихований текст
http://www.cplusplus.com/reference/bitset/bitset/
The size of a bitset is fixed at compile-time (determined by its template parameter).

ви викликаєте неконстантний гетер у константному методі

якщо ви початківець, то вам краще обарти рішення у якому все йде "з коробки", тоді ви зможете сконцентруватись на написанні коду, а не танцях з бубном довкола нього
тому як казали вище на перший час беріть microsoft visual studio
коли втомитесь від тормознутості студії переходьте на Qt Creator

8

(8 220 відповідей, залишених у Інше)

вона прийде коли ви будете завалені домашкою

9

(6 відповідей, залишених у C/C++)

спробуйте для початку просто вашим компілятором зібрати два варіанти, щоб визначити, чи проблема в тому, що чогось бракує вашій системі, чи cmake'у

виведіть ще sizeof(size_t), а то всяке буває

10

(564 відповідей, залишених у Інше)

дивіться де вони посилаються на пункт 1.37

11

(564 відповідей, залишених у Інше)

1) (a - b)^2 = a^2 + b^2 - 2*||a||*||b||*cos
2) (a - b)*(a - b) = a^2 - 2*a*b - b^2

(a - b)^2 = (a - b)*(a - b)   ==>>  1) і 2) еквівалентні

перпеписуємо праву частину 1) і 2) скоротивши (a^2 + b^2), які фігурують в  них обох

- 2*a*b = - 2*||a||*||b||*cos

а для чого вони це довели вам краще знати, ви підручник читаєте

12

(5 відповідей, залишених у C/C++)

Arete написав:

std::thread::hardware_concurrency() може повернути нуль, на який ви потім ділите.

Якщо я впевнений в тому що в мому компіляторі цей метод реалізований, то нормально буде на перший час обійтись таким рішенням?

int threadsCount = std::thread::hardware_concurrency() || 1;
koala написав:

По-третє, ви дивно обчислюєте кількість операцій на потік. Припустимо, є 4 ядра і 15 об'єктів. Тоді:
end = 14;//!
part = 14 / 4 = 3;//!!!
Потоки отримають:
i = 0 => 3 елементи
i = 1 => 3 елементи
i = 2 => 3 елементи
i = 3 => 5 елементів
Разом - 14 елементів. І сподіваюся, ваші потоки лізуть на дані іншого.

Я забув, що я не на форумі телепатів та не уточнив, що [start; end) формують напів-відкритий проміжок

for (i = start; i < end; i++){}

Тобто у випадку коли є 15 об'єктів - end=16

Але ваше зауваження наштовхнуло мене трохи  переобити алгоритм для більш збалансованого розподілу

float part =  (float)(end - start) / (float)threadsCount;
for (int i = 0; i < threadsCount; ++i)
{
    int startInd = part * i;
    int endInd = part * (i + 1);
    threads[i] = std::thread(threadFunc, startInd, endInd, std::ref(vertices));
}

i = 0 => 3
i = 1 => 4
i = 2 => 4
i = 3 => 4

koala написав:

Ну і по-четверте, не зовсім зрозуміло, нащо вам std::ref, тим більше, що threadFunc не reference_wrapper приймає.

у reference_wrapper реалізований оператор приведення до посилання operator T& ()
і використовувати його потрібно тому, що оскільки аргументи з якими створюється потік копіюються в новий стек, то передавши аргумент який має бути посиланням без std::ref в потоці ми отримаємо посилання на скопійований обк'єкт

Прихований текст
The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with std::ref or std::cref).

13

(5 відповідей, залишених у C/C++)

Доброго вечора всім

Мав я значить один фор, який опрацьовував вектор vertices

Вирішив я його пришвидшити потоками: виніс тіло фору в функцію і передаю в неї межі які кожен конкретний потік має опрацювати
А по завершенню всі вони мають синхронізуватись, на тому ж місці де це зробив би і однопоточний фор

Гляньте чи не наткнусь я таким чином на якісь підводні камені, та і взагальному чи є якісь зауваження

void threadFunc(int startInd, int endInd, const std::vector<Vector3> & vertices);
int start = 0;
int end = vertices.size() - 1;
int threadsCount = std::thread::hardware_concurrency();
int part = (end - start) / threadsCount;

std::vector<std::thread> threads(threadsCount);
for (int i = 0; i < threadsCount; ++i)
{
    int startInd = part * i;
    int endInd = (i == threadsCount - 1) ? end : part * (i + 1);
    threads[i] = std::thread(threadFunc, startInd, std::ref(vertices));
}
for (int i = 0; i < threadsCount; ++i)
{
    threads[i].join();
}

По великому рахунку в кінцевому результаті різниці для користувача не буде, але насправді ж ви виконуєте лишнє копіювання об'єктів на які вказують вказівники data0 та data1.

В даному випадку це ускладнює тільки розуміння коду, але уявіть якби ці об'єкти були тяжкими, або їх було багато, тоді б це копіювання зайняло б чимало часу.

bool getData(int *data0, int *data1)
{
    int tmpdata0 = *data0;
    //*data0 - розіменовуєте вказівник, тобто ця операція поверне значення на яке він вказує
    // і воно скопіюється у змінну int tmpdata0

    readUInt(TSL2561_REG_DATA_0, &tmpdata0);
    //передаєте адресу копії у функцію readUInt, де вона присвоїться іншому вказівнику
    
   *data0 = tmpdata0;
   //повертаєтесь до початкового вказівника та замінюєте його попереднє значення
   //на значення цієї копії яка якось опрацювалась у функції readUInt

    return true;
}

Весь цей код скорочується до варіанту описаного у вашій першій функції: коли ви в readUInt передаєте безпосередньо вказівник, і тоді скопіюється лише вказівник, а не сам об'єкт.

bool getData(int *data0, int *data1)
{
    readUInt(TSL2561_REG_DATA_0, data0)
}

15

(4 відповідей, залишених у C/C++)

gets забрали в стандарті с11
використовуйте fgets натомість, або послуговуйтесь компілятором який підтримує старіші стандарти

16

(18 відповідей, залишених у C/C++)

А в першій частині я так розумію мова йде про максимальне число з усіх непарних елементів в масиві, та мінімальне з усіх парних

17

(15 відповідей, залишених у JavaScript)

https://jsfiddle.net/cxhexdyw/
зробив скейл у напрямку довільного вектора (перпендикуляр до заданої лінії в мому випадку)

моменти які варто виділити:
як заскейлити зображення під довільним кутом
API для роботи з канвасом по замовчуванню дає можливість скейлити зображення тільки відносно координатних осей. Тому нам потрібно перетворити координатну площину таким чином, щоб наш вектор став в рівень з однією з цих осей. Після перетворення ми можемо заскейлити його звичним спочобом по "х" чи "у" (в залежності від того до якої осі ми рівнялись). Після того як скейл змінено нам потрібно повернути координатну площину до початкового її стану, тому застосовуємо протилежні перетворення до тих, які ми робили в першому кроці:

var angle = Math.atan2(line.b.y - line.a.y, line.b.x - line.a.x);//знаходимо кут до осі У

ctx.rotate(angle); //крутимо координатну площину, щоб вектор скейлу став в рівень з віссю У
ctx.scale(1, scale); //скейлимо площину
ctx.rotate(-angle); //повертаємо її на місце

ctx.drawImage(... 

як зафіксувати нерухому точку при перетворенні
це потрібно для того, щоб розмістити в правильному місці заскейлене зображення
Згрубша алгоритм такий:
зсуваємо координатну площину до потрібної точки (в даному прикладі це центр лінії яка є перпендикуляром до напрямного вектора)
потім застосовуємо потрібні нам перетворення (rotate, scale)
і при малюванні зображення початкові його координати задаємо як координати тої самої точки тільки зі знаком "-"

var midX = (line.a.x+line.b.x)/2; 
var midY = (line.a.y+line.b.y)/2;
  
ctx.translate(midX, midY);

ctx.drawImage(canvasSource, 0, 0, canvasSource.width, canvasSource.height, 
  -midX, -midY, canvas.width, canvas.height);

По суті якщо зображення ніяк не вертіти, то зображення намалюєтсья без змін, а якщо змінити rotate, то буде видно що зображення поркутилось не довкола лівого верхнього кута, а довкола заданої точки


сильно допомогла стаття http://codetheory.in/canvas-rotating-an … lar-point/

18

(143 відповідей, залишених у Інше)

Lace написав:

Хто-то нагріє руки, так це продавці заліза.

Якщо хочеш розбагатіти під час золотої лихоманки, то потрібно якомога далі триматись від золота :)

В золоту лихоманку продавай лопати

19

(2 відповідей, залишених у Обговорення)

Для роботи з вордом я б використовував бібліотеку https://python-docx.readthedocs.io/en/latest/
Як задати вирівнювання https://python-docx.readthedocs.io/en/l … halignment

А для екселю вибирайте щось зі списку http://www.python-excel.org/
Якщо ж ви зовсім новачок, то краще дивіться сюди https://habrahabr.ru/post/232291/

Надалі учіться вчитись, ніхто за вас гуглити не збирається

Прописуєте шлях до компілятора у PATH, тоді

cppcompiler mycppfile.cpp -o programname.exe

http://www.mingw.org/wiki/mingw_for_fir … sers_howto