Страницы

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

пятница, 12 июля 2019 г.

Когда создается объект HttpSession?

В сервлете есть метод:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(req.getSession(false)); req.getRequestDispatcher(indexPage).forward(req, resp); }
При использовании apache-tomcat-8.5.15 при первом обращении получается следующий лог:
null null org.apache.catalina.session.StandardSessionFacade@5e21a333
Я всегда думал что существует возможность управлять процессом создания сессии при помощи getSession(true/false). Но выходит что сессия создается вне зависимости от моего желания? Так как же мне обеспечить что бы сессия не создавалась до тех пор, пока я сам не скажу getSession(true)? Хоть я false параметром и выставил, а все равно получил ее создание...
Помогите пожалуйста разобраться что произошло. Спасибо.


Ответ

Скорее всего в вашем приложении использовался JSP. По умолчанию сессия создается при обращении к произвольной JSP странице, если это в явном виде не отключено специальной директивой <%@ page session="false" %>
В остальном вы правы req.getSession(false) не приводит к созданию сессии, если она не была создана до этого.

Ввод/Вывод __float128 C++

Подскажите как в C++ вводить __float128, потом вывести без знаков после точки


Ответ

Вводить и выводить такие числа надо в виде строк.
Для перевод __float128 из/в строку можно использовать функции strtoflt128 и quadmath_snprintf, соответственно. Но это при условии, что вы используете GCC и вам доступна библиотека quadmath
Пример:
#include #include
using namespace std;
int main() { int prec = 0; string format("%.0Qf");
string in;
cin >> in; // считывание числа в виде строки
// перевод из строки в __float128 __float128 r = strtoflt128(in.c_str(), NULL);
r = sqrtq(r); // выполнение некоторых операций с числом
// подсчёт размера выходной строки, с учётом форматирования и точности int n = quadmath_snprintf(NULL, 0, format.c_str(), prec, r);
if (n > 0) { // выделение памяти под строку string out(n + 1, '\0');
// перевод __float128 в строку, с учётом форматирования и точности quadmath_snprintf(&out[0], out.capacity(), format.c_str(), prec, r);
// вывод результата в консоль cout << out << endl; }
return 0; }
Число знаков после запятой, которые будут напечатаны, задаётся переменной prec и числом перед точкой в строке форматирования вывода %.0Qf
Чтобы проект собрался, не забудьте указать линковщику опцию lquadmath

Как удалить корневой элемент из QTreeView?

В слоте обрабатываю удаление элементов дерева. Все элементы удаляются, кроме последнего (корневого).
void TreeModel::slotDelete() { QStandardItem *curItem = itemFromIndex(_tvMainTree->currentIndex()); QStandardItem *curParent = itemFromIndex(_tvMainTree->currentIndex())->parent();
if(!curItem || !curParent) return;
curParent->removeRow(curItem->row()); }
Почему при попытке удалении последнего элемента curParent равен 0x0?
Уточнение: Дерево я строю, используя корневой элемент invisibleRootItem()
Подскажите, как удалить последний (корневой) элемент?


Ответ

Немного покопавшись в документации, я сам нашел решение.
void TreeModel::slotDelete() { QStandardItem *curItem = itemFromIndex(_tvMainTree->currentIndex()); if(!curItem) return;
QStandardItem *curParent = curItem->parent(); if(!curParent) { invisibleRootItem()->removeRow(curItem->row()); return; }
curParent->removeRow(curItem->row()); }

Objective-C: поиск по изображениям в таблице

Я хочу выполнить поиск изображений с помощью search bar в tableview. Мой поиск работает, но для показа изображения я использую этот код в
- (void)viewDidLoad { [super viewDidLoad];
_array18 = [[NSArray alloc ]initWithObjects:@"title1",@"title2",@"title3", nil]; _image = [[NSArray alloc ]initWithObjects:[UIImage imageNamed:@"title1.jpg"],[UIImage imageNamed:@"title2.jpg"],[UIImage imageNamed:@"title3.jpg"], nil];
}
- (void)searchForText:(NSString*)searchText scope:(NSString*)scope {
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchText];
_searchResults = [_array18 filteredArrayUsingPredicate:resultPredicate]; }
Но код в cellForRowAtIndexPath не является простым решением, если у меня есть 100 изображений или больше мне нужно создавать 100 проверок. Как можно упростить этот код или есть ли более простое решение?
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell";
cell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) { cell= [[cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; }
if ([[_searchResults objectAtIndex:indexPath.row]isEqualToString:@"title1"]) { cell.imageView.image = [_image objectAtIndex:0]; } if ([[_searchResults objectAtIndex:indexPath.row]isEqualToString:@"title2"]) { cell.imageView.image = [_image objectAtIndex:1]; } if ([[_searchResults objectAtIndex:indexPath.row]isEqualToString:@"title3"]) { cell.imageView.image = [_image objectAtIndex:2]; } }


Ответ

Используйте словарь:
@property (strong,nonatomic)NSMutableDictionary *dic;
- (void)viewDidLoad { [super viewDidLoad]; _array18 = [[NSArray alloc]initWithObjects:@"title1",@"title2",@"title3", nil]; [self initDic]; }
- (void)initDic { self.dic = [[NSMutableDictionary alloc] initWithDictionary:@{ @"title1":[UIImage imageNamed:@"title1.jpg"], @"title2":[UIImage imageNamed:@"title2.jpg"], @"title3":[UIImage imageNamed:@"title3.jpg"] }]; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; cell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.imageView.image = [dic objectForKey:[_searchResults objectAtIndex:indexPath.row]];
return cell; }

Почему не запускается в android-studio проект с githaba и активити неактивные?

Скачал проект архивом с githab, распаковал, открыл в андроид студио. Кнопка запуска неактивна, активити и классы серенькие и с кружочком красным с восклицательным знаком. что надо сделать, чтобы проект запустился?


Ответ

Исходный проект был создан в Eclipse. Чтобы его корректно открыть в андроид-студио, необходимо открывать через Import Project

DDD Итоговая согласованность между агрегатами

Ситуация: есть следующие агрегаты:
Машина Двигатель Колеса Кузов Модель машины Модель двигателя Модель колес Модель кузова
Каждый агрегат имеет собственный идентификатор. Внутри машины расположены идентификаторы двигателя, колес и кузова. В каждом агрегате техники располагается идентификатор соответствующей модели.
Есть правило: при установке в машину двигателя, колес и кузова их модели должны быть совместимы с моделью машины. Т. е. некоторые параметры моделей дочернего оборудования должны совпадать с соответствующими параметрами модели машины.
Допустим в машине уже установлен двигатель. Я решил поменять модель двигателя. Агрегат Двигатель изменился и был сохранен в базу данных. Но модель двигателя должна быть совместима с моделью машины. Получается должна быть итоговая согласованность (Eventual Consistency) между агрегатами Машина и Двигатель.
Вопрос: Как грамотно реализовать разрешение конфликта несоответствия новой модели двигателя и моделью машины, на которую двигатель уже был установлен?
P.S. Проще всего подобные проверки проводить заранее в прикладной службе до изменения модели агрегата. Однако в прикладных службах не должно быть логики доменной модели.


Ответ

В условиях известного предметного окружения я бы пошел по самому простому пути. Двигатель знает о том, что он может использоваться в машине и при собственной попытке сохранения пересохраняет (перевалидирует) машину.
В теории, надо делать какой то сервис событий, на который подписываются все заинтересованные, но тут смотрите сами, реализация будет не очень проста и довольно неочевидна, особенно в случае циклических событий, которые друг друга начнут генерировать.

Установка непрерывного соединения с сервером

Здравствуйте.Есть код, он отправляет hello при помощи веб сокетов на сервер и сразу заканчивает соединение. Я пытаюсь сделать что бы соединение не прерывалось а продолжало слушать и ждать следующего сообщения. Вот код:
public class MainActivity extends AppCompatActivity { private Button start; private TextView out; private OkHttpClient client; private final class Echo extends WebSocketListener{ private static final int NORMAL_CLOSURE_STATUS = 1000; @Override public void onOpen(WebSocket webSocket, Response response) { webSocket.send("hello");
webSocket.close(NORMAL_CLOSURE_STATUS,"bye"); }
@Override public void onMessage(WebSocket webSocket, String text) { out("R"+text); }

@Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { out("error"+t.getMessage()); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); start =(Button)findViewById(R.id.button); out=(TextView)findViewById(R.id.textView); client= new OkHttpClient();

start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {
start(); } });
} private void start(){
Request request = new Request.Builder().url("ws://адрес:8081").build(); Echo listener = new Echo(); WebSocket ws = client.newWebSocket(request, listener);
//client.dispatcher().executorService().shutdown(); }
private void out(final String txt){ runOnUiThread(new Runnable() { @Override public void run() { out.setText(out.getText().toString()+"

"+ txt); } });
}
}
Я попытался удалить строку webSocket.close(NORMAL_CLOSURE_STATUS,"bye"); это сработало но при каждом следующем нажатии на кнопку "отправить" количество сообщений "hello" увеличивалось на одно, т.е нажимаю один раз, отправляется 2 сообщения, нажимаю еще раз - отправляется 3 . Подскажите, в чем проблема?


Ответ

Пока не пришел кто-то поумнее, предложу вам эксперимент:
@Override public void onOpen(WebSocket webSocket, Response response) { int i = 0; webSocket.send("hello" + i++); webSocket.send("hello" + i);
webSocket.close(NORMAL_CLOSURE_STATUS,"bye"); }
Сделайте так и нажмите 2-3 раза. Мне интересно, сокет хранит в буфере сообщения и дублирует их, или какая-нибудь часть кода вызывает метод 2 раза.

Попробуйте удалить webSocket.close(NORMAL_CLOSURE_STATUS,"bye"); можно вынести в onClosed или onClosing
Потом
Request request = new Request.Builder().url("ws://адрес:8081").build(); Echo listener = new Echo(); WebSocket ws = client.newWebSocket(request, listener);
вынесете в переменные класса, т.к. при каждом нажатии у вас создаются новые объекты и видимо WebSocketListener обрабатывает все доступные WebSocket.

Как организовать di для вызова usecase из Interceptor-а

Всем привет, у меня проект на чистой архитеркторе и появилась задача разлогинивания пользования и выклидывания на экран входа в случае, если в ответ на запрос приходит 401.
Разлогинивание релизовано отдельным UseCase, который должен быть вызван из интерактора.
Из-за этого появляется проблема циклической зависимости: Interceptor -> UseCase -> Repository -> Retrofit -> Okhttp -> Interceptor.
Может, есть у кого мысли как сделать не костыльное решение?


Ответ

Действительно ли вам необходимо отправлять запрос подписанный устаревшим токеном после того, как пользователь получил ошибку 401? Мне этот момент кажется странным.
Один из стандартных подходов заключается в том, что вы используете разные объекты для доступа к авторизованной и не авторизованным зонам. В таком случае, вы можете сделать необходимый запрос, используя объект не авторизованной зоны и отправить пользователя на экран логина (локально). По ссылке вы можете ознакомиться с деталями: https://github.com/AndroidArchitecture/AndroidArchitectureBook/blob/master/cases/auth/Auth_article.md
Случай, в котором устаревший токен нужно обновить без взаимодействия с пользователем также описывается в примере.

Переопредление equals и hashCode для проверки наличия объекта в Set

У меня есть Set вида:
private Set selectedRows = new HashSet<>();
В определенный момент в нем лежит объект вида:
[Row [rowData={DFOBJ_ACC=105708976, DFNUMBER_ACC=229000032841, DFALIAS=Северо-Запад, FIRST_GROUP_DFOBJ=3180360969, FIRST_GROUP_NAME=Test 2 lines, SECOND_GROUP_DFOBJ=3180360970, SECOND_GROUP_NAME=Алиас, DFGROUP_NAME=, DFOBJ_CONTR=105708991, DFNUMBER_CONTR=№, от 09.07.2013, DFDATE_BEGIN=09.07.13, DFSUB_NUM=503, DFINVOICE=, DFBALANCE_OUT=0, null=T}]]
Мне нужно, когда приходит объект Row вида:
Row [rowData={DFOBJ_ACC=105708976, DFNUMBER_ACC=229000032841, DFALIAS=Северо-Запад, FIRST_GROUP_DFOBJ=3180360969, FIRST_GROUP_NAME=Test 2 lines, SECOND_GROUP_DFOBJ=3180360970, SECOND_GROUP_NAME=Алиас, DFGROUP_NAME=, DFOBJ_CONTR=105708991, DFNUMBER_CONTR=№, от 09.07.2013, DFDATE_BEGIN=09.07.13, DFSUB_NUM=503, DFINVOICE=, DFBALANCE_OUT=0}]
Метод selectedRows.contains() вернул true. Каким образом можно переопределить equals и hashCode для этой цели?
UPDATE: Класс Row
public class Row implements HtmlPainter, Comparable {
private String styleName = "editable-grid-row"; private Map rowData; private int index;
public interface RowSelectChangeListener{ void onSelectChange(Row row); }
public Map getRowData() { return rowData; }
public void setStyleName(String styleName) { this.styleName = styleName; }
RowSelectChangeListener selectListener;
public void setSelectListener(RowSelectChangeListener selectListener) { this.selectListener = selectListener; }
public int getIndex() { return index; }
public void setIndex(int index) { this.index = index; }
public Map asParams(){ Map params = new FastMap(); rowData.forEach((k,v) -> {params.put(k, new TypedValue(v));}); return params; }
@Override public String toString() { return "Row [" + (rowData != null ? "rowData=" + rowData : "") + "]"; }
private static String SELECTED = "eg-selected-row";
private Element el;
private static final RowTemplates TEMPLATES = GWT.create(RowTemplates.class);
private Cell[] cells; private GridView gridView;
public Row(int index, Map rowData, GridView gridView){ this.rowData = rowData; this.index = index; this.gridView = gridView; }
public HTMLPanel getGridPanel(){ return gridView.pnl; }
public void setCells(Cell[] cells) { this.cells = cells; }
public Cell getCell(int index) { return cells[index]; }
public String getValue(String key){ return rowData.get(key); }
public String getId(){ return rowData.get("DFOBJ"); }
public void putValue(String k , String v){ rowData.put(k , v); }
@Override public void renderStartTag(SafeHtmlBuilder builder) { builder.append(TEMPLATES.startRowDiv(styleName, index, hashCode())); }
@Override public void renderFinishTag(SafeHtmlBuilder builder) { builder.append(TEMPLATES.endRowDiv()); } }


Ответ

Виктор, нет, при сравнении не нужно учитывать null=T. Должно быть равно все остальное, null=T не важно.
Тогда как посоветовал iksuy:
В расчет хэшкода включите расчет хэшкода для содержимого Map, типа там суммируйте хэши ключей и значений например. А в equals соответственно сравнивайте пары, если для всех равных ключей равны их значения, то equals -> true
Хешкод предлагаю такой, он не будет зависеть от количества элементов.
@Override public int hashCode() { int h = 0; Iterator> i = rowData.entrySet().iterator(); while (i.hasNext()) { Map.Entry next = i.next(); if(next.getKey() != null) { h += next.hashCode(); } } return h; }

Equals потестируйте такой, на вид должен работать.
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false;
Row row = (Row) o;
Map OrowData = row.rowData;
//проверим списки ключей
Set copy = new HashSet<>(OrowData.keySet()); Set original = new HashSet<>(rowData.keySet()); copy.remove(null); original.remove(null);
if (!copy.equals(original)) return false;
//если все ключи совпадают проверим каждое занчение по ключу
for (String key : original) { if (!rowData.get(key).equals(OrowData.get(key))) return false; }
return true; }
По задумке должен выдать false если количество ключей или их имя разное (не учитывая null). Если тут все хорошо, то дальше идем по списку ключей без null и проверяем в каждой Map их наличие и соответствие. null спецально удалял из копии, вдруг в оригинальной Map он вам ещё понадобиться.

Как правильно делать запросы в операторе flatMap?

Я получаю с сервера список чатов(переписок). Их запихиваю в класс ChatsModel. И в этом классе имеется userId, то есть в каждом чате имеется id того пользователя. Других информации о пользователе нет.И еще есть одно поле для данных о пользователе типа UserMessagesResponse
Так вот для начала этот userMessagesResponse равен null
После того как я получил список чатов и userId, я должен отправить другой запрос для получения информации о пользователе. Делаю я это таким образом:
private void loadChatsFromNetwork(int count, AccessDataModel accessDataModel) { String accessToken = accessDataModel.getAccessToken();
Flowable chatsModelSingle = getChatsApi().getChats(count, accessToken, Constants.api_version) .subscribeOn(Schedulers.io()) .flatMap(chatsModel -> { RealmList items = chatsModel.getResponse().getItems(); StringBuilder userIds = new StringBuilder();
for (Item item : items) { userIds.append(item.getMessage().getUserId()).append(","); }
return loadUsersById(userIds, chatsModel); }) .observeOn(AndroidSchedulers.mainThread());
chatsModelSingle.subscribe(chatsModel -> { Log.d(TAG, chatsModel.getResponse().getItems().first().getMessage().getMessagesUserItem().getFirstName()); chatsRepository.updateChatsData(chatsModel); iGetChatsCallback.onGetChatsSuccess(chatsModel); }, throwable -> { iGetChatsCallback.onGetChatsError(throwable.getMessage()); Log.d(TAG, "onError() " + throwable.getMessage()); }); }
private ChatsModel loadUsersById(StringBuilder userIds, ChatsModel chatsModel) {
MyApplication.getChatsApi().getUsersByChats(userIds.toString(), "photo_100") .subscribe(messagesUser -> {
RealmList item = chatsModel.getResponse().getItems();
for (int i = 0; i < item.size(); i++) { Message message = item.get(i).getMessage();
RealmList messagesUserItemList = messagesUser.getUserMessagesResponse(); for (UserMessagesResponse messagesResponse : messagesUserItemList) { if (messagesResponse.getUid().equals(message.getUserId())) { message.setMessagesUserItem(messagesResponse); chatsModel.getResponse().getItems().get(i).setMessage(message); } } }
});
return chatsModel; }
Все эти действия происходят в операторе flapMap, так как мне нужно полученную информацию о пользователе запихнуть в поле userMessagesResponse класса ChatsModel. И в случае успеха отправляю в adapter.
Оба запроса корректно работают. Получаю список userid, получаю данные о пользователе.
Проблема в том, после возвращения chatsModel в flatMap, где return chatsModel, дальше ничего не происходит, то есть до подписчика не доходит ничего, точнее подписчик никак не реагирует.
Вопрос: Как исправить это и вообще как правильно решать такого рода задачи?


Ответ

Если формально, то проблема ваша в том, что вы делаете return chatsModel до того момента, как выполнится код из subscribe, в котором он наполняется.
Если по сути, то ошибка у вас в идеологии. Вы пытаетесь скрестить ежа с ужом. Идеология ReactiveX состоит в том, что вы управляете не фиксированными объектами, а потоками данных(событий), причем асинхронно. А у вас получается так: пошел асинхронный поток, вы его тут-же пытаетесь собрать в объект, синхронно причем, и запустить в другой поток.
Распишем ваш поток:
Происходит какое-то событие, которое инициирует загрузку чатов Получаем список чатов List Для каждого чата получаем информацию о пользователе (getUserInfo) Делаем с этими чатами какую-то полезную работу (redrawMyNiceChatsTable)
Т.е. логика у вас должны быть примерно следующая(отчасти псевдокод):
class MyMainClass{ private ChatsUpdater updater = new ChatsUpdater(); private List chats = new ArrayList<>();
private void onSomeEventOccured(){ chats.clear(); updater.startUpdate() .subscribe( {chat -> chats.add(chat)}, // onNext {redrawMyNiceChatsTable(chats)} // onComplete ) } }
class ChatsUpdater{ public Flowable startUpdate(){ return getChats().flatMap( chat -> getUserInfo(chat), (chat, userInfo) -> { chat.setUserInfo(userInfo); return Observable.just(chat); } ) }
private Flowable getChats(){ ..... }
private Flowable getUserInfo(Chat chat){ ..... } }
UPD Ну а если совсем по уму, то, так как у вас жесткая, обязательная, цепочка Chat->UserInfo, вам надо переделать API на стороне сервера, чтобы оно отдавало сразу всю необходимую информацию.

Как получить доступ к корневому элементу из листа в листе JSON

Есть JSON файл такой структуры:
{ "person" { "someElement" : "test", "operationsList": [ { "date": 1505980686916, "sendersLastName": "last", "sendersFirstName": "first", "sendersSecondName": "second", "operationDetailsList" : [ { "innerKey" : "key1", "innerValue" : "value1" }, { "innerKey" : "key2", "innerValue" : "value2" } ], "operationCurrencyAmount": 456, "operationCurrencyCode": "TEST" }, { "date": 1505980686916, "sendersLastName": "last", "sendersFirstName": "first", "sendersSecondName": "second", "operationDetailsList" : [ { "innerKey" : "key1", "innerValue" : "value1" }, { "innerKey" : "key2", "innerValue" : "value2" } ], "operationCurrencyAmount": 456, "operationCurrencyCode": "TEST" },
], "otherField" : "testValue" }, "booleanFlag" : true }
Создан jr:list с элементами "operationsList": subDataSource("person.operationsList")
Внутри этого (operationsList) листа есть еще один jr:list (operationDetailsList): subDataSource("operationDetailsList")
Вопрос: Нужно внутри дочернего (operationDetailsList) листа использовать корневой элемент "booleanFlag" в качестве printWhenExpression для одного из полей (например, "innerKey"). Однако в списке доступных полей есть только поля из subDataset="operationDetailsList", т.е. доступны только "innerKey" и "innerValue". Можно ли получить доступ к элементу "booleanFlag" из листа в листе?


Ответ

Есть решение, можно передать это поле в виде параметра в лист и использовать в листе именно параметр, а не сам филд.

Количество конечных нулей в факториале js

Программа считает конечные нули n! Проблема такая: первый тест всегда выдает undefined, но все последующие значения считает верно. В чем может быть ошибка? Заранее спасибо.
function zeros(n){ zeros = n => { counter = 0; for (i = 5; n/i >= 1; i *= 5) counter += Math.floor(n/i); return counter; };
}


Ответ

Первый вызов ничего не возвращает, но переопределяет переменную zeros. Второй и последующие - вызывают эту новую функцию, которая вычисляет и возвращает counter
function zeros(n) { var counter = 0; for (var i = 5; n/i >= 1; i *= 5) counter += Math.floor(n/i); return counter; }

Изменение размера map

Мяч находится на игровом поле m на n в ячейке (i, j), его можно передвигать Найдите количество возможных путей вывода мяча за пределы игрового поля из исходного состояния не более чем за k шагов. Нет ограничения на посещение одной и той же точки несколько раз. То есть при большом k одна и та же клетка может быть пройдена несколько раз.
Необходимо написать алгоритм поиска количества путей из заданной позиции за пределы поля. Используя map в двумерном массиве сохраняю количество путей из конкретной позиции при конкретном количестве оставшихся доступных шагов. Но при рекурсивном вызове функции размер map без причины увеличивается до максимального. Не могу понять из-за чего такое происходит ибо на плюсах программировал не много.
#include #include #include #include #include #include struct MyStruct { std::map ok; }; int ik, jk, nk, mk, kk; int rec(int m, int n, int k,int i, int j,int result, MyStruct *arr ) { auto itMap = arr->ok.begin(); if (i<0 || j<0 || i==m || j==n) { result += 1; return result; } if (k==0) { return 0; } k = k - 1; if (arr[(i+1)*mk+j].ok.count(k)==0) { result += rec(m, n, k, i + 1, j, 0, arr); arr[(i + 1)*mk + j].ok.insert(std::pair(k, result)); } else { for (itMap= arr[(i + 1)*mk + j].ok.begin(); itMap != arr[(i + 1)*mk + j].ok.end(); itMap++) { if (itMap->first == k) { result += itMap->second; break; } } } if (arr[(i)*mk + j+1].ok.count(k) == 0) { result += rec(m, n, k, i, j + 1, 0, arr); arr[(i)*mk + j+1].ok.insert(std::pair(k, result)); } else { for (itMap = arr[(i)*mk + j+1].ok.begin(); itMap != arr[(i )*mk + j+1].ok.end(); itMap++) { if (itMap->first == k) { result += itMap->second; break; } } } if (arr[(i - 1)*mk + j].ok.count(k) == 0) { result += rec(m, n, k, i - 1, j, 0, arr); arr[(i - 1)*mk + j].ok.insert(std::pair(k, result)); } else { for (itMap = arr[(i - 1)*mk + j].ok.begin(); itMap != arr[(i - 1)*mk + j].ok.end(); itMap++) { if (itMap->first == k) { result += itMap->second; break; } } } if (arr[(i)*mk + j - 1].ok.count(k) == 0) { result += rec(m, n, k, i, j - 1, 0, arr); arr[(i)*mk + j - 1].ok.insert(std::pair(k, result)); } else { for (itMap = arr[(i)*mk + j - 1].ok.begin(); itMap != arr[(i)*mk + j - 1].ok.end(); itMap++) { if (itMap->first == k) { result += itMap->second; break; } } } return result; } void main() { std::cout.precision(10); int result; double start_time, end_time; std::ifstream fin("input.txt"); while (!fin.eof()) { start_time = omp_get_wtime(); fin >> mk>>nk>>kk>>ik>>jk; MyStruct *arr=new MyStruct[nk*mk]; result = 0; result=rec(mk,nk,kk, ik, jk,0,arr); end_time = omp_get_wtime(); std::cout << "m=" << mk << " n=" << nk << " k=" << kk << " i=" << ik; std::cout << " j=" << jk << " result=" << result << " time=" << end_time - start_time << std::endl; for (int count = 0; count < mk; count++) delete[]arr; } fin.close(); std::system("pause"); }


Ответ

В общем, рекурсивное решение здесь нельзя использовать. Рост числа элементов экспоненциальный (несколько доказать ну или проверить). Эта задача решается с помощью динамического программирования.
Формула
F[s][i][j] := число способов пройти от стартовой точки к {i,j} за s шагов. {i,j} \in [0,N)*[0,M) s \in [0,K]
База F[0][ i][ j] = 0 F[0][x0][y0] = 1
Пересчёт
F[s+1][i][j] = F[s][i-1][j-1] + F[s][i-1][j+1] + F[s][i+1][j-1] + F[s][i+1][j+1]
если элемента нету, то считаем равным 0.
Ответ - накопительные выходы за границы.
Примерный код на слоях (чисто для понимания, не факт что компилируется). Константы размера потом подберёте, например 10000.
/** @params N,M - размер @params x0,y0 - начальная точка @params K - число шагов @output - ответ */ long long DP[2][maxN][maxM]; //fill 0
#define get(s,i,j) ((i < N && j < M && i>=0 && j>= 0)? DP[s][i][j]:0)
long long calc(int N, int M, int x0, int y0, int K){ long long ans = 0; DP[0][x0][y0] = 1; for (int k=1;k <= K; k++){ int pr = k&1; int r = 1 - pr;
for (int i=0;i < N; i++) //границы к ответу ans += DP[r][i][0] + DP[r][i][M-1]; for (int j=0;i < M; j++) //границы к ответу ans += DP[r][0][j] + DP[r][N-1][j]; for (int i=0; i < N; i++) for (int j=0; j < M; j++) DP[pr][i][j] = get(r,i-1,j-1) + get(r,i-1,j+1) + get(r,i+1,j-1) + get(r,i+1,j+1); memset(DP[r], 0 ,sizeof(DP[r])); } return ans; }
Сложность O(nmk) по времени O(nm) по памяти.
В теории задача может быть сжата до формул (весьма громоздких), но это уже выходит за рамки вопроса.
P.S. memset в конце можно не вызывать, оставил чтобы меньше вопросов было. Он ни на что не влияет (но это не сразу очевидно).

Передача двумерного массива по ссылке С++

Есть двумерный массив чисел. Int mass[15][20] Нужно передать его в функцию так, чтобы изменение его в функции отражалось в main. После попыток разобраться поняла, что нужно как-то передавать по ссылке, но не могу сообразить как.


Ответ

Передавайте. Только скобочки не забудьте:
#include
void f(int (& mass)[15][20]) { mass[1][1] = 42; }
int main() { int mass[15][20] = { 0 }; f(mass); std::cout << mass[1][1] << std::endl; return 0; }

Не учитывать клик, при выделении

Обработчик висит на элементе main. При клике по элементам внутри main, если элемент (цель клика) является потомком блока message, к соответствующему блоку message добавляется/удаляется класс checked
Таким образом можно помечать сообщения, например для удаления.
Но вот в чем проблема: если я выделяю текст сообщения, то это считается за клик и сообщение выделяется. Я хочу чтобы при выделении текста в блоке message или его потомках (например body) блок message не обособлялся классом checked
То есть если я кликаю по любому содержимому блока message, то блок message выделяется (классом), а если я выделяю текст в блоке message, то ничего происходить не должно.
function hasClass(element, cls) { return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1; } document.querySelector('.main').addEventListener('click', function(e) { var found = false; for (var i = 0; i < e.path.length; i++) { var elm = e.path[i]; if (hasClass(elm, 'message')) { found = true; break; } } if (!found) { return; } if (hasClass(elm, 'checked')) { elm.classList.remove('checked'); } else { elm.classList.add('checked'); } }); .message { background: yellow; } .checked { background: red; }

Lorem ipsum, qwerty! Если текст выделен - цвет не должен переключиться

JsFiddle


Ответ

Для решения можно сделать проверку, что если выделен какой-то текст, то выйти из обработчика.
Определить это можно с помощью свойства isCollapsed объекта Selection, который возвращает функция getSelection()
Например:
function hasClass(element, cls) { return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1; } document.querySelector('.main').addEventListener('click', function(e) { if (!getSelection().isCollapsed) return; var found = false; for (var i = 0; i < e.path.length; i++) { var elm = e.path[i]; if (hasClass(elm, 'message')) { found = true; break; } } if (!found) { return; } if (hasClass(elm, 'checked')) { elm.classList.remove('checked'); } else { elm.classList.add('checked'); } }); .message { background: yellow; } .checked { background: red; }

Lorem ipsum, qwerty! Если текст выделен - клик отменен

Stack overflow при создании объекта

При создании GET в ответе получаю Stackoveflow ошибку
Имеется контроллер для ответа
@Controller public class TaskViewController {
@Autowired private TaskService taskService;
@RequestMapping(value = "/task/view", method = RequestMethod.GET) public @ResponseBody AjaxResponseBody getTask(@RequestParam String text) {
int id; AjaxResponseBody result = new AjaxResponseBody(); Task task; System.out.println(text);
try { id = Integer.parseInt(text); } catch (Exception e) { result.setMsg("Invalid task number"); return result; }
task = taskService.findById(id);
if (task == null){ result.setMsg("Task not found"); return result; }
result.setTask(task); return result; } }
Он использует класс для ответа AjaxResponseBody
public class AjaxResponseBody {
private String msg; private Task task;
public String getMsg() { return msg; }
public void setMsg(String msg) { this.msg = msg; }
public Task getTask() { return task; }
public void setTask(Task task) { this.task = task; } }
При выполнении работы контроллера выходит ошибка
2017-11-24 10:47:10.514 WARN 1448 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->
Как я понял это происходит из-за того что модель User и Project имеют ссылки друг на друга. В модели User есть необязательное поле
@Entity @Table(name = "users") public class User { @ManyToOne(fetch = FetchType.LAZY) private Project watched_project;
public Project getWatched_project() { return watched_project; }
public void setWatched_project(Project watched_project) { this.watched_project = watched_project; }
В то же время в модели Project есть поле с автором проекта:
@Entity @Table(name = "projects") public class Project { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private int id; @Column(nullable = false) @NotEmpty(message = "*Please provide project name") private String projectName; @ManyToOne(optional = false, fetch = FetchType.EAGER) private User user; public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
Есть возможность прервать рекурсию на первой иттерации? Либо какой-то другой выход из ситуации?


Ответ

использовал JsonIgnor:
@ManyToOne(fetch = FetchType.LAZY) @JsonIgnore private Project watched_project;

Gulp: произвольный код перед gulp.series() or gulp.parallel() на примере изменения значения переменной

Каким образом следует изменить значение переменной isDevelopment перед запуском серии внутренних тасков?
// значение по умолчанию let isDevelopment = !process.env.NODE_ENV || process.env.NODE_ENV === 'development';
gulp.task('Development Run', () => {
isDevelopment = true; // происходит ошибка: The following tasks did not complete: Development Run
gulp.series( 'Development Build', gulp.parallel('Watch Assets And Source', 'Static Server') )
});
gulp.task('Production Build', () => {
isDevelopment = false; // происходит ошибка: The following tasks did not complete: Production Build
gulp.series( gulp.parallel('styles', 'scripts') );
});


Ответ

Ошибка говорит сама за себя, нужно завершить задачу. В Gulp для этого можно вернуть callback, promise, поток.
https://github.com/gulpjs/gulp/blob/4.0/docs/API.md#gulptaskname-fn
UPD попробуте так
// значение по умолчанию let isDevelopment = !process.env.NODE_ENV || process.env.NODE_ENV === 'development';
gulp.task('Development Run', (callback) => {
isDevelopment = true;
gulp.series( 'Development Build', gulp.parallel('Watch Assets And Source', 'Static Server') );
callback(); });
gulp.task('Production Build', (callback) => {
isDevelopment = false;
gulp.series( gulp.parallel('styles', 'scripts') );
callback(); });

Есть ли смысл использования ИНС? - обобщение задачи о ранце

Имеется список/массив произвольной длины с целочисленными значениями. Необходимо составить из элементов минимальное количество групп, в которых сумма чисел не больше заданного значения. Есть написанный алгоритм, который сортирует и формирует данные группы, но он достаточно громоздкий и может медленно работать в случае большого количества данных. Есть ли смысл для решения использовать искусственную нейронную сеть? Возможно ли ее натренировать, если входные данные и максимальная сумма чисел в группе может быть любой?
Пример: Входные данные: Список чисел: [6, 1, 6, 2, 4, 3, 1, 2, 2, 3, 2]. Максимальная сумма группы: 10. Задача: сформировать минимальное количество групп, все группы должны быть максимально заполнены, кроме одной (минимальный остаток). Правильный ответ: [1, 1, 2, 6], [2, 2, 6], [3, 3, 4], [2] Решение: Сумма чисел в списке равна 32. Соответственно, минимальное число групп - 4; минимальный остаток - 2; 3 группы чисел, где сумма чисел равна 10. Проблема в том, что таких чисел может быть очень много и не все можно идеально разложить по группам. Задачу я решил без каких-либо шаблонов программирования. Мне просто интересны возможность и целесообразность использования ИНС или чего-либо подобного для более качественного решения задачи.


Ответ

Рассматриваемая задача - обобщение известной задачи о ранце, для решения которой ИНС обычно не применяют.
В то же время можно порекомендовать "жадные" стратегии, не использованные в ОП, при которых заполнение массивов ведётся перебором в порядке убывания элементов.
Вариант реализации (C#):
public static void Move(ref int[] from, ref int[] to, int index) { int lenfrom = from.Length, lento = to.Length;
Array.Resize(ref to, lento + 1); to[lento] = from[index]; for (int i = index; i < lenfrom - 1; i++) from[i] = from[i + 1]; Array.Resize(ref from, lenfrom - 1); }
public static void ArShow(string txt, int[] ardesc, int[] res) { Console.Write(txt + "
last group: "); foreach (int val in res) { Console.Write(" " + val); } Console.Write("
data array: "); foreach (int val in ardesc) Console.Write(" " + val); Console.WriteLine(); }
public static void Knapsack(int sum, ref int[] ardesc, ref int[] res) { int ind = 0, sres = res.Sum(), arlen = ardesc.Length, reslen = res.Length; int[] newdesc, newres;
Array.Copy(ardesc, newdesc = new int[arlen], arlen); Array.Copy(res, newres = new int[reslen], reslen); foreach (int value in ardesc) { if (sum == sres) break; if (sum >= sres + value) { Move(ref newdesc, ref newres, ind); Knapsack(sum, ref newdesc, ref newres); break; } ind++; } ardesc = newdesc; res = newres; }
static void Main(string[] args) { int[] arrdesc, arr = new int[] { 6, 1, 6, 2, 4, 3, 1, 2, 2, 3, 2 }; int rquant, arrlen = arr.Length, sum = 10; int[][] result = new int[0][];
Array.Copy(arr, arrdesc = new int[arrlen], arrlen); Array.Sort(arrdesc); arrdesc = arrdesc.AsEnumerable().Reverse().ToArray(); Console.Write("
sum = {0}
issue array: ", sum); foreach (int val in arr) Console.Write(" " + val); Console.WriteLine("

***result.Length = " + result.Length); Console.Write("sorted array: "); foreach (int val in arrdesc) Console.Write(" " + val); Console.WriteLine(); while (arrdesc.Length > 0) { rquant = result.Length; Array.Resize(ref result, rquant + 1); result[rquant] = new int[0]; Knapsack(sum, ref arrdesc, ref result[rquant]); ArShow("
*** result.Length = " + result.Length, arrdesc, result[rquant]); } }
Результат:
sum = 10 issue array: 6 1 6 2 4 3 1 2 2 3 2
***result.Length = 0 sorted array: 6 6 4 3 3 2 2 2 2 1 1
*** result.Length = 1 last group: 6 4 data array: 6 3 3 2 2 2 2 1 1
*** result.Length = 2 last group: 6 3 1 data array: 3 2 2 2 2 1
*** result.Length = 3 last group: 3 2 2 2 1 data array: 2
*** result.Length = 4 last group: 2 data array:

Неправильное отображение элементов в списке в FF при overflow-y: auto

Наткнулся на проблему с отображением списка в FF (в Chrome/IE работает нормально). Проблема в том что при overflow: auto в FF скорллбар съедает самый длинный элемент в списке, как будто накладывает скроллбар поверх списка а не прикрепляет его сбоку как в IE и Chrome. overflow-y: scroll решает проблему, но в таком случае скроллбар будет отображаться постоянно, даже когда он функционально не нужен, а это в моем случае неприемлемо. white-space: nowrap тоже нужен, так как по требованию нужно отображать элементы одной строкой. Ширину div элемента тоже желательно оставить на width: auto
div { display: block; min-width: 40px; width: auto; position: absolute; top: 50px; left: 100px; background: #fff; z-index: 102; max-height: 100px; overflow-y: auto; overflow-x: visible; border-radius: 5px; box-shadow: 0px 5px 60px -7px #808e95; padding: 20px 10px; margin: 5px 0 0; } ul { overflow: hidden; white-space: nowrap; list-style: none; margin: 0; padding: 0; }

  • Element
  • Element
  • Element
  • Element
  • Element
  • Element
  • REALLY BIG ELEMENT INSERTED HERE!
  • Element
  • Element
  • Element
  • Element
  • Element
  • Element

В общем можно как-то это решить не прибегая к JS костылям?


Ответ

Можно обойти если обернуть текст в span и задать padding-left равный ширине Firefox скроллбара (примерно 20px). Но проблема в том, что в остальных браузерах этот padding-left будет отображаться рядом со скроллбаром, поэтому решение на любителя но зато без лишних вычислений и JS костылей :)
div { width: auto; position: absolute; top: 100px; left: 100px; background: #fff; max-height: 100px; overflow-y: auto; overflow-x: visible; border-radius: 5px; box-shadow: 0px 5px 60px -7px #808e95; } ul { overflow: hidden; margin: 0; padding: 0; } span{ padding-right: 22px; display: inline-block; white-space: nowrap; }

  • Element
  • Element
  • Element
  • Element
  • Element
  • Element
  • Element
  • REALLY BIG ELEMENT INSERTED HERE!
  • Element
  • Element
  • Element
  • Element
  • Element

Как получить доступ к интерфейсу ICloneable в проекте типа - библиотека классов?

Я создал проект C# типа - библиотека классов . После чего, создал в нем файл с классом и попытался унаследоваться от класса ICloneable. VisualStudio 2017 подчеркнула имя ICloneable, указав на то что есть ошибка. В предложенных VisualStudio решениях данной проблемы предлагается самому создать данный интерфейс.
Другими словами интерфейс ICloneable недоступен/не создан.
В документации говорится что данный класс доступен по умолчанию в пространстве имен - using System; Но по факту для проекта типа - библиотека классов, это правило не работает. Поскольку пространство имен "System" подключено к моему файлу.
Ради интереса, я создал консольный проект и попытался в нем унаследоваться от интерфейса ICloneable. В итоге, в данном типе проекта интерфейс был доступен и все прекрасно работало. Выходит что вся загвоздка в типе созданного проекта.
Как получить доступ к интерфейсу ICloneable в проекте типа - библиотека классов?
Мой код:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace UrlBuilder.Url.Sections.ProductModels.Transport.Cars { public class Class1 : ICloneable { public Class1 Clone() { return new Class1(); } } }
Как видите в VisualStudio 2017 этот код вызывает ошибку:


Ответ

В проектах UWP интерфейс ICloneable появился с поддержкой .NET Standard 2.0, начиная с версии Windows 10 Fall Creators Update (10.0, Build 16299).
Для того, чтобы ICloneable появился - указать Min Version 16299, или при создании нового проекта, или в свойствах для уже существующего.

Найти самую длинную последовательность повторяющихся чисел в списке

Задание: "Создать однонаправленный или двунаправленный список и найти самую длинную последовательность повторяющихся чисел в списке, сохранить повторяющееся значение и количество повторений"
Список вроде создал, да и на примере массивов понятно, как выполнить вторую (интересующую) часть задания, но вот с реализацией алгоритма под списки возникли трудности. Проблема в том, что я знаю, как написать код для нахождения повторяющихся значений в массиве, а как это делается для списков - не имею понятия.
Буду рад любой помощи, ибо уже немного отчаялся найти решение :(
#include #include
using namespace std;
const int size = 8;
struct Node { int Data; Node *next; Node *prev; };
int main() { Node *Start = NULL; Node *End = NULL; Node *Current = NULL;
int i = 0; while (i < size) { // Создаем Current = new Node; Current -> Data = rand() % 5 + 1; Current -> prev = NULL; Current -> next = NULL;
// Заполняем if (Start == NULL) Start = End = Current; else { End -> next = Current; Current -> prev = End; End = Current; } i++; }
// Выводим Current = Start; while (Current) { cout << Current -> Data << endl; Current = Current -> next; }
// Удаляем Current = End; while (Current) { Node *temp = Current; Current = Current -> prev; delete temp; } Start = End = NULL; return 0; }


Ответ

Вот, набросал нечто такое:
int elem_curr = Start->Data; int elem_prev = Start->Data; std::size_t length_curr = 1; std::size_t length_prev = 1; for(Current = Start; Current != nullptr; Current = Current->next) { if(Current == Start) continue; if(elem_curr == Current->Data) length_curr++; else { if(length_curr > length_prev) { elem_prev = elem_curr; length_prev = length_curr; } elem_curr = Current->Data; length_curr = 1; } }
if(length_curr > length_prev) { elem_prev = elem_curr; length_prev = length_curr; }
std::cout << elem_prev << ' ' << length_prev << std::endl;
И в начале функции main добавьте строчку srand(unsigned(time(NULL))); для рандомайзера
По коду - оптимизируйте немного, я так совсем грубо накидал, только ради основной идеи - проход по циклу + поиск подпоследовательности. Например, строчку с continue можно "замять" при небольших дополнительных действиях и проверку после цикла на посл., которая в конце списка - тоже можете организовать покрасивее в цикле. Удачи.

Поиск элементов по атрибуту регулярное выражение

Получаю для обработки все элементы у которых есть атрибут data-lang
$("[data-lang]").each(function(index, element) { console.log(element) });


Но у меня еще есть атрибуты data-lang-tittle и т.п. Как их тоже захватить, пытался $("[^data-lang]") не выходит


Ответ

Лично на мой взгляд, решение ниже хуже, чем если, все же, добавить классы элементам, но тут уж автору вопроса решать:
$('*').filter(function() { for(var prop in $(this).data()) { console.log(prop); if(prop.indexOf('lang') !== -1) { return true; } } return false; }).css('color', 'red');

One
Two
Three

P.S. в моем комментарии к вопросу (ссылка на JSFiddle) содержится ошибка, кто заметил - тот молодец =)

Передача переменных и использования их (C#)

Хочу передать переменные (Swt, Srt) из формы Settings в Main, и использовать их. Проблема в том что при запуске программы WorkDelay и RecreationDelay создаются пустыми и не изменяются в дальнейшим.
public static int Swt, Srt; public TimeSpan WorkDelay = TimeSpan.FromMinutes(Swt); //Work time in minutes public TimeSpan WorkDelay = TimeSpan.FromMinutes(Swt); //Work time in minutes
Форма Main
public partial class Main : Form { private DateTime _globalTimeDate;
public static int Swt, Srt;
private DateTime _workExpiry; public TimeSpan WorkDelay = TimeSpan.FromMinutes(Swt); //Work time in minutes
private DateTime _recreationExpiry; public TimeSpan RecreationDelay = TimeSpan.FromMinutes(Srt); // Recreation time in minutes
public Main() { InitializeComponent();
stop.Enabled = false;
global.Text = @"Stoped"; work.Text = @"Stoped"; recreation.Text = @"Stoped"; }
private void globalTimer_Tick(object sender, EventArgs e) { long tick = DateTime.Now.Ticks - _globalTimeDate.Ticks; DateTime stopWatch = new DateTime(); stopWatch = stopWatch.AddTicks(tick); global.Text = $@"{stopWatch:HH:mm:ss}"; }
private void workTimer_Tick(object sender, EventArgs e) { TimeSpan remaining = _workExpiry - DateTime.Now; work.Text = remaining.ToString("hh\\:mm\\:ss");
if (work.Text == @"00:00:00") { workTimer.Stop(); work.Text = @"Stoped, start recreation";
_recreationExpiry = DateTime.Now.Add(RecreationDelay); recreationTimer.Start(); } }
private void recreationTimer_Tick(object sender, EventArgs e) { TimeSpan remaining = _recreationExpiry - DateTime.Now; recreation.Text = remaining.ToString("hh\\:mm\\:ss");
if (recreation.Text == @"00:00:00") { recreationTimer.Stop(); recreation.Text = @"Stoped, strart work";
_workExpiry = DateTime.Now.Add(WorkDelay); workTimer.Start(); } }
private void start_Click(object sender, EventArgs e) { _globalTimeDate = DateTime.Now; _workExpiry = DateTime.Now.Add(WorkDelay);
globalTimer.Start(); workTimer.Start();
start.Enabled = false; stop.Enabled = true; }
private void stop_Click(object sender, EventArgs e) { globalTimer.Stop(); workTimer.Stop(); recreationTimer.Stop();
work.Text = @"Stoped"; recreation.Text = @"Stoped";
stop.Enabled = false; start.Enabled = true; }
private void exitToolStripMenuItem_Click(object sender, EventArgs e) { globalTimer.Stop(); workTimer.Stop(); recreationTimer.Stop();
Application.Exit(); }
private void settingsToolStripMenuItem_Click(object sender, EventArgs e) { Settings settings = new Settings(); settings.Show(); } } }
Форма Settings
public partial class Settings : Form {
public Settings() { InitializeComponent(); }
private void buttonSet_Click(object sender, EventArgs e) { try { Main.Swt = (int) Convert.ToDouble(textBoxW.Text.Replace(',', '.')); Main.Srt = (int) Convert.ToDouble(textBoxR.Text.Replace(',', '.')); } catch (Exception ex) { MessageBox.Show(ex.Message); }
Close(); }
private void buttonReset_Click(object sender, EventArgs e) { Main.Swt = 0; Main.Srt = 0; } } }


Ответ

Сделайте поля ...Delay свойствами и вычисляйте их значения при обращении к этим свойствам. Это решит вопрос - "не изменяются в дальнейшем".
public TimeSpan WorkDelay { get { return TimeSpan.FromMinutes(Swt); } }
В C# 6 (экономим на чернилах для фигурных скобок):
public TimeSpan WorkDelay => TimeSpan.FromMinutes(Swt);
По поводу "создаются пустыми". Это происходит потому, что начальные значения Swt и Srt - нули. Присваивайте им какие-нибудь ненулевые значения:
public static int Swt = 5; public static int Srt = 5;
P.S.
Вопрос: почему Swt и Srt - статические, а WorkDelay и RecreationDelay - поля объекта? Подумайте.

Как увеличить на 1 значение в DataGridView?

Имеется таблица DataGridView. Каждая ее строка должна быть уникальной, если же происходит попытка добавления уже существующей строки, то значение в столбце "Количество" нужно увеличить на 1.
Как это сделать?
DataGridView[x, y].Value есть тип object, а если выполнить .ToString(), то уже непонятно как работать со строкой.


Ответ

Оказывается, нужно было всего лишь вставить Convert.ToInt32 в нужное место.
DataGridView[x, y].Value = Convert.ToInt32(DataGridView[x, y].Value) + 1;

Почему компилятор выводит мусор при сложении символьных массивов?

#include #include const int N = 5; void main(void) { unsigned int i = 0, A[N], B[N], C[N], c = 0; while ((B[i] = getchar()) != '
') { i = i + 1; printf("%5d", B[i]); }
#include #include const int N = 5; void main(void) { unsigned char i = 0, A[N], B[N], C[N], c = 0;
while ((A[i] = getchar()) != '
') { i = i + 1; }
i = 0;
while ((B[i] = getchar()) != '
') { printf("%5c", B[i++]); }
for (i = 5; i > 0; i--) { C[c] = (A[i] + B[i]); c++; } printf("
");
for (i = 0; i < c; i++) { printf("%5c", C[i]); } _getch(); }


Ответ

Вам нужно что-то вроде
#include #include #include
int add(char * dest, char * src1, char * src2, unsigned int n) { dest[n] = 0; int carry = 0; for(int i = n-1; i >= 0; --i) { int op1 = (src1[i] == ' ') ? 0 : src1[i]-'0'; int op2 = (src2[i] == ' ') ? 0 : src2[i]-'0'; int res = op1 + op2 + carry; carry = 0; if (res > 9) { res -= 10; carry = 1; } dest[i] = res + '0'; } for(char * c = dest; *c == '0'; ++c) *c = ' '; return carry; }
int main(int argc, const char * argv[]) { char a[] = "12353163513251353123513451"; char b[] = "98650987847947749794597949"; char sum[sizeof(a)];
int res = add(sum,a,b,sizeof(a)-1); printf("%s+
%s=
%s
Overflow: %d

",a,b,sum,res);
strcpy(a,"12346541247246"); strcpy(b," 6537652"); res = add(sum,a,b,strlen(a)); printf("%s+
%s=
%s
Overflow: %d

",a,b,sum,res);
}

Custom API Rails

Здравствуйте, как я могу в Rails сделать субдомен подобного вида: https://api.lochalhost:3000 и использовать его только в качестве api, не пропуская никакие роуты, кроме заданных именно под api. Файл config/routes.rb
Rails.application.routes.draw do
constraints subdomain: 'api' do get '/order/:key', to: 'order#show' end
root 'home#home'
resources :profile resources :news resources :wikis
resources :phone_numbers, only: [:new, :create] post 'phone_numbers/verify' => "phone_numbers#verify"
devise_for :profiles, controllers: { registrations: 'registrations' }
resources :users, only: [:index] end
Файл /etc/hosts
127.0.0.1 lochalhost 127.0.0.2 api.lochalhost
# The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters


Ответ

В файле /etc/hosts (или С:\System32\Drivers\etc\hosts в Windows) заведите два домена
127.0.0.1 lochalhost 127.0.0.2 api.lochalhost
Обратите внимание, что IP-адреса разные, если они будут одинаковые — придется для фронт-части и api использовать разные порты.
Организовать разделение роутов по этим двум частям можно, воспользовавшись ограничениями на уровне constraints в файле config/routes.rb:
Rails.application.routes.draw do constraints subdomain: 'api' do # Роуты для API resource :clients end # Роуты для фронт-части root to: 'home#index' end
Приложение придется запустить на 0.0.0.0, чтобы перехватить обращения к 127.0.0.1 и 127.0.0.2. Или, если используются разные порты — запустить две копии одного и того же приложения на разных портах.

Кодировка UTF-8, UTF-16 в Java

Хочу вывести греческую букву U (https://unicode-table.com/en/01AF/) - получаю знаки вопроса. Вывожу как System.out.println('\uC6AF');. Пробовал и UTF-8 и UTF-16 и с помощью chcp - ничего не помогает. Как правильно работать с Unicode?


Ответ

Внимательнее читайте свою же ссылку
Там написано
Unicode number U+01AF
то есть в Java надо написать
System.out.println('\u01AF');

Чтобы выводилось в правильной кодировке - установите кодировку проекта UTF-8 в IDE
В IDEA это делается так: Settings - Editor - File Encodings
Примечание: Если есть проблема с кодировкой самой консоли, выводить можно в файл.

Полностью код выглядит так:
import java.io.FileOutputStream; import java.io.IOException;
public class Main { public static void main(String[] args) throws IOException { // "ISO-8859-1" - западноевропейские языки // "windows-1251" - стандартная Windows (русская) // "UTF-8" - юникод String systemEncoding = "UTF-8";
String text = '\u01AF' + " - Latin Capital Letter U with Horn
" + '\u0168' + " - Latin Capital Letter U with Tilde
" + '\u0055' + " - Latin Capital Letter U
";
// вывод в консоль System.out.printf(text, systemEncoding);
// вывод в файл FileOutputStream fileOutputStream = new FileOutputStream("types_of_u_letters.txt", false); fileOutputStream.write(text.getBytes(systemEncoding)); } }

Отличие передачи указателя от передачи массива в функцию

Чем отличаются эти блоки кода ? В первом передаем указатель на первый элемент массива, а во втором ?
1)
void FillArray(int *arr, const int size) { for (int i = 0; i < size; i++) { arr[i] = rand() % 100; } }
2)
void FillArray(int arr[], const int size) { for (int i = 0; i < size; i++) { arr[i] = rand() % 100; } }


Ответ

В данном случае разницы нет, как я понимаю. И во втором случае тоже передаем указатель на первый элемент массива. Синтаксис разный, смысл один и тот же: в функцию в качестве аргумента передаётся указатель на тип int.
В общем случае отличия, возможно, есть. Второй вариант использует объявление параметра, как массива. В итоге оно превратится в объявление параметра-указателя (т.е. в первый вариант), но с ограничением: размер массива должен быть больше нуля.

Настройка авторизации через GitLab

Здравствуйте, такой вопрос.
Разворачиваю локально ReadTheDocs у себя на компьютере. Все поставилось и работает.
В ReadTheDosc есть функция подключение аккаунтов:
Нужно настроить подключение для гитлаба. Но выползает ошибка:
DoesNotExist at /accounts/gitlab/login/ SocialApp matching query does not exist.
Нужно объявить подключение в Django.
Захожу в настройки:
Искал долго ID и секретный ключ от Gitlaba, но так и не нашел.
Если не сложно, подскажите где посмотреть данную информацию.
Ps делаю по примеру для фейсбука: видос


Ответ

Пока что пришел к такому, что нужно зайти в настройки аккаунта на GitLab

Имя вводим какое вам угодно, URL указываем ваш. В моем случае это
http://127.0.0.1:8000/
После чего выбираем права доступа, жмем сохранить.
Нам выскакивает такой окошко, где будет указан ID и секретный ключ. (Обрезал в целях безопасности)

Но осталась проблема, что не идет авторизация, выдает ошибку так же. Если поставить обращение к example.com в категории сайт:
То выдает следующее:
Это уже ближе к истине.

После вызова onAdClosed activity переходит по циклу своему в onDestroy

Реализовал в приложении загрузку и отображение рекламы AdMob типа Interstitial / Межстраничный.
Переходы: Запуск -> ActivitySplash -> Activity2 -> ActivityMain
Пользователь запускает приложение, смотрит на ActivitySplash, в onCreate() которого присутствует код
AdMobInterstitialLoader adMobInterstitialLoader = new AdMobInterstitialLoader(this); adMobInterstitialLoader.createAd();
Класс AdMobInterstitialLoader
public class AdMobInterstitialLoader {
private static boolean isInterAdsShowed = false; private Activity mActivity;
// static fields are shared between all instances private static InterstitialAd mInterstitialAd;
public AdMobInterstitialLoader(Activity activity) { this.mActivity = activity; createAd(); }
public void createAd() { // create an Ad mInterstitialAd = new InterstitialAd(mActivity); mInterstitialAd.setAdUnitId(mActivity.getString(R.string.interstitial_ad_unit_id));
AdRequest adRequest; // DEBUG or RELEASE if (BuildConfig.DEBUG) { adRequest = new AdRequest.Builder() .addTestDevice(DeviceHash.getMyDeviceHash()) .build(); } else { adRequest = new AdRequest.Builder() .build(); }
// load the interstitial ad mInterstitialAd.loadAd(adRequest);
mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdLoaded() { if (mInterstitialAd.isLoaded()) { mInterstitialAd.show(); } } }); }
public static InterstitialAd getInterstitialAd() { if (mInterstitialAd != null && mInterstitialAd.isLoaded() && !isInterAdsShowed) { isInterAdsShowed = true; return mInterstitialAd; } else { return null; } }
}

После отображения ActivitySplash его я принудительно уничтожаю, чтобы юзер в будущем не смог аппаратной кнопкой Назад вернуть. Применяю finish(). Грубовато, но ничего другого не придумал пока.
Activity2 доступно пользователю ТОЛЬКО, если это первый запуск приложения. Поэтому в последующих запусках мы просто его не вызываем, а сразу на ActivityMain. Оно загружается, и, когда приложение загрузило полностью Interstitial баннер, оно его сразу же отображает (это прописано в методе обратного вызова класса AdMobInterstitialLoader.
В ActivityMain чередуются Fragment'ы
Сама проблема.
Запускаю приложение, прохожу по Activity, загружается полностью ActivityMain, отображается нужный Fragment, поверх экрана появляется Interstitial баннер, я его закрываю крестиком вверху или аппаратной кнопкой Назад. Вместе с баннером закрывается приложение.
По логам видно, что Activity и Fragment уверенно прошлись по своим жизненным циклам до onDestroy(). Я в замешательстве. Что это может быть ?


Ответ

Нашел я причину возникновения этого явления.
Суть была в методе startNextActivity(), реализация которого - примитив. И, естественно, я его свернул, т.к. нечего в нем дорабатывать или улучшать. Но, когда появляется нездоровое поведение приложения, начинаешь заглядывать во все углы кода. Моя проблема была заключена в флаге Intent.FLAG_ACTIVITY_NO_HISTORY, который я когда-то поставил для некоторых нужд. И ЗАБЫЛ
// [ START startNextActivity() ] private void startNextActivity(Class nextActivityClass) { Intent intent = new Intent(this, nextActivityClass); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); } // [ END startNextActivity() ]
Этот флаг нужно удалить
Материал по Intent и флагам:
ENG - Intent @ developer.android.com RU - Урок 116. Поведение Activity в Task. Intent-флаги, launchMode, affinity @ http://startandroid.ru
И будьте внимательны ко всяким своим "Я ща попробую, а потом удалю". Потом может и не наступить! :-)

Наследование или добавление type поля?

В каких случаях вы бы стали наследовать класс, а в каких внедряли бы поле тип объекта?
Например: "Импульсный" и "Цифровой" счетчик различаются по набору полей. "Водяной счетчик" может быть как цифровым так и импульсным.
Однако чтоб получить "Водяной счетчик".data я должен поработать с полями импульсного счетчика или цифрового или интегрированного или... или ..
Напрашивается что-то вроде поля type в "Счетчик" тогда в коде можно оперировать с такими данными через switch, что сократит количество кода. Но тогда где определять эти "дополнительные" поля..
Постарался отобразить в коде суть вопроса.
// TypeScript not works on stackoverflow. // Первый пример abstract class Counter { constructor(protected serialNumber: string) {} getData(data: number): number { return data; }; } class ImpulseCounter extends Counter { constructor( private initCounter: number, private multipler: number, serialNumber, ) { super(serialNumber) } getData(data) { this.initCounter + this.multipler * data; } } class WaterImpulseCounter extends ImpulseCounter { constructor( private hot: boolean, initCounter, multipler, serialNumber ) { super(initCounter, multipler, serialNumber); } getData(data) { if (this.hot) { return this.super.getData(data) * 0.1 } else { return this.super.getData(data) } } } class DigitalCounter extends Counter { constructor( private address: string, serialNumber ) { super(serialNumber) } getData() { this.super.getData(); } } class WaterDigitalCounter extends DigitalCounter { constructor(private hot: boolean, address, serialNumber ) { super(address, serialNumber) } getData(data) { // Дублирование кода, тупик. if (this.hot) { return this.super.getData(data) * 0.1 } else { return this.super.getData(data) } } } // Второй пример enum DataTypes = { Impulse, Digital } abstract class Counter { constructor( protected serialNumber: string, protected dataType: DataTypes ) {} getData(data) { switch (this.dataType) { // В каком месте(классе) нужно определять switch логику и поля this.initCounter, this.multipler case (DataTypes.Impulse): { return this.initCounter + this.multipler * data; } } return data; }; } class WaterCounter extends Counter { hot: false; constructor( serialNumber, dataType: DataTypes ) { super(serialNumber, dataType) } getData(data) { if (this.hot) { return this.super.getData(data) * 0.1 } else { return this.super.getData(data) } } }


Ответ

Например: "Импульсный" и "Цифровой" счетчик различаются по набору полей. "Водяной счетчик" может быть как цифровым так и импульсным.
Пока это описание хрестоматийной мотивации использовать паттерн «Декоратор»:
class WaterCounter extends Counter { constructor( private impl: *Counter hot: bool serialNumber, ) { super(serialNumber) } getData(data: number): number { data=impl->data; return this.hot ? data * 0.1 : data; }; }
//...
waterImpulseCounter = new WaterCounter(new ImpulseCoubter(..., 0), hot, serial); digitalImpulseCounter = new WaterCounter(new DigitalCoubter(..., 0), hot, serial);
Но тут во-первых непонятно, что делать с серийником внутренних классов, а во-вторых немного страдает логика поведения: теперь возможно создать водный счётчик, который может использовать другой водный счётчик, так что помня основное правило, надо отделить реализацию от интерфейса; в итоге получится столь же хрестоматийный «мост»:
abstract class CounterImpl { constructor() {}
getData(data: number): number { return data; }; }
class ImpulseCounter extends CounterImpl { constructor( private initCounter: number, private multipler: number, ) { }
getData(data) { this.initCounter + this.multipler * data; } }
class DigitalCounter extends CounterImpl { constructor( private address: string, ) { }
getData() { this.super.getData(); } }
abstract class Counter { constructor(protected serialNumber: string private impl: *CounterImpl ) { }
getData(data: number): number { return impl->getData(data); }; }
class WaterCounter extends Counter { constructor( hot: bool serialNumber, ) { super(impl, serialNumber) } getData(data: number): number { return this.super.getData(data) * (this.hot ? 0.1 : 1); }; }

Event на удаление расширения chrome

Добрый день.
Существует ли в браузере Chrome какое-то событие, которое позволяет отследить удаление расширения для браузера(нужно удалить куки и прочую пользовательскую информацию)?


Ответ

При удалении расширения из Google Crome вы не получаете никаких событий,но есть полезный метод, благодаря чему вы можете удалить данные или выполнить другие действия. Когда пользователь удаляет ваше расширение, API перенаправляет пользователя на отдельную страницу где можно сделать дополнительные действия..:
setUninstallURL
chrome.runtime.setUninstallURL(string url, function callback)
Данная возможность поможет вам, детально в Документации

Нужно полностью обновить SQLite базу данных при повышении версии кода приложения

Имеется приложение, которое работает с локальной базой данных SQLite. В этой БД хранятся ссылки на файлы и ключевые слова, по которым можно найти их.
При первом запуске приложения создается БД путем парсинга xml. Все чудесно работало до тех пор, пока не встал вопрос обновления ВСЕХ записей в 2 таблицах БД.
Думал выполнить DROP TABLE ..., а потом создать их и наполнить в методе onUpgrade(), но при вызове AsyncTask из ловлю ошибку записи в БД - бд занята! Нечего ломиться!
Что делать нужно в такой ситуации ?
UPD 0
new LinksWordColorLoader(MyAppClass.getContext()).loadStepByStep();
содержит в себе
public LinksWordColorLoader(Context context) { this.mContext = context; DataBase dataBase = MyAppClass.getDataBaseInstance(); mDB = dataBase.getSQLiteDataBase(); }
public void loadStepByStep() { new LoadDataAsync().execute(); }
// прописан в классе MyAppClass, который унаследован от Application public static DataBase getDataBaseInstance() { DataBase dataBase = new DataBase(); dataBase.openDB(); return dataBase; }
UPD1
01-11 14:28:47.410 E: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ui.activity.ActivityMain}: android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368) at android.app.ActivityThread.access$600(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1330) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:155) at android.app.ActivityThread.main(ActivityThread.java:5536) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1074) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:841) at dalvik.system.NativeStart.main(Native Method) Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:909) at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:654) at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:340) at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:314) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:239) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:214) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:849) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:829) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:734) at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1086) at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) at com.database.DataBase.openDB(DataBase.java:284) at com.util.app.MyAppClass.getDataBaseInstance(MyAppClass.java:22) at com.database.LinksWordColorLoader.(LinksWordColorLoader.java:32) at com.database.DataBase$DBManager.onUpgrade(DataBase.java:328) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:257) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) at com.database.DataBase.openDB(DataBase.java:284) at com.app.MyAppClass.getDataBaseInstance(MyAppClass.java:22) at com.ui.fragment.data.HomeFrag.onCreateView(HomeFrag.java:62) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:
UPD2
// в классе DataBase private DBManager mDBManager; private SQLiteDatabase mDB;
public void openDB() { mDBManager = new DBManager( mContext, // context DATABASE_NAME, // DataBase Name null, // SQLiteDataBase Factory DATABASE_VERSION); // DataBase Version mDB = mDBManager.getWritableDatabase(); }
public void closeDB() { if (mDBManager != null) { mDBManager.close(); } }
private class DBManager extends SQLiteOpenHelper {
DBManager(Context context, String dbName, SQLiteDatabase.CursorFactory factory, int dbVersion) { super(context, dbName, factory, dbVersion); }
@Override public void onCreate(SQLiteDatabase db) { db.execSQL(DB_LINKS_TABLE_CREATE); db.execSQL(DB_WORD_COLOR_TABLE_CREATE); }
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + DB_LINKS_TABLE); // delete Links Table db.execSQL("DROP TABLE IF EXISTS " + DB_WORD_COLORS_TABLE); // delete Word-Color Table
onCreate(db); new LinksWordColorLoader(MyAppClass.getContext()).loadStepByStep(); } }


Ответ

Чтобы найти решение для своего вопроса, мне пришлось переписать весь код. Теперь все вот так:
public class DataBaseHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 3; public static final String DATABASE_NAME = "my_database";
private static DataBaseHelper mInstance; private static SQLiteDatabase myWritableDb;
private DataBaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }
public static DataBaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new DataBaseHelper(context); } return mInstance; }
public SQLiteDatabase getMyWritableDatabase() { if ((myWritableDb == null) || (!myWritableDb.isOpen())) { myWritableDb = this.getWritableDatabase(); }
return myWritableDb; }
@Override public void onCreate(SQLiteDatabase db) { MyAppLogs.show("onCreate DataBase Tables"); db.execSQL(DB_LINKS_TABLE_CREATE); // CREATE LINK TABLES db.execSQL(DB_WORD_COLOR_TABLE_CREATE); // CREATE WORD-COLOR TABLE }
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // удаляем таблицы db.execSQL("DROP TABLE IF EXISTS " + DB_LINKS_TABLE); db.execSQL("DROP TABLE IF EXISTS " + DB_WORD_COLORS_TABLE);
onCreate(db); new UpgradeDataAsync(db).execute(); }
// далее идут определения: название таблиц, колонок, скрипты создания этих таблиц
класс UpgradeDataAsync() - отвечает за наполнение пустых таблиц данными в AsyncTask
public class UpgradeDataAsync extends AsyncTask {
// здесь различные поля private SQLiteDatabase mSQLiteDB;
public UpgradeDataAsync(SQLiteDatabase db) { this.mSQLiteDB = db; }
// далее идут переопределенные методы AsyncTask: onPreExecute(), doInBackground(), и onProgressUpdate() и т.д. В которых мне и нужен был экземпляр SQLiteDatabase.
}

AJAX для нескольких объектов на чистом javascript

Есть элементы, по которым необходимо асинхронно получать информацию и выводить в отдельный блок при нажатии на кнопку, но я понять не могу, как сделать это.
Без каких-либо библиотек
Ниже мои потуги:

  • город Екатеринбург, улица Сельская, дом 6
  • город Москва, улица Московская, дом 5


Ответ

У вас изначально ошибка в верстке нельзя двум блокам задавать одинаковый id можно сделать так:

  • город Екатеринбург, улица Сельская, дом 6
  • город Москва, улица Московская, дом 5

на странице "function_snmp.php" сформируйте нужный html

Не линкуется Win API проект

Не могу подключить библиотеку comctl32. Точнее, она подключается, но:
undefined reference to `InitCommonControlsEx@4' collect2.exe: error: ld returned 1 exit status
Заголовки подключаются нормально:
#include #define _WIN32_IE 0x0600 #include
Сама библиотека лежит здесь:
C:\MinGW\lib\libcomctl32.a
Собираю так:
gcc.exe -std=c11 -m32 -Wall -Wextra -Wpedantic -mwindows -lcomctl32 -lbass main.c -o main.exe
Пробовал обновлять MinGW - безрезультатно.
ОС: Windows 10 x64
Компилятор: gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
UPD
Может это поможет:
nm C:\MinGW\lib\libcomctl32.a > nm_results.txt
dvbpbt.o: 00000000 I __libcomctl32_a_iname
dvbpbh.o: 00000000 i .idata$4 00000000 i .idata$5 00000000 I __head_libcomctl32_a U __libcomctl32_a_iname
dvbpbs00113.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp___TrackMouseEvent@4 00000000 T __TrackMouseEvent@4
dvbpbs00112.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Str_SetPtrW@8 00000000 T _Str_SetPtrW@8
dvbpbs00111.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Str_SetPtrA@8 00000000 T _Str_SetPtrA@8
dvbpbs00110.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Str_GetPtrW@12 00000000 T _Str_GetPtrW@12
dvbpbs00109.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Str_GetPtrA@12 00000000 T _Str_GetPtrA@12
dvbpbs00108.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ShowHideMenuCtl@12 00000000 T _ShowHideMenuCtl@12
dvbpbs00107.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__SetWindowSubclass@16 00000000 T _SetWindowSubclass@16
dvbpbs00106.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__SendNotifyEx@20 00000000 T _SendNotifyEx@20
dvbpbs00105.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__SendNotify@16 00000000 T _SendNotify@16
dvbpbs00104.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__RemoveWindowSubclass@12 00000000 T _RemoveWindowSubclass@12
dvbpbs00103.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ReAlloc@8 00000000 T _ReAlloc@8
dvbpbs00102.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__PropertySheetW@4 00000000 T _PropertySheetW@4
dvbpbs00101.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__PropertySheetA@4 00000000 T _PropertySheetA@4
dvbpbs00100.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__PropertySheet@4 00000000 T _PropertySheet@4
dvbpbs00099.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__MenuHelp@28 00000000 T _MenuHelp@28
dvbpbs00098.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__MakeDragList@4 00000000 T _MakeDragList@4
dvbpbs00097.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__LBItemFromPt@16 00000000 T _LBItemFromPt@16
dvbpbs00096.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__InitMUILanguage@4 00000000 T _InitMUILanguage@4
dvbpbs00095.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__InitCommonControlsEx@4 00000000 T _InitCommonControlsEx@4
dvbpbs00094.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__InitCommonControls@0 00000000 T _InitCommonControls@0
dvbpbs00093.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Write@8 00000000 T _ImageList_Write@8
dvbpbs00092.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetOverlayImage@12 00000000 T _ImageList_SetOverlayImage@12
dvbpbs00091.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetImageCount@8 00000000 T _ImageList_SetImageCount@8
dvbpbs00090.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetIconSize@12 00000000 T _ImageList_SetIconSize@12
dvbpbs00089.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetDragCursorImage@16 00000000 T _ImageList_SetDragCursorImage@16
dvbpbs00088.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetBkColor@8 00000000 T _ImageList_SetBkColor@8
dvbpbs00087.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_ReplaceIcon@12 00000000 T _ImageList_ReplaceIcon@12
dvbpbs00086.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Replace@16 00000000 T _ImageList_Replace@16
dvbpbs00085.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Remove@8 00000000 T _ImageList_Remove@8
dvbpbs00084.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Read@4 00000000 T _ImageList_Read@4
dvbpbs00083.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Merge@24 00000000 T _ImageList_Merge@24
dvbpbs00082.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_LoadImageW@28 00000000 T _ImageList_LoadImageW@28
dvbpbs00081.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_LoadImageA@28 00000000 T _ImageList_LoadImageA@28
dvbpbs00080.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_LoadImage@28 00000000 T _ImageList_LoadImage@28
dvbpbs00079.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetImageRect@12 00000000 T _ImageList_GetImageRect@12
dvbpbs00078.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetImageInfo@12 00000000 T _ImageList_GetImageInfo@12
dvbpbs00077.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetImageCount@4 00000000 T _ImageList_GetImageCount@4
dvbpbs00076.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetIconSize@12 00000000 T _ImageList_GetIconSize@12
dvbpbs00075.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetIcon@12 00000000 T _ImageList_GetIcon@12
dvbpbs00074.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetDragImage@8 00000000 T _ImageList_GetDragImage@8
dvbpbs00073.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetBkColor@4 00000000 T _ImageList_GetBkColor@4
dvbpbs00072.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_EndDrag@0 00000000 T _ImageList_EndDrag@0
dvbpbs00071.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Duplicate@4 00000000 T _ImageList_Duplicate@4
dvbpbs00070.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DrawIndirect@4 00000000 T _ImageList_DrawIndirect@4
dvbpbs00069.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DrawEx@40 00000000 T _ImageList_DrawEx@40
dvbpbs00068.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Draw@24 00000000 T _ImageList_Draw@24
dvbpbs00067.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DragShowNolock@4 00000000 T _ImageList_DragShowNolock@4
dvbpbs00066.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DragMove@8 00000000 T _ImageList_DragMove@8
dvbpbs00065.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DragLeave@4 00000000 T _ImageList_DragLeave@4
dvbpbs00064.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DragEnter@12 00000000 T _ImageList_DragEnter@12
dvbpbs00063.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Destroy@4 00000000 T _ImageList_Destroy@4
dvbpbs00062.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Create@20 00000000 T _ImageList_Create@20
dvbpbs00061.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Copy@20 00000000 T _ImageList_Copy@20
dvbpbs00060.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_BeginDrag@16 00000000 T _ImageList_BeginDrag@16
dvbpbs00059.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_AddMasked@12 00000000 T _ImageList_AddMasked@12
dvbpbs00058.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_AddIcon@8 00000000 T _ImageList_AddIcon@8
dvbpbs00057.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Add@12 00000000 T _ImageList_Add@12
dvbpbs00056.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__GetWindowSubclass@16 00000000 T _GetWindowSubclass@16
dvbpbs00055.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__GetSize@4 00000000 T _GetSize@4
dvbpbs00054.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__GetMUILanguage@0 00000000 T _GetMUILanguage@0
dvbpbs00053.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__GetEffectiveClientRect@12 00000000 T _GetEffectiveClientRect@12
dvbpbs00052.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__FreeMRUList@4 00000000 T _FreeMRUList@4
dvbpbs00051.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Free@4 00000000 T _Free@4
dvbpbs00050.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__FindMRUStringW@12 00000000 T _FindMRUStringW@12
dvbpbs00049.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__FindMRUStringA@12 00000000 T _FindMRUStringA@12
dvbpbs00048.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__FindMRUData@16 00000000 T _FindMRUData@16
dvbpbs00047.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__EnumMRUListW@16 00000000 T _EnumMRUListW@16
dvbpbs00046.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__EnumMRUListA@16 00000000 T _EnumMRUListA@16
dvbpbs00045.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DrawStatusTextW@16 00000000 T _DrawStatusTextW@16
dvbpbs00044.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DrawStatusTextA@16 00000000 T _DrawStatusTextA@16
dvbpbs00043.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DrawStatusText@16 00000000 T _DrawStatusText@16
dvbpbs00042.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DrawInsert@12 00000000 T _DrawInsert@12
dvbpbs00041.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DestroyPropertySheetPage@4 00000000 T _DestroyPropertySheetPage@4
dvbpbs00040.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DelMRUString@8 00000000 T _DelMRUString@8
dvbpbs00039.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DefSubclassProc@16 00000000 T _DefSubclassProc@16
dvbpbs00038.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_SetItem@12 00000000 T _DSA_SetItem@12
dvbpbs00037.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_InsertItem@12 00000000 T _DSA_InsertItem@12
dvbpbs00036.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_GetItemPtr@8 00000000 T _DSA_GetItemPtr@8
dvbpbs00035.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_GetItem@12 00000000 T _DSA_GetItem@12
dvbpbs00034.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_Destroy@4 00000000 T _DSA_Destroy@4
dvbpbs00033.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_DeleteItem@8 00000000 T _DSA_DeleteItem@8
dvbpbs00032.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_DeleteAllItems@4 00000000 T _DSA_DeleteAllItems@4
dvbpbs00031.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_Create@8 00000000 T _DSA_Create@8
dvbpbs00030.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Sort@12 00000000 T _DPA_Sort@12
dvbpbs00029.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_SetPtr@12 00000000 T _DPA_SetPtr@12
dvbpbs00028.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Search@24 00000000 T _DPA_Search@24
dvbpbs00027.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_InsertPtr@12 00000000 T _DPA_InsertPtr@12
dvbpbs00026.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Grow@8 00000000 T _DPA_Grow@8
dvbpbs00025.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_GetPtrIndex@8 00000000 T _DPA_GetPtrIndex@8
dvbpbs00024.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_GetPtr@8 00000000 T _DPA_GetPtr@8
dvbpbs00023.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Destroy@4 00000000 T _DPA_Destroy@4
dvbpbs00022.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_DeletePtr@8 00000000 T _DPA_DeletePtr@8
dvbpbs00021.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_DeleteAllPtrs@4 00000000 T _DPA_DeleteAllPtrs@4
dvbpbs00020.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_CreateEx@8 00000000 T _DPA_CreateEx@8
dvbpbs00019.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Create@4 00000000 T _DPA_Create@4
dvbpbs00018.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Clone@8 00000000 T _DPA_Clone@8
dvbpbs00017.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateUpDownControl@48 00000000 T _CreateUpDownControl@48
dvbpbs00016.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateToolbarEx@52 00000000 T _CreateToolbarEx@52
dvbpbs00015.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateToolbar@32 00000000 T _CreateToolbar@32
dvbpbs00014.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateStatusWindowW@16 00000000 T _CreateStatusWindowW@16
dvbpbs00013.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateStatusWindowA@16 00000000 T _CreateStatusWindowA@16
dvbpbs00012.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateStatusWindow@16 00000000 T _CreateStatusWindow@16
dvbpbs00011.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateProxyPage@8 00000000 T _CreateProxyPage@8
dvbpbs00010.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreatePropertySheetPageW@4 00000000 T _CreatePropertySheetPageW@4
dvbpbs00009.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreatePropertySheetPageA@4 00000000 T _CreatePropertySheetPageA@4
dvbpbs00008.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreatePropertySheetPage@4 00000000 T _CreatePropertySheetPage@4
dvbpbs00007.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreatePage@8 00000000 T _CreatePage@8
dvbpbs00006.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateMappedBitmap@20 00000000 T _CreateMappedBitmap@20
dvbpbs00005.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateMRUListW@4 00000000 T _CreateMRUListW@4
dvbpbs00004.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateMRUListA@4 00000000 T _CreateMRUListA@4
dvbpbs00003.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Alloc@4 00000000 T _Alloc@4
dvbpbs00002.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__AddMRUStringW@8 00000000 T _AddMRUStringW@8
dvbpbs00001.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__AddMRUStringA@8 00000000 T _AddMRUStringA@8
dvbpbs00000.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__AddMRUData@12 00000000 T _AddMRUData@12

Упоминание InitCommonControlsEx@4 из верхнего листинга:
dvbpbs00095.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__InitCommonControlsEx@4 00000000 T _InitCommonControlsEx@4
Пробовал скачивать разные версии libcomctl32.a отсюда: https://sourceforge.net/projects/mingw/files/MinGW/Base/w32api/. Безрезультатно.
UPD 2
Вывод nm для main.exe
nm main.exe 00000000 b .bss 00000000 d .data 00000000 i .drectve 00000000 r .eh_frame 00000000 r .rdata 00000000 r .rdata$zzz 00000000 t .text U ___mingw_vprintf 00000004 C _BASS_Apply3D 00000004 C _BASS_ChannelBytes2Seconds 00000004 C _BASS_ChannelFlags 00000004 C _BASS_ChannelGet3DAttributes 00000004 C _BASS_ChannelGet3DPosition 00000004 C _BASS_ChannelGetAttribute 00000004 C _BASS_ChannelGetData 00000004 C _BASS_ChannelGetDevice 00000004 C _BASS_ChannelGetInfo 00000004 C _BASS_ChannelGetLength 00000004 C _BASS_ChannelGetLevel 00000004 C _BASS_ChannelGetPosition 00000004 C _BASS_ChannelGetTags 00000004 C _BASS_ChannelIsActive 00000004 C _BASS_ChannelIsSliding 00000004 C _BASS_ChannelLock 00000004 C _BASS_ChannelPause 00000004 C _BASS_ChannelPlay 00000004 C _BASS_ChannelRemoveDSP 00000004 C _BASS_ChannelRemoveFX 00000004 C _BASS_ChannelRemoveLink 00000004 C _BASS_ChannelRemoveSync 00000004 C _BASS_ChannelSeconds2Bytes 00000004 C _BASS_ChannelSet3DAttributes 00000004 C _BASS_ChannelSet3DPosition 00000004 C _BASS_ChannelSetAttribute 00000004 C _BASS_ChannelSetDevice 00000004 C _BASS_ChannelSetDSP 00000004 C _BASS_ChannelSetFX 00000004 C _BASS_ChannelSetLink 00000004 C _BASS_ChannelSetPosition 00000004 C _BASS_ChannelSetSync 00000004 C _BASS_ChannelSlideAttribute 00000004 C _BASS_ChannelStop 00000004 C _BASS_ChannelUpdate 00000004 C _BASS_ErrorGetCode 00000004 C _BASS_Free 00000004 C _BASS_FXGetParameters 00000004 C _BASS_FXReset 00000004 C _BASS_FXSetParameters 00000004 C _BASS_Get3DFactors 00000004 C _BASS_Get3DPosition 00000004 C _BASS_GetConfig 00000004 C _BASS_GetConfigPtr 00000004 C _BASS_GetCPU 00000004 C _BASS_GetDevice 00000004 C _BASS_GetDeviceInfo 00000004 C _BASS_GetDSoundObject 00000004 C _BASS_GetEAXParameters 00000004 C _BASS_GetInfo 00000004 C _BASS_GetVersion 00000004 C _BASS_GetVolume 00000004 C _BASS_Init 00000004 C _BASS_MusicFree 00000004 C _BASS_MusicLoad 00000004 C _BASS_Pause 00000004 C _BASS_PluginFree 00000004 C _BASS_PluginGetInfo 00000004 C _BASS_PluginLoad 00000004 C _BASS_RecordFree 00000004 C _BASS_RecordGetDevice 00000004 C _BASS_RecordGetDeviceInfo 00000004 C _BASS_RecordGetInfo 00000004 C _BASS_RecordGetInput 00000004 C _BASS_RecordGetInputName 00000004 C _BASS_RecordInit 00000004 C _BASS_RecordSetDevice 00000004 C _BASS_RecordSetInput 00000004 C _BASS_RecordStart 00000004 C _BASS_SampleCreate 00000004 C _BASS_SampleFree 00000004 C _BASS_SampleGetChannel 00000004 C _BASS_SampleGetChannels 00000004 C _BASS_SampleGetData 00000004 C _BASS_SampleGetInfo 00000004 C _BASS_SampleLoad 00000004 C _BASS_SampleSetData 00000004 C _BASS_SampleSetInfo 00000004 C _BASS_SampleStop 00000004 C _BASS_Set3DFactors 00000004 C _BASS_Set3DPosition 00000004 C _BASS_SetConfig 00000004 C _BASS_SetConfigPtr 00000004 C _BASS_SetDevice 00000004 C _BASS_SetEAXParameters 00000004 C _BASS_SetVolume 00000004 C _BASS_Start 00000004 C _BASS_Stop 00000004 C _BASS_StreamCreate 00000004 C _BASS_StreamCreateFile 00000004 C _BASS_StreamCreateFileUser 00000004 C _BASS_StreamCreateURL 00000004 C _BASS_StreamFree 00000004 C _BASS_StreamGetFilePosition 00000004 C _BASS_StreamPutData 00000004 C _BASS_StreamPutFileData 00000004 C _BASS_Update U _CreateWindowExW@48 00000220 D _current_sound U _DefWindowProcW@16 U _DispatchMessageA@4 U _exit 00000020 D _genres U _GetMessageA@16 U _GetProcAddress@8 U _GetSysColorBrush@4 U _InitCommonControlsEx@4 U _LoadCursorA@8 U _LoadLibraryA@4 U _malloc 0000001c C _msg U _PostQuitMessage@4 00000000 t _printf 0000022a T _qk_CheckBASSVersion 00000004 C _qk_cmd_line 00000004 C _qk_cmd_show 000008b2 T _qk_CreateMainWindow 00000782 T _qk_DecreasePos 000004b0 T _qk_DecreaseVol 000002ef T _qk_GetCPULoad 0000082a T _qk_GetSoundAlbum 0000080d T _qk_GetSoundArtist 00000698 T _qk_GetSoundCurrentMinute 000006b1 T _qk_GetSoundCurrentSecond 00000864 T _qk_GetSoundGenre 000005ea T _qk_GetSoundLengthInBytes 000005fa T _qk_GetSoundLengthInSeconds 00000604 T _qk_GetSoundPosInBytes 00000627 T _qk_GetSoundPosInSeconds 00000413 T _qk_GetSoundState 000007f0 T _qk_GetSoundTitle 00000847 T _qk_GetSoundYear 0000041d T _qk_GetVol 00000004 C _qk_hinstance 00000718 T _qk_IncreasePos 0000044f T _qk_IncreaseVol 00000279 T _qk_InitBASS 00000029 T _qk_LoadBASSFunctions 00000318 T _qk_LoadSound 0000050f t _qk_LoadSoundLength 00000260 D _qk_main_win_title 00000018 C _qk_main_window 000003ed T _qk_PauseSound 000003bf T _qk_PlaySound 00000004 C _qk_sample_rate 000006d5 T _qk_SetPos 0000030a T _qk_SetSampleRate U _RegisterClassW@4 U _SendMessageW@16 00000004 D _tags_unknown_album 00000008 D _tags_unknown_artist 0000000c D _tags_unknown_title 00000000 D _tags_unknown_year U _TranslateMessage@4 U _wcscpy U _wcslen 00000ce9 T _WinMain@16 00000a02 T _WndProc@16
Из верхнего листинга:
00000020 D _genres U _GetMessageA@16 U _GetProcAddress@8 U _GetSysColorBrush@4 U _InitCommonControlsEx@4 <----------------- U _LoadCursorA@8 U _LoadLibraryA@4 U _malloc


Ответ

В общем, нашел решение здесь здесь
-lcomctl32 -luxtheme Put these after main.cpp
Т.е., в моем случае:
Было:
gcc.exe -std=c11 -m32 -Wall -Wextra -Wpedantic -mwindows -lcomctl32 -lbass main.c -o main.exe
Стало:
gcc.exe -std=c11 -m32 -Wall -Wextra -Wpedantic -mwindows -lbass main.c -lcomctl32 -o main.exe
Поместил -lcomctl32 после main.c