Страницы

Поиск по вопросам

четверг, 4 апреля 2019 г.

Определение размера массива

Обычно делают так:
sizeof / sizeof [0]
Но ведь, — указатель на первый элемент ( == &[0]). Тогда почему sizeof возвращает корректный размер массива. Нигде же не хранится его размер.


Ответ

Если name_array объявлен именно как массив, то объект name_array - не указатель на первый элемент. name_array - это именно массив. Значение типа массив, однако, может неявно приводиться к указателю на свой первый элемент. И в языке С массив действительно сам по себе неявно приводится к указателю на свой первый элемент во всех контекстах, за исключением четырех
Операнд оператора sizeof Операнд унарного оператора & Строковый литерал-инициализатор для символьного массива Операнд оператора _Alignof
Ваш случай - как раз один из тех, в которых массив остается массивом. Поэтому sizeof возвращает размер массива, а не размер указателя.
Ваше замечание про "Нигде же не хранится его размер" не совсем понятно. "Классический" sizeof является выражением (константой) времени компиляции. Размер любого типа, разумеется, известен компилятору на стадии компиляции. sizeof же примененный к VLA вычисляется во время выполнения, но размер VLA как раз таки действительно хранится во время выполнения.

Обработка AJAX - запроса

Получаю страницу ajax - запросом
$.ajax({ url: 'sortmonth', success: function(data){ } });
Как получить данные из конкретного div?К примеру в data передалось:


Как получить данные из div 'container'?


Ответ

Ну так давайте сделаем...
var dynamicPage = `

DATA
`; var parser = new DOMParser(); var doc = parser.parseFromString(dynamicPage,"text/html"); var val = doc.getElementById('container').innerHTML; console.log(val);
Плюсы: Не используем сторонних библитоек. Получаем объект с которым можно работать как с обычным документом. Минусы: Формально это технология эксперементальная. Но поддерживается всеми браузерами с ИЕ 10. ИЕ9 не поддерживает.

Потокобезопасная коллекция с#

Привет. Искал инфу про потокобезопасную коллекцию и почти везде такой код:
Добавление в коллекцию
public void Add(int value) { lock(sync) { Add(value); } }
тут sync это
private object sync = new object();
Я вставил себе.
public void Add(TkeyId keyId, TkeyName keyName, Tvalue value) { lock(sync) { if (this.Where(g => g.Key.Name.Equals(keyName) && g.Key.Id.Equals(keyId)).Count() > 0) return; this.Add(new UserKey(keyId, keyName), value); } }
Так вот вопрос в чем прикол.Как он блокирует за счет чего. Простым языком объясните


Ответ

Конструкция lock гарантирует следующее: два блока
lock (p) { // тут содержимое блока }
бегущие в разных потоках, никогда не будут выполнены одновременно, если объект p один и тот же.* Если один поток находится внутри lock, то другой будет ждать окончания выполнения этого блока. В этом и состоит суть блокировки.
Как именно технически это реализуется, не так уж и важно. В C# lock вызывает конструкцию Monitor.Enter, а она, в свою очередь, внутри кода BCL реализует функциональность, подобную CRITICAL_SECTION самостоятельно, используя короткий холостой цикл (spin wait) и системные примитивы синхронизации. На других системах, разумеется, используются другие синхронизационные функции ОС. Как именно работают эти функции — внутренняя подробность устройства ОС (завязанная, надо думать, на системный планировщик потоков).
Главное — знать, что внутрь lock'а на один и тот же объект два потока проникнуть не могут.

*Также она гарантирует нужные memory barrier'ы для многопоточного сценария, но это неважно в контексте данного обсуждения.

Гибкость генетического алгоритма

Как сделать правильно гибкость генетического алгоритма (умоляю не советуйте A*), ну вот на примитивном примере движении машины к цели, обходя препятствие:
Что у нас есть :
У нас есть машина, она может двигать вперёд, влево, вправо, назад. Есть препятствие, если машина в него въезжает она ломается. Ещё есть цель, до которой наша машина должна добраться.

Так вот, вопрос в чём, как я понимаю наш генетический алгоритм проложит определённый маршрут нашей машины до цели (рис. 1), но если мы изменим карту (рис. 2), то этот же генетический алгоритм не доберётся до нашего места назначения, он просто сначала пойдёт по тому же пути и потом опять начнёт грубо говоря подбором (скрещиванием) подбирать маршрут, а как сделать чтобы он уже мог уверенно идти к цели основываясь на опыте (рис. 3) ?


UPD :


Ответ

Генетический алгоритм - это оптимизационный алгоритм. В отличие от алгоритмов машинного обучения (тех же нейронных сетей) он никак не опирается на "предыдущий опыт", а просто оптимизирует (т.е. максимизирует или минимизирует, в зависимости от задачи) какую-то целевую функцию при помощи подбора значений параметров этой функции.
При изменении исходных условий (изменение карты, расположение исходных и конечных точек) генетический алгоритм просто каждый раз с нуля будет строить маршрут.
Конкретно для этой задачи можно просто брать за первоначальный маршрут прямую линию из начальной в конечную точку, дальше начинать "мутировать" этот маршрут: добавлять/удалять узлы, смещать их, и т.д. В простых случаях "скрещивать" маршруты между собой не обязательно, но для сложных лабиринтов это может дать какие-то бонусы (можно с этим поэкспериментировать). В общем-то, если в исходном пути по прямой нет препятствий, то этот маршрут в итоге и выиграет. Если препятствия попадутся, то за счет штрафа за пересечение препятствий будет выбран другой маршрут, где препятствий нет.
Целевая функция - длина пути + штраф за пересечение препятствий (можно задать, что он будет зависеть от расстояния до края препятствия). Можно еще добавить штраф за количество узлов (чтобы они не сильно "плодились"), но он должен быть намного меньше штрафа за препятствия, иначе маршрут будет сходиться к прямой линии вне зависимости от наличия препятствий (тоже можно поэкспериментировать величиной штрафа).
Для простых карт приемлемое решение будет находиться достаточно быстро (зависит от силы отклонений от исходного маршрута при "мутациях").
Использовать нейросеть для этой задачи я бы не советовал, это как раз тот случай, когда самые "простецкие" алгоритмы работают достаточно хорошо при намного меньших усилиях со стороны программиста. Нейросети побеждают в других областях: классификация, распознавание, некоторые задачи, для которых вообще проблематично найти четкий алгоритм, но которые человек относительно легко решает интуитивно.

Не получается распарсить JSON

Есть вот такой JSON:
{ "sourceId": "currency-cash", "date": "2017-09-07T15:56:32+03:00", "organizations": [{ { "orgType": 1, "address": "ул. Автозаводская, 54\/19", "regionId": "0,7oiylpmiow8iy1smadi", "phone": "123", "link": "http:\/\/organizations\/ru\/info\/currency\/-\/7oiylpmiow8iy1smb0b\/cash", "id": "7oiylpmiow8iy1smb0b", "cityId": "7oiylpmiow8iy1smadi", "oldId": 1266, "title": "Bank", "branch": false, "currencies": { "EUR": { "ask": "31.6500", "bid": "30.9000" }, "USD": { "ask": "26.4500", "bid": "26.0500" } } }
А точнее это часть из файла. Как получить доступ, перебрать и вывести "currencies"? На данный момент вывожу всё, но как добраться до "currencies" не пойму.
JSONParser parser = new JSONParser(); JSONObject jsonObject = (JSONObject) parser.parse(new FileReader("cur.json"));
String objName = (String) jsonObject.get("sourceId"); System.out.println("Title: "+objName);
JSONArray org= (JSONArray) jsonObject.get("organizations"); // for(int i=0; i Iterator i = org.iterator(); while (i.hasNext()) { JSONObject innerObj = (JSONObject) i.next(); System.out.println("Банк: "+ innerObj.get("title") + " Адрес: " + innerObj.get("address"));
}
Используется json-simple.


Ответ

Если всё-таки интересует решение для simple-json, то можно вспомнить, что JSONObject является наследником HashMap, соответственно можно воспользоваться методом HashMap::entrySet
JSONObject currencies = (JSONObject) innerObj.get("currencies") for (Map.Entry entry : currencies.entrySet()) { String currency = entry.getKey(); JSONObject currencyInfo = (JSONObject) entry.getValue(); // ... }
Но вообще лучше использовать не simple-json, а что-нибудь другое, например gson

Не получается конвертировать Integer в String

Есть класс для работы с параметрами сетевых запросов
public class NeboParameters extends LinkedHashMap implements Serializable {
public NeboParameters() { super(); }
public NeboParameters(Map fromMap) { super(fromMap); }
public static NeboParameters from(Object... params) { if (params.length % 2 != 0) { throw new IllegalStateException("Params must be paired"); } LinkedHashMap result = new LinkedHashMap<>(params.length / 2); for (int i = 0; i + 1 < params.length; i += 2) { result.put((String) params[i], (String) params[i + 1]); } return new NeboParameters(result); } }
Все значения должны конвертироваться в String.
Вот пример
NeboParameters params = NeboParameters.from(NeboConst.USER_ID, 3484192, NeboConst.MESSAGE, "Тест2");
Значение 3484192 не конвертируется в String
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String


Ответ

Чтобы привести объект к строке, используйте метод String.valueOf
Object[] params = { 3484192, true }; for (Object obj : params) { System.out.println(String.valueOf(obj)); }
Или, если уверены в том, что объекты не равны null, напрямую метод toString
Object[] params = { 3484192, true }; for (Object obj : params) { System.out.println(obj.toString()); }

Как добавить символ в начало определённых строк?

Есть файл конфигурации, где есть определённый параметр. Какими командами можно поставить и убрать в начале строки параметра знак # ?
Пример файла
# /bin/bash /usr/local/scripts/program1 & /bin/bash /usr/local/scripts/program2 & # /bin/bash /usr/local/scripts/program3 &
exit 0
Нужны две команды, одна убирает знак комментария у program3, другая добавляет знак комментария обратно.
Параметр program3 может находиться в любой по счёту строке И если строка уже комментирована, то команда комментирования должна проигнорировать эту строку


Ответ

поставить символ # в начало строки, содержащей текст
$ sed -i '/текст/s/^/#/' файл
убрать символы # в начале строки, содержащей текст
$ sed -i '/текст/s/^#\+//' файл
поставить символ # в начало строки, содержащей текст, и начинающейся не с символа #
$ sed -i '/^[^#].*текст/s/^/#/' файл

Неверный порядок сортировки списка строк в python

Доброго времени суток. Я совсем недавно начал изучать python, поэтому прошу не кидать камнями, если я упускаю что-то очевидное. Гугл с моим вопросом не помог. Дело в том, что сортировка списка строк, которая, по идее, должна проводиться по алфавиту, но у меня происходит не совсем по нему. И я никак не пойму, отчего так. Вот есть, допустим, у меня такой код
inp = open("input", "r") outp = open("output", "w") lst = inp.read().split() lst.sort() for elem in lst: outp.write(str(elem) + "
") inp.close() outp.close()
В файле input у меня набор слов, по слову на каждой строке. Допустим, есть файл с такими данными(просто белиберда для проверки):
авыаы мрпр квуенуке авпвке цуеек авыронг авроанг аыуке гекекы енгнкекв ывавкеекц огшдн цййап выама пенк иаапре аукег венгера вкыкавп43у авапнеанне ноорвап ававыпен
А в файле output я получаю вот это:
ававыпен авапнеанне авпвке авроанг авыаы авыронг аукег аыуке енгнкекв ноорвап венгера вкыкавп43у выама иаапре квуенуке огшдн гекекы пенк мрпр цййап цуеек ывавкеекц
Ну вот какого черта, например, "венгера" идет после "ноорвап", ведь слова на букву "в" должны находиться перед словами на букву "н"? Также выходит, что слова на букву "и" идут после слов на букву "к", что, очевидно, неверно. И т.д. и т.п. Вроде бы слова на одну и ту же букву действительно "собрались вместе", то есть сортировка по алфавиту была произведена, вот только алфавит какой-то не такой. Помогите, пожалуйста, понять, что я делаю не так.
Update: Когда я решил просто вывести отсортированные буквы алфавита то получил это:
а б е ж з л н в и к о г п м д й р с ъ ь ю э я у т ф ц ч х щ ы ш
У python какой-то непонятно откуда взявшийся свой алфавит. Что это вообще значит?
При попытке сменить локаль при помощи locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8') python выдает ошибку
Traceback (most recent call last): File "search2.py", line 24, in locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8') File "C:\Users\andre\AppData\Local\Programs\Python\Python36\lib\locale.py", line 598, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting


Ответ

Ваш файл input сохранён в кодировке UTF-8.
Когда вы не указываете кодировку файла явно в методе open, питон для чтения или записи файла выбирает некую кодировку по умолчанию, которая зависит от системы.
В вашем случае в винде этой кодировкой оказалась не UTF-8, а cp1251.
В результате питон прочитал ваш файл в неправильной кодировке, и получилось вот так:
авыаы мрпр квуенуке авпвке цуеек авыронг авроанг аыуке гекекы енгнкекв ывавкеекц огшдн цййап выама пенк иаапре аукег венгера вкыкавп43у авапнеанне ноорвап ававыпен
Соответственно и правила сортировки изменились.
Наиболее простым и предпочтительным способом исправления этого будет явное указание кодировки файла при чтении:
inp = open("input", "r", encoding="utf-8-sig")
(Я указал utf-8-sig вместо utf-8, чтобы питон нормально обработал BOM, который любит добавлять виндовый Блокнот.)
Да и для записи желательно проделать то же самое:
outp = open("output", "w", encoding="utf-8")
(Здесь я указал utf-8 вместо utf-8-sig, чтобы BOM в выходной файл не добавлялся. Можете изменить это на свой вкус.)
Если вы хотите использовать другие кодировки в своих файлах, замените их на свои соответственно.

Как сделать постоянное обновление окна Tkinter? Как избежать подвисания на время ожидания ответа от сервера

Всем привет! для обновления окна использую
root.update()
Но если программа делает например запрос к серверу и долго не получает ответ- программа подвисает на время ожидания ответа. Как этого избежать и сделать так, чтобы программа была всегда активна? Спасибо! пример кода:
root=tk.Tk() def work (): requests.get(url) time.sleep(5) work() root.mainloop()


Ответ

Никогда никогда не используйте time.sleep(5) внутри цикла событий -- это замораживает ваше GUI на ~5 секунд. Используйте root.after(5000, some_action), чтобы выполнить код через 5 секунд в Tkinter.
Чтобы выполнить работу, которая требует не фиксированное время (такую как отправка/чтение данных из сети, используя requests.get()), следует либо вынести в фоновый поток (threading), либо встроить операции ввода/вывода в сам цикл событий (Widget.tk.createfilehandler()). Примеры кода по ссылкам можно посмотреть: Мультизадачность на Python: выполнить две долгие функции одновременно, не блокируя GUI Конкретно, вот пример для tkinter, который читает вывод из внешней команды (self.proc.stdout.readline()), не блокируя цикл событий:
вариант с фоновым потоком вариант без потока с createfilehandler()
Вот полный пример кода, который запускает requests.get() в фоновом потоке и обновляет показ текущего времени каждые 100 миллисекунд, пока запрос не завершится:
#!/usr/bin/env python3 import time import tkinter from datetime import datetime from queue import Empty, Queue from threading import Thread import requests
def display_result(label, q): try: label['text'] = q.get(block=False) except Empty: # update time at 100ms boundary label.after(round(100 - (1000 * time.time()) % 100), display_result, label, q) label['text'] = str(datetime.now().strftime("%H:%M:%S.%f")[:-3])
def get_result(q): # blocking function q.put('ip=' + requests.get('https://httpbin.org/delay/3').json()['origin'])
# get result in a background thread result_queue = Queue() Thread(target=get_result, args=[result_queue], daemon=True).start()
# display result root = tkinter.Tk() label = tkinter.Label(font=(None, 100)) label.pack() display_result(label, result_queue)
# center window root.eval('tk::PlaceWindow %s center' % root.winfo_pathname(root.winfo_id())) root.mainloop()
Чтобы обновить надпись (tkinter.Label) из другого потока, самый безопасный метод это использовать queue.Queue, как показано выше (то есть обращаться к label, только из потока с root.mainloop(), который её создал). Но если показывать прогресс не нужно (надпись прежняя остаётся пока блокирующий запрос не завершится), то в простых случаях можно обратиться и из другого потока напрямую:
#!/usr/bin/env python3 import tkinter from threading import Thread import requests
def fetch(url, on_response): requests.get(url, hooks=dict(response=on_response)) # blocking function
def on_response(response, **unused_kwargs): # NOTE: it is called from another thread label['text'] = response.json()['origin']
# get result in a background thread root = tkinter.Tk() label = tkinter.Label(font=(None, 100), text='no result yet') label.pack() url = 'https://httpbin.org/delay/3' Thread(target=fetch, args=[url, on_response], daemon=True).start() root.mainloop()
Современная реализация tkinter модуля в CPython пытается поддерживать обращение к tkinter объектам из других потоков. К примеру, если не включены потоки в Tcl интерпретаторе, то mutex расставляются, чтобы только один поток имел доступ к Tcl интерпретатору одновременно. Если включены потоки (tkinter.Tcl().eval('info exists ::tcl_platform(threaded)') == '1'), то обращения к Tcl из других потоков в очередь автоматически внутри tkinter добавляются и выполняются, когда управление вернётся на поток, где запущен Tcl интерпретатор (see all the gory details). Возможны баги, поэтому при возникновении любых проблем, обычно проще использовать упрощённую модель: все обращения к GUI объектам только в GUI потоке производятся.

WordPress и своя верстка

Вот не могу понять, как найти информацию по тому, как правильно натягивать свою верстку, чтобы можно было менять все в админке/настройка темы. Вот так:

Если несложно, дайте ссылки на информацию, как это реализовать без плагинов.


Ответ

То, что вы показали на картинке, называется Theme Customizer. Туда можно добавить свою секцию, а в нее - нужные опции.
Например, создадим секцию "Контакты для всего сайта" и добавим два телефона и почту. Для этого надо добавить нижеприведенный код в functions.php:
add_action( 'customize_register', function ( $customizer ) { global $global_email;
$customizer->add_section( 'section_contacts', array( 'title' => 'Контакты для всего сайта', 'description' => 'Контактная информация для страниц сайта', 'priority' => 20, ) ); $customizer->add_setting( 'section_contacts_moscow_phone', array( 'default' => '+7 (499) 322-33-22', ) ); $customizer->add_control( 'section_contacts_moscow_phone', array( 'label' => 'Московский телефон', 'section' => 'section_contacts', 'type' => 'text', ) ); $customizer->add_setting( 'section_contacts_federal_phone', array( 'default' => '8 (800) 322-33-22', ) ); $customizer->add_control( 'section_contacts_federal_phone', array( 'label' => 'Федеральный телефон', 'section' => 'section_contacts', 'type' => 'text', ) ); $customizer->add_setting( 'section_contacts_email', array( 'default' => 'info@mysite.ru', ) ); $customizer->add_control( 'section_contacts_email', array( 'label' => 'Email', 'section' => 'section_contacts', 'type' => 'text', ) ); } );
Использование:
$current_phone = get_theme_mod( 'section_contacts_moscow_phone', '' );
Результат:


Полезные ссылки на документацию по теме (из комментариев @HamSter и @SeVlad)
https://developer.wordpress.org/themes/customize-api/ https://developer.wordpress.org/themes/customize-api/tools-for-improved-user-experience/#selective-refresh-fast-accurate-updates https://make.wordpress.org/core/2016/11/10/visible-edit-shortcuts-in-the-customizer-preview/

Как удалить символ, который повторяется более N раз?

К примеру есть строка "111111333322" , и N=3. Так вот, вернуть должно 11133322, то есть, я удалил все повторяющиеся элементы после N и оставил кол-во символов равное N.
Такое вообще решить можно с помощью регулярного выражения или нет?


Ответ

var n = 3; var rex = new RegExp("((.)\\2{" + (n-1) + "})\\2+", 'g'); console.log("111111333322".replace(rex, "$1"));
Для двухзначных чисел через пробел:
var n = 3; var rex = new RegExp("(\\b(\\d+)(?: \\2){" + (n-1) + "})(?: \\2)+\\b", 'g'); console.log("23 23 23 23 26 26".replace(rex, "$1")); console.log("23 23 23 230".replace(rex, "$1")); console.log("2 2 2 2 2 230 30 30 30 30 30 0 0 0".replace(rex, "$1")); console.log("2 2 2 2 2".replace(rex, "$1"));

Обращение к массиву через переменную [дубликат]

На данный вопрос уже ответили: Как обратиться к переменной с id в имени? JS 1 ответ Есть массив massiv_228, и к нему нужно обратиться через другую переменную massiv (я в нее передаю уникальный ID). Я понимаю, что делаю неправильно, но не пойму как исправить.
Вот пример кода:
// Массив var massiv_228 = [ '44', '45', '49', '50', '51', ];
var ID = '228'; var massiv = 'massiv_' + ID;
$(massiv).each(function() { // Элементы массива });


Ответ

Плохой способ, но кажется, что по-другому строку не превратить в имя локальной переменной:
~function () { var massiv_228 = ['44', '45', '49', '50', '51']; var ID = '228'; var massiv = eval('massiv_' + ID); console.log(massiv); }()
По-хорошему надо пересмотреть подход и скаладывать массивы внутрь:
~function () { var data = { 228: ['44', '45', '49', '50', '51'] }; var ID = '228'; var arr = data[ID]; console.log(arr); }()

margin-top ребенка - сдвигает родителя - почему?

Вставляю блок, и даю ему margin-top: 50px - и он сдвигает родителя body в данном случае. Почему так происходит?
Если же дать padding-top: - тогда ок все
* { margin: 0; padding: 0; } body { outline: 1px solid red; } .logo-bg { outline: 1px solid orange; width: 100px; height: 100px; margin-top: 50px; }



Ответ

Это называется Выпадание внешних отступов (margin'ов)
Если внутри родительского блока расположить блок и задать ему отступ сверху, то внутренний блок прижмется к верхнему краю родительского, а у родительского элемента появится отступ сверху. Т.е. верхний отступ внутреннего элемента «выпадает» из родительского элемента.
Если у родительского элемента тоже был задан внешний отступ, то выберется максимальный отступ между собственным и «выпавшим». Чтобы избавиться от эффекта выпадания, можно задать родительскому элементу внутренний отступ (паддинг) сверху или добавить рамку сверху (border-top: 1px solid transparent).
Внешние и внутренние отступы всегда складываются.

Несколько init-expression в for

#include #include #include #include
using namespace std;
int Search(string* Array, int Size, string* Words) { ifstream *Read = new ifstream[Size];
for (int I = 0; I < Size; I++) { Read[I].open(Array[I]); if (!Read[I]) { cout << "Файл с именем: " << Array[I] << "не может быть открыт
"; } // В следующей строке в возникает ошибка I должно иметь константное значение //Ошибки нет, если "string Value" вынести из цикла //Почему возникает ошибка ? for (string Value, Read[I] >> Value; !Read[I].eof(); Read[I] >> Value) { // Что-то делающий код }
}
for (int I = 0; I < Size; I++) { Read[I].close(); } }


Ответ

В синтаксисе for
    for ( init-statement conditionopt ; expressionopt ) statement
первая часть - init-statement - является либо выражением, либо объявлением.
Вы изначально использовали синтаксис string Value, [...], который явно говорит, что в вашем случае в качестве init-statement вы хотите использовать именно объявление, а не выражение. Однако дальнейший синтаксис [...], Read[I] >> Value не является корректным синтаксисом объявления. Отсюда и ошибка.
(Странно, что вы в своем вопросе называете эту часть синтаксиса for "init-expression", хотя в вашем же примере это никакой не expression.)
Выбирайте: либо выражение, либо объявление. Перемешать выражение с объявлением вот так вот в лоб, как у вас, не получится.

Отловить первый запуск приложения

Объясните пожалуйста в теории, как отловить первый запуск приложения? Читал тут, не то, все слишком громоздко.


Ответ

В том вопросе просто кладут переменную IsFirstTimeLaunch в SharedPreferences, сразу после запуска приложения. Потом перед каждым запуском приложения проверяют её, если она проинициализирована и равна true, то приложение уже запускалось на данном устройстве.

Чем опасна слепая инициализация?

Прошу объяснить, чем опасна "слепая инициализация" на каком-нибудь примере из практики?
public class ShopActivity { private int revenue = Prefs.getRevenue(); }
Всегда ли нужно выносить код инициализации переменных в конструкторе? Когда можно сделать исключение?


Ответ

Компилятор переносит инициализацию полей в месте объявления (как и инициализацию полей в нестатических блоках) в конструктор (точнее говоря, во все имеющиеся).
Инициализация полей при объявлении и инициализация полей в конструкторе – это практически одно и то же. Разница лишь в том, что:
Инициализация полей в месте объявления происходит перед инициализацией полей в конструкторе. В случае инициализации полей в месте объявления невозможно перехватить исключение (при этом, если исключение checked, то нужно будет создать конструктор, который далее будет прокидывать возникшее исключение).

Указатель this c++

Добрый вечер. У меня такой вопрос, недавно лазил в инете и наткнулся на такой код: return*this*Fraction(fra.fenm, fra.fenzi); где fenm-числитель, а fenzi-знаменатель. Хотелось бы узнать, что означает такая запись *this*. Это указатель на класс или конструктор? Вот тот самы код. Если что есть ссылка ссылка на код
Заранее спасибо.
Fraction::Fraction(int zi,int mu):fenzi(zi),fenmu(mu){ if(mu==0){ cout<<"The denominator can not be 0!"<>(istream& in, Fraction& fra){ int mu,zi; cout<<"Please enter the denominator and numerator"<>mu>>zi; fra.setValue(mu,zi); return in; } void Fraction::setValue(int mu,int zi){ fenmu=mu; fenzi=zi; } Fraction Fraction::operator+(const Fraction &fra)const{ int a=fenzi,b=fenmu; //▲▲▲A key▲▲▲ //Be sure to use the const, not because it will make the last operational data assigned to the next operation in l-value //Because the const function cannot change the class of internal variables, so use avatars, if here with friend heavy load //It can effectively avoid this problem, because the friend overloaded operators have two reference parameters a=fra.fenmu*fenzi+fra.fenzi*fenmu; b*=fra.fenmu; int g=GreatestCommonDivisor(a,b); if (g!=1) { a/=g; b/=g; } return Fraction(a,b); } Fraction Fraction::operator-(const Fraction &fra)const{ int a=fenzi,b=fenmu; a=fra.fenmu*fenzi-fra.fenzi*fenmu; b*=fra.fenmu; int g=GreatestCommonDivisor(a,b); if (g!=1) { a/=g; b/=g; } return Fraction(a,b); } Fraction Fraction::operator*(const Fraction &fra)const{ int a=fenzi,b=fenmu; a*=fra.fenzi; b*=fra.fenmu; int g=GreatestCommonDivisor(a,b); if (g!=1) { a/=g; b/=g; } return Fraction(a,b); } Fraction Fraction::operator/(const Fraction &fra)const{ return *this*Fraction(fra.fenmu,fra.fenzi); }


Ответ

Автор кода явно экономил на тексте. *this - это просто разыменование указателя, дающее ссылку const Fraction & на данный экземпляр класса, а последующий * - это перегруженный оператор умножения. Оператор деления реализован как умножение на обратную величину. Если добавить скобочек и пробелов, то должно получатся нагляднее:
return((*this) * Fraction(fra.fenmu, fra.fenzi));
также перегруженный оператор умножения можно вызвать как функцию:
return(operator *(Fraction(fra.fenmu, fra.fenzi)));
или с явным this
return(this->operator *(Fraction(fra.fenmu, fra.fenzi)));
Приведенные три варианта делают одно и то же.

Получение первого слова из строки

Изучаю python, есть задачка - получить первое слово из строки. Строка может начинаться с пробелов, точек и т.д (".... пример, строки "). Нужна функция, которая вернет слово "пример". Мой код в котором получилось получить слово, но избавиться от запятой не получается :
def splitText(string: str): splitted = string.split() for x in range(len(splitted)): if splitted[x].isalpha(): print(splitted[x]) break

splitText("Hello world")
выведет "Hello", но если строка будет вида "Hello, world", то выведет "world"


Ответ

В таком подходе будут найдены все слова:
>>> import re >>> word = '.... пример, строки' >>> pattern = re.compile(r'\w+') >>> pattern.findall(word)[0] 'пример'
В таком, только первое совпадение:
>>> pattern.search(word).group() 'пример'
Пример без регулярок:
>>> for i in word: ... if not i.isalpha() and i != ' ': ... word = word.replace(i, '') ... >>> word ' пример строки' >>> word.split()[0].strip() 'пример'

Указатель this в классе

Насколько я понял, когда читал про this, что указатель необходим по большей части, когда мы используем несколько объектов одного и того же класса. Однако встает вопрос, нужно ли в конструкторе по умолчанию или с параметрами присваивать значение через указатель (ниже код примера
class A{ public: A(int in); private: int tmp; };
A::A(int in){ this->tmp=in; // или же tmp=in; }


Ответ

Нет, не нужно. Вернее - не обязательно. Это было бы нужно, если бы параметр назывался так же как член класса:
class A{ public: A(int tmp); private: int tmp; }
A::A(int tmp){ this->tmp = tmp; }

Прогон в foreach с изменением количества элементов

У меня есть список. Необходимо прогнать все его элементы, вызвать в каждой итерации функцию расчета и при каком-то условии, удалить элемент из цикла и продолжить итерации.
Вначале думал про for и если удаляем, делать i--, т.к. уменьшилось количество элементов на 1, но это не сделать при параллельном прогоне, поэтому думаю сделать подобное в foreach, чтобы не привязываться к индексу элемента. Но при изменение foreach выскакивает исключение, что логично.
Можно ли как-нибудь прогнать параллельно по циклу и по условию, если что удалить элемент. Чтобы это не сказывалась на других элементах в параллельных потоках?


Ответ

Если удалять элемент из коллекции сразу же на месте не требуется — заведите еще одну (потокобезопасную) коллекцию, элементы подлежащие удалению складывайте в нее, после завершения первого цикла просто удалите из первой коллекции все элементы, присутствующие во второй:
// заводим коллекцию var forRemoving = new ConcurrentBag(); foreach (var item in items) { ... // складываем в нее элементы подлежащие удалению forRemoving.Add(item); } // удаляем foreach (var item in forRemoving) items.Remove(item);

Если для вашей задачи не принципиально удаление элементов из входной коллекции, а подойдет также вариант с формированием новой коллекцией — можно воспользоваться функционалом Parallel Linq:
var result = items.AsParallel() .Where(item => condition(item)) .ToList();

Не изменяется значение указателя

void f(int *b) { b = new int; *b = 2; }
int main() {
int *a = NULL; f(a);
if (a == NULL) { std::cout << "mde"; }
return 0; }
Объясните, пожалуйста, почему в данном коде переменная a попрежнему осталась NULL? Ведь указатель - это адресс на область памяти. Изначально он никуда не указывает. Потом я передаю адресс на эту облась памяти и туда уже что-то записываю и она не изменяется. Объясните, пожалуйста, почему?


Ответ

Потому что вы передаете указатель a по значению, а не по ссылке. То есть, внутри функции f b - это копия указателя a. И то, что вы туда записываете новый адрес a никак не затрагивает.
Если вам нужно именно модифицировать a, сделайте так (вариант со ссылкой):
void f(int*&b) { b = new int; *b = 2; }
или так (вариант с указателем):
void f(int **b) { *b = new int; **b = 2; }
Во втором случае, вызов f надо поменять: не f(a); а f(&a);

Инверсия бита в числе

Как инвертировать 4-й бит в числе?
a=165; a=~a<<4
Правильно?


Ответ

$(( a ^ 0x10 ))
или, для наглядности (спасибо @mkkik):
$(( a ^ 1 << 4 )) $(( a ^ (1 << 4) ))
^ - операция побитового исключительного "или" (переключатель, иными словами); 0x10 - четвёртый бит, если считать самый младший нулевым. Во втором варианте приоритет сдвига << выше, чем ^: сначала выполнится сдвиг, а потом переключение флага. Поэтому скобки необязательны, но улучшают восприятие.

Как достать строку из массива который является значением ключа объекта?

// Программа поиска операторов мобильной связи Украины "use strict"; // Создаем объект с значениями ключей-массивами(коды операторов) var mobile = { Kyivstar: ["039", "067", "068", "096", "097", "098"], Vodafone: ["050", "066", "095", "099"], Lifecell: ["063", "093"], Intertelecom: ["094"], PEOPLEnet: ["092"], TriMob: ["091"] } // Запрашиваем у пользователя номер мобильного телефона var user = prompt("Введите номер мобильного телефона в формате: 000 1112233", ""); // Получаем доступ к первым 3-м индексам user var x = user.substr(0, 3); // Прогоняем в цикле все ключи for (var key in mobile) { var arr = mobile[key]; // Проходимся по всем массивам var check = arr.forEach(function (item, i, arr) { if (x === item) { //Выводим пользователю результат alert("Вас приветствует " + key); } }); }
Задача была такая:
Создать объект, который содержит названия и коды мобильных операторов. Пользователь вводит номер телефона и получает информацию о своем операторе.
Я не совсем уверен в правильности решения данной задачи. Вроде все работает, а правильно ли?


Ответ

Вставил из старой проверки своей с сайта, может пригодится:
// Создаем объект с значениями ключей-массивами(коды операторов) var mobile = { Kyivstar: ["039", "067", "068", "096", "097", "098"], Vodafone: ["050", "066", "095", "099"], Lifecell: ["063", "093"], Intertelecom: ["094"], PEOPLEnet: ["092"], TriMob: ["091"] } // Запрашиваем у пользователя номер мобильного телефона var user = prompt("Введите номер мобильного телефона", ""); var x; var y = -1; user = getTelNums(user); switch (user.length) { case 10: y = 0; break; case 11: y = 1; break; default: alert('неверный формат'); break; } if (y >= 0) { // Получаем доступ к первым 3-м индексам user var x = user.substr(y, 3); // Прогоняем в цикле все ключи var op = "Неизвестный оператор"; for (var key in mobile) { var arr = mobile[key]; // Проходимся по всем массивам var check = arr.forEach(function(item, i, arr) { if (x === item) { op = key; return; } }); } //Выводим пользователю результат alert('Вас приветствует '+op); } function getTelNums(telStr) { var regexpNums = /\d/g; var regexpTel = /^([7|8]{0,1}0\d{2})?\d{7}$/; var resultTel = ""; var checkNums = telStr.match(regexpNums); // из строки пользователя получаем массив цифр if (checkNums) { // если массив не пустой // сделаем из него строку: for (var j = 0; j < checkNums.length; j++) resultTel += checkNums[j]; // проверим, телефон ли это: if (!regexpTel.test(resultTel)) { resultTel = ""; } } return resultTel; }

Адаптировать изображение под вьюпорт. Сохранение пропорций

Нужно, чтобы элемент img, сохраняя пропорции и находясь по центру, принимал минимально необходимый размер для заполнения родительского блока.
При попытке установить min-height и min-width по 100% изображение растягивается на всю свою величину, выходя за границы родителя сверх необходимого (да ещё и только от левого верхнего угла). Возможно ли это без скриптов?


Ответ

Можно воспользоваться object-fit: cover; и object-position: center; например:
div.a {width: 400px; height: 200px;} div.b {width: 200px; height: 400px;} div {border: 1px solid black;} div img { object-fit: cover; object-position: center; height: 100%; max-width: 100%; min-width: 100%; }


Добавление элементов в разметку

Как с помощью JS динамически добавлять новые контроллы (input, div и тд) ? Пробую так :
function AddItem() { var element = document.getElementById("add_scill").innerHTML = '111'; }
И новый блок спан действительно добавляется в разметку, но только 1 раз а как сделать что бы добавлялся каждый раз при вызове функции ? И связанный вопрос - что, если добавляется не просто '...' а сложные элементы, формы и тд - описывать их в строку не очень удобно, может есть более продвинутый способ ?


Ответ

Элемент добавляется не 1 раз, просто каждый раз вы затираете innerHTML новым значением.
function AddItem() { var input = document.createElement('input'); var element = document.getElementById("add_scill"); element.appendChild(input); };
Если таким образом - каждый раз будет добавляться ещё один элемент. P.S. Более продвинутый способ - скорее всего заюзать каку-нибудь библиотеку.

Связный список, оператор -> (С++)

Есть код:
struct Element //структура задающая элемент односвязного списка { int data; //информационное поле для хранения данных Element *next; //указатель на следующий элемент } *start, *current;
void create_list(int a) { current = new Element; current->data = a; current->next = NULL; start = current; }
void new_element(int a) { Element *q; q = new Element; q->data = a; q->next = current->next; current->next = q; }
void delete_element(int a) { while (current->data != a) { current = current->next; if (current->data == a) { delete current; } } }
Не совсем понял, что происходит в этих строчках:
current->next = NULL;
функции create_list(int)
и
q->data = a; q->next = current->next; current->next = q;
функции new_element(int)
Объясните, пожалуйста.


Ответ

Первый -
current->next = NULL;
просто устанавливает элемент, на который указывает current, последним в списке - за ним (next) ничего нет.
q->data = a; q->next = current->next; current->next = q;
Это просто вставляет элемент после current - теперь новый элемент q указывает туда же, куда раньше указывал элемент, на который указывал current, а он теперь указывает на q
Вот примерный набросок - простите уж за отсутствие художественного таланта :) Видите? разорвали связь и воткнули туда новый элемент...

css анимация pacman без `svg`

Как реализовать такую анимацию на css. Желательно без svg


Ответ

Вот два красивых варианта.
Первый отсюда
Второй вариант кода взят отсюда
@import url(https://fonts.googleapis.com/css?family=Press+Start+2P); html{ background-color:#000; border-bottom:solid 5px blue; border-top:solid 5px blue; overflow-x:hidden; padding-bottom:142px; } p{ color:#FFF; font: 50px 'Press Start 2P', cursive; margin:200px 139px; position:absolute; text-align:center; } .pacman{ margin:40px 10px; } .pacman-top{ background-color:yellow; height:100px; width:200px; border-radius:100px 100px 0 0; animation: spin1 0.5s infinite linear; } .pacman-bottom{ background-color:yellow; height:100px; width:200px; border-radius:0 0 100px 100px; animation: spin2 0.5s infinite linear; } .feed { margin-top: -185px; margin-left:15px; width: 45px; height: 45px; border-radius: 30%; -moz-animation: eat 1s linear 0s infinite; -webkit-animation: eat 1s linear 0s infinite; animation: eat 1s linear 0s infinite; } /* Animation*/ @keyframes spin1 { 0% {transform: rotate(0deg);} 50%{transform: rotate(-35deg);} } @keyframes spin2 { 0% {transform: rotate(0deg);} 50%{transform: rotate(35deg);} } @-moz-keyframes spin1 { 0% {transform: rotate(0deg);} 50%{transform: rotate(-35deg);} } @-moz-keyframes spin2 { 0% {transform: rotate(0deg);} 50%{transform: rotate(35deg);} } @-webkit-keyframes spin1 { 0% {transform: rotate(0deg);} 50%{transform: rotate(-35deg);} } @-webkit-keyframes spin2 { 0% {transform: rotate(0deg);} 50%{transform: rotate(35deg);} } @keyframes eat { 0% { box-shadow: 100px 65px 0 0 white, 300px 65px 0 0 white, 500px 65px 0 0 white, 700px 65px 0 0 white, 900px 65px 0 0 white, 1100px 65px 0 0 white, 1300px 65px 0 0 white;} 100% { box-shadow: 0px 65px 0 0 white, 100px 65px 0 0 white, 300px 65px 0 0 white, 500px 65px 0 0 white, 700px 65px 0 0 white, 900px 65px 0 0 white, 1100px 65px 0 0 white;} } } @-moz-keyframes eat { 0% { box-shadow: 100px 65px 0 0 white, 300px 65px 0 0 white, 500px 65px 0 0 white, 700px 65px 0 0 white, 900px 65px 0 0 white, 1100px 65px 0 0 white, 1300px 65px 0 0 white;} 100% { box-shadow: 0px 65px 0 0 white, 100px 65px 0 0 white, 300px 65px 0 0 white, 500px 65px 0 0 white, 700px 65px 0 0 white, 900px 65px 0 0 white, 1100px 65px 0 0 white;} } } @-webkit-keyframes eat { 0% { box-shadow: 100px 65px 0 0 white, 300px 65px 0 0 white, 500px 65px 0 0 white, 700px 65px 0 0 white, 900px 65px 0 0 white, 1100px 65px 0 0 white, 1300px 65px 0 0 white; } 100% { box-shadow: 0px 65px 0 0 white, 100px 65px 0 0 white, 300px 65px 0 0 white, 500px 65px 0 0 white, 700px 65px 0 0 white, 900px 65px 0 0 white, 1100px 65px 0 0 white; } } }


body{ background:#222; color:#ddd; font-family:Exo; text-shadow:0 -1px 0 #000; } h1,h2{ color:#ff0; text-shadow:0 -3px 3px #000; font-weight:normal; } .wrapper{ max-width:600px; padding:0 20px; margin:0 auto; } .pacman-holder{ position:relative; width:200px; margin:100px auto; } .pacman-container { display:block; width:100px; height: 100px; -webkit-transform:rotate(45deg); -moz-transform:rotate(45deg); -o-transform:rotate(45deg); transform:rotate(45deg); -moz-animation: bite 0.5s linear infinite; -webkit-animation: bite 0.5s linear infinite; animation: bite 0.5s linear infinite; } .pacman-body { background-color: #ff0; position: absolute; width: 100px; height: 100px; -moz-border-radius: 50px; -webkit-border-radius: 50px; -o-border-radius: 50px; border-radius: 50px; } .dot { background-color: #fff; position: absolute; z-index:0; top:40px; left:200px; width: 20px; height: 20px; -moz-border-radius: 50px; -webkit-border-radius: 50px; -o-border-radius: 50px; border-radius: 50px; -moz-animation: movedot 0.5s linear infinite; -webkit-animation: movedot 0.5s linear infinite; animation: movedot 0.5s linear infinite; -moz-animation-delay:0.2s; -webkit-animation-delay:0.2s; animation-delay:0.2s; } .pacman { position: absolute; width: 100px; height: 100px; -moz-border-radius: 50px; -webkit-border-radius: 50px; -o-border-radius: 50px; border-radius: 50px; clip: rect(0px, 50px, 100px, 0px); z-index:2; } .pacman-mouth { position: absolute; left:2px; width: 102px; height: 102px; -moz-border-radius: 50px; -webkit-border-radius: 50px; -o-border-radius: 50px; border-radius: 50px; clip: rect(0px, 100px, 100px, 52px); } .pacman-mouth .pacman { background-color: #222; -webkit-transform:rotate(90deg); -moz-transform:rotate(90deg); -o-transform:rotate(90deg); transform:rotate(90deg); -moz-animation: munch 0.5s linear infinite; -webkit-animation: munch 0.5s linear infinite; animation: munch 0.5s linear infinite; /* To fix a yellow border on pacman's mouth */ border: 3px solid #222; } .pacman-holder.moving{ width:100px; -moz-animation: move 2.7s linear infinite; -webkit-animation: move 2.7s linear infinite; animation: move 2.7s linear infinite; } .pacman-holder.moving .dot{ -moz-animation: movedot 1s linear infinite; -webkit-animation: movedot 1s linear infinite; animation: movedot 1s linear infinite; -moz-animation-delay:0.2s; -webkit-animation-delay:0.2s; animation-delay:0.2s; } @-moz-keyframes munch { 0% { -moz-transform:rotate(90deg); } 50% { -moz-transform:rotate(0deg); } 100% { -moz-transform:rotate(90deg); } } @-webkit-keyframes munch { 0% { -webkit-transform:rotate(90deg); } 50% { -webkit-transform:rotate(0deg); } 100% { -webkit-transform:rotate(90deg); } } @keyframes munch { 0% { transform:rotate(90deg); } 50% { transform:rotate(0deg); } 100% { transform:rotate(90deg); } } @-moz-keyframes bite { 0% { -moz-transform:rotate(45deg); } 50% { -moz-transform:rotate(90deg); } 100% { -moz-transform:rotate(45deg); } } @-webkit-keyframes bite { 0% { -webkit-transform:rotate(45deg); } 50% { -webkit-transform:rotate(90deg); } 100% { -webkit-transform:rotate(45deg); } } @keyframes bite { 0% { transform:rotate(45deg); } 50% { transform:rotate(90deg); } 100% { transform:rotate(45deg); } } @-webkit-keyframes movedot { 0% { left:200px; } 100% { left:50px; } } @-moz-keyframes movedot { 0% { left:200px; } 100% { left:50px; } } @keyframes movedot { 0% { left:200px; } 100% { left:50px; } } @-webkit-keyframes move { 0% { -webkit-transform: scaleX(1); left:0px; } 49.999% { left:200px; -webkit-transform: scaleX(1); } 50%{ -webkit-transform: scaleX(-1); } 100% { left:0px; -webkit-transform: scaleX(-1); } } @-moz-keyframes move { 0% { -moz-transform: scaleX(1); left:0px; } 49.999% { left:200px; -moz-transform: scaleX(1); } 50%{ -moz-transform: scaleX(-1); } 100% { left:0px; -moz-transform: scaleX(-1); } } @keyframes move { 0% { transform: scaleX(1); left:0px; } 49.999% { left:200px; transform: scaleX(1); } 50%{ transform: scaleX(-1); } 100% { left:0px; transform: scaleX(-1); } }

Константное поле для родительского класса

я хочу что бы в абстрактном базовом классе Base было константное поле которое должно задаваться у каждого потомка Derived1, Derived2 своим значением.

UPD: Забыл спросить: поле должно быть статическим?

UPD: Переформулирую вопрос. Есть базовый класс В в котором хочу обязать всех потомков реализовывать статическое поле size, которое будет защищено от изменения даже внутри класса. Есть 2 потомка: класс Х и Y. В классе X поле size должно равняться 6. В классе Y поле должно равняться 10.


Ответ

public class Base { public int ConstValue { get; private set; } public Base(int aConstValue) { ConstValue = aConstValue; } } public class Child1 : Base { public Child1() : base(1) { } } public class Child2 : Base { public Child2() : base(2) { } }
@andreycha - А лучше сделать свойство абстрактным.
public abstract class Base { public abstract int ConstValue { get; } } public class Child1 : Base { public override int ConstValue { get { return 1; } } } public class Child2 : Base { public override int ConstValue { get { return 2; } } }