Страницы

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

пятница, 6 марта 2020 г.

Проблемы с кодировкой на ideone

#cpp #кодировка #ideone


Как известно, ideone компилирует исходники на Си++ в utf8. Однако, мне нужна строка
в utf16 (wstring). Попытался сконвертировать, но получилось что-то не то (причём конвертация
из wstring в utf8 работает верно):

wstring_convert < codecvt_utf8_utf16 , wchar_t> convert;

const char *s = "еёЁжикЕст";
wstring str = convert.from_bytes(s);

for (int q=0; s[q]; ++q) cout << (int)s[q] << ' ';
cout << endl;
for (int q=0; q "%" + (x & 255).toString(16)).join("")
)

console.log(s)
console.log(s.split("").map(ch => ch.charCodeAt(0)).join(" "))




К тому же, если сделать 

wchar_t bin[] = {1077, 1105, 1025, 1078, 1080, 1082, 1045, 1089, 1090, 0};
str = bin;
cout << convert.to_bytes(str.c_str()) << endl;


то вывод верный.

Код полностью: http://ideone.com/ut7Nsg
    


Ответы

Ответ 1



Однако, мне нужна строка в utf16 (wstring). Это неверно, кодировка std::wstring в стандарте не указана, на Windwows/MSVC sizeof(wchar_t) 2, и там кодировка utf-16, на Linux/gcc sizeof(wchar_t) 4 и кодировка utf-32, ideone использует gcc, отсюда очевидные проблемы, переносимый способ получить код в utf-16 (c++11): #include #include #include #include int main() { std::wstring_convert < std::codecvt_utf8_utf16, char16_t> convert; const char *s = "еёЁжикЕст"; std::cout << "Input: " << s << "\n"; std::u16string str = convert.from_bytes(s); for (int q=0; s[q]; ++q) std::cout << (int)s[q] << ' '; std::cout << '\n'; for (int q=0; q

Как получить иконку папки?

#c_sharp


Как получить иконку папки?

Например

Control Panel

Shell:::{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}

    


Ответы

Ответ 1



Проще всего использовать Windows API Code Pack, чтобы не возиться с interop'ом и COM-объектами. Если у вас Visual Studio версии до 2017, вам нужно будет вручную подключить nuget-пакет Windows API Code Pack - Shell. (2017-ая студия найдёт и предложит подключить пакет сама, увидев незнакомый тип.) Подключив пакет, мы сможем работать с типами ShellObject или ShellFolder. Для того, чтобы получить сам каталог, нам нужно написать, например, (ShellFolder)ShellObject.FromParsingName("shell:::{4234d49b-0245-4df3-b780-3893943456e1}"); ShellFolder является списком своих подобъектов, поэтому перечислить подобъекты можно просто так: var sf = (ShellFolder)ShellObject.FromParsingName( "shell:::{4234d49b-0245-4df3-b780-3893943456e1}"); Console.WriteLine(sf.Name); foreach (var item in sf) { Console.WriteLine(item.Name); ShellThumbnail t = item.Thumbnail; } Иконка подкаталога содержится в объекте ShellThumbnail. Сам объект содержит иконки в различных форматах (icon, WPF System.Windows.Media.Imaging.BitmapSource и WinForms System.Drawing.Bitmap) и различных размерах. Для отображения нам понадобится графическое приложение. Я воспользуюсь более простым WPF. public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = ShellObject.FromParsingName( "shell:::{4234d49b-0245-4df3-b780-3893943456e1}"); } } Результат:

Исключение по адресу в программе на ассемблере

#ассемблер #исключения


Мне нужно написать программу на ассемблере х64 в VS 2017, Windows 10.
Нужно ввести в окошко строку, а программа должна заменить * на пробелы и вывести
в строку результат.

Пример нашей преподавательницы запускается, но при нажатии на кнопку RUN происходит
исключение по адресу.

Не знаете, в чем проблема? Сама она тоже не знает. Код ниже. 
Заранее спасибо.

ExitProcess PROTO 
DlgProc PROTO :QWORD,:QWORD, :QWORD, :QWORD
PostQuitMessage PROTO
GetModuleHandleA PROTO
DialogBoxParamA PROTO
GetDlgItemTextA PROTO
SendDlgItemMessageA PROTO

include windows.inc

.data
DName db "dial",0
hinst dq ?
result_buffer db 20 dup ("0")

hwnd dq 0
uMsg dq 0
wParam dq 0
lParam dq 0

.code
main proc
 sub rsp, 56

 mov rcx,0
 call GetModuleHandleA 
 mov hinst,rax

 mov rcx,hinst
 lea rdx, DName
 mov r8,0
 lea r9,DlgProc
 mov     dword ptr [rsp+32], 0
 call DialogBoxParamA
 mov rcx,0
 call ExitProcess 
 main endp

DlgProc proc q:QWORD,w:QWORD, e:QWORD, r:QWORD
  cmp edx, WM_CLOSE ;10h   
  je Exit_Button

  cmp edx, WM_COMMAND   ;111h   
  je go_button
  jne End_it 

 go_button:
 cmp r8,4
 je Exit_Button
 cmp r8,3
 je next
 jne End_it

 next:
    mov hwnd,rcx
    mov uMsg,rdx
    mov wParam,r8
    mov lParam,r9

    mov rdx,1
    lea r8,result_buffer
    mov r9,20
    call GetDlgItemTextA

    mov rcx,  hwnd
    mov rdx,  uMsg
    mov r8,   wParam
    mov r9,   lParam

        mov hwnd,rcx

    mov rcx,rax
    lea rsi,result_buffer
    m1:
     cmp byte ptr [rsi],'*'
     je m2
     jne m3
     m2:
      mov byte ptr [rsi],' '
     m3:
      inc rsi
     loop m1    

        mov rcx,hwnd

    mov rdx,2
    mov r8,LB_DELETESTRING  ;  182h - LB_DELETESTRING
    mov r9,0
    lea rsi,result_buffer
    mov qword ptr [rsp+32],rsi 
    call SendDlgItemMessageA

        mov rcx,  hwnd
        mov rdx,  uMsg
        mov r8,   wParam
        mov r9,   lParam

    mov rdx,2
    mov r8,LB_ADDSTRING  ;  182h - LB_DELETESTRING
    mov r9,0
    lea rsi,result_buffer
    mov qword ptr [rsp+32],rsi 
    call SendDlgItemMessageA
    jmp End_it

Exit_Button:
    mov rcx,0
    call PostQuitMessage

End_it:    
    mov rax,0
    ret
DlgProc endp 
end


Файл RSRC.RC

dial DIALOG 0, 0, 309, 95
CAPTION "mY dialog"
BEGIN
    EDITTEXT 1, 48,7,222,14
    ListBox 2,48,24,222,14
    PUSHBUTTON "Run", 3, 167,41,50,14  
    PUSHBUTTON "Exit",4, 220,41,50,12
    LTEXT "Input string:", -1, 7,10,40,8    
END 


Ошибка в отладчике:


    


Ответы

Ответ 1



В коде две проблемы, приводящих к вылетам: Не проверяется что введена пустая строка (значение, возвращенное из GetDlgItemTextA, равно нулю), из-за чего при первом попадании на инструкцию loop 0 в регистре rcx превращается в -1, получаем "бесконечный" цикл и попытку записи за пределы секции данных. В начале процедуры DlgProc нужно выделить на стеке место под параметры процедуры SendDlgItemMessageA, при выходе из DlgProc стек восстановить. Из-за того что это не выполнено, скорее всего при выполнении SendDlgItemMessageA (которое происходит только при нажатии кнопки "Run") происходит затирание каких-то данных вызывающего кода, при выходе из процедуры происходит вылет. Вот рабочий код, адаптированный под fasm, с моими замечаниями: include 'win64a.inc' format MS64 COFF public main extrn PostQuitMessage extrn SendDlgItemMessageA extrn GetModuleHandleA extrn GetDlgItemTextA extrn DialogBoxParamA extrn ExitProcess section '.data' readable writeable DName db "dial",0 result_buffer db 20 dup ("0") section '.code' code readable executable main: sub rsp, 5*8 ; место под 5 параметров для вызова DialogBoxParamA mov rcx,0 call GetModuleHandleA mov rcx, rax ; [hinst] mov rdx, DName mov r8, 0 mov r9, DlgProc mov dword [rsp+32], 0 call DialogBoxParamA mov rcx,0 call ExitProcess proc DlgProc hwnd, uMsg, wParam, lParam ; место под параметры на стеке выделено как раз для того, ; чтобы можно было сохранить там значения тех же параметров из регистров mov [hwnd], rcx mov [uMsg], rdx mov [wParam], r8 mov [lParam], r9 sub rsp, 5*8 ; резервируем на стеке место под 5 параметров для вызова SendDlgItemMessageA cmp edx, WM_CLOSE ; 10h je Exit_Button cmp edx, WM_COMMAND ; 111h je go_button jne End_it go_button: cmp r8,4 je Exit_Button cmp r8,3 ; je next ; лишняя проверка jne End_it ; next: mov rdx,1 mov r8, result_buffer mov r9,20 call GetDlgItemTextA ; Не нужно постоянно гонять параметры между памятью и регистрами ; mov rcx, hwnd ; mov rdx, uMsg ; mov r8, wParam ; mov r9, lParam ; mov hwnd,rcx test rax, rax ; не забываем проверить, что введена не пустая строка jz End_it mov rcx, rax mov rsi, result_buffer m1: cmp byte [rsi], '*' ; je m2 ; лишняя проверка jne m3 ; m2: mov byte [rsi], '+' ; заменяю на +, чтобы была заметнее разница m3: inc rsi loop m1 mov rcx, [hwnd] mov rdx, 2 ; ListBox mov r8, LB_DELETESTRING ; 182h - LB_DELETESTRING mov r9, 0 mov qword [rsp+32], result_buffer ; mov qword ptr [rsp+32], offset result_buffer для masm call SendDlgItemMessageA ; mov rcx, hwnd ; mov rdx, uMsg ; mov r8, wParam ; mov r9, lParam mov rcx, [hwnd] mov rdx,2 mov r8, LB_ADDSTRING mov r9,0 mov qword [rsp+32], result_buffer call SendDlgItemMessageA jmp End_it Exit_Button: mov rcx,0 call PostQuitMessage End_it: mov rax,0 add rsp, 5*8 ; восстанавливаем стек ret endp Для компиляции нужен fasm, а также GoRC и GoLink (см. The Go tools for Windows + Assembler, к языку Go не имеют никакого отношения). Для отладки использовал x64dbg. Собственно, компиляция: fasm dialog.asm gorc /machine X64 rsrc.rc golink dialog.obj rsrc.res user32.dll kernel32.dll /entry main Ну и наконец скриншот (состояние после ввода текста и нажатия на кнопку Run): P.S. "криво расставленные котлы" авторские, rsrc.rc я в неизмененном виде взял из вопроса.

Атрибут __next__ не переопределяется

#python #python_3x #генераторы #динамическая_типизация


У меня есть класс в котором я переопределяю метод __next __ после его первого вызова,
но проблема в том что работать продолжает старый __next __.

class I:
    def __init__(self, head):
        self.head = iter(head)

    def __iter__(self):
        return self

    def __next__(self):
        self.__next__ = self.head.__next__
        return 'a'


i = I((1, 2, 3))
i_it = iter(i)
print(next(i_it)) #выводит 'a'. Все ок
print(next(i_it)) #снова 'a'. Почему не 1?
print(i_it.__next__) #
вроде __next__ переопределен 


P.S Если переопределять что-то другое то все работает:

    def __next__(self):
        self.__next__ = self.head.__next__
        self.x = 1
        return 'a'


После вызова next(self) x будет 1.
Ссылка на онлайн компилятор: https://repl.it/HVOC/17

P.P.S: В коментариях говорят что если вызывать i_it.__next __() то все будет работать
так как надо, я это знаю, но штука в том что в любом итераторе(цикл for например) работает
next(self), а не self.__next __().
    


Ответы

Ответ 1



На сколько я понимаю, в cpython встроенная функция next() определяется тут: builtin_next(). Можно увидеть, что при вызове имеется следующая конструкция: res = (*it->ob_type->tp_iternext)(it); Полагаю, что она равносильна примерно такой конструкции на Python: next(i) --> i.__class__.__next__(i) что сходится с тем, что видно на практике. Как дела происходят в других интерпретаторах мне не известно.

Ответ 2



Сначала i_it.__next__ = i.__next__. Затем i.__next__ = self.head.__next__ Но i_it.__next__ остался прежним, тк его не меняли. Те __next__ был изменен только для объекта класса i, но не для итератора i_it

Несколько вопросов по ASP.MVC и AJAX

#ajax #aspnet_mvc


Я только разбираюсь в ASP.MVC и может быть задаю глупые вопросы.
В данном случае вопросы будут не "как сделать", а "почему так происходит".
Делаю проект, суть которого заключается в том, что он обходит сайт, собирает ссылки
на его страницы и  измеряет время отклика. Потом, собранную информацию выводит в табличном
виде (пока).
Проект состоит из двух страниц. На первой - в соответствующем инпуте водится поле
и по нажатию кнопки идет переход на другой контроллер (ToolController), который  производит
замеры и выводит результаты.

Код метода первого контроллера (HomeController):

public ActionResult Submit(string Url)
{
    if (CheckUrl(Url))
    {
        ViewBag.Error = "";
        return RedirectToAction("Index", "Tool", new { Url });
    }
    else
    {
        ViewBag.Error = "Некорректный адрес!"; 
        return RedirectToAction("Index");
    }

}


Валидацию пока можно не смотреть, это буду отдельно разбираться.

Представление (фрагмент):

 @using (Html.BeginForm("Submit", "Home", FormMethod.Post))
{
    
@Html.Label("Введите адрес сайта в поле ввода и нажмите кнопку")
@Html.TextBox("Url") @ViewBag.Error
} Во ToolController есть поле private поле класса VMManager, методы которого реализуют бизнес-логику. В классе VMManager есть поле вью-модели (VM), потому что все дальнейшие действия будут крутиться вокруг один раз построенной VM (сохранение в БД - пока не реализовано). Представление выводит таблицу, состоящую из ссылок на страницы сайта (Ajax.ActionLink), по нажатию на которые должно подгружаться partialView с графическим представлением информации. До графического представления мне пока далеко, пока разобраться бы что в табличном происходит. Фрагмент контроллера (ToolController): private static VMManager manager = new VMManager(); public ToolController() { // manager = new VMManager(); } // GET: Tool public ActionResult Index(string url) { // manager = new VMManager(); manager.VM = (SiteVM)manager.GetVM(url); return View(manager.VM); } public ActionResult ShowPageResultInChart(string pattern) { if (pattern == "test") return null; Thread.Sleep(1000); return PartialView("ShowPageResultInChart"); } Фрагмент представления: @Html.Action("ShowPageResultInChart", new { pattern ="test" }) @foreach (var item in Model.PageResults) { @Ajax.ActionLink(item.PageAddress, "ShowPageResultInChart", new {pattern= item.PageAddress }, new AjaxOptions { UpdateTargetId = "ChartData", LoadingElementId = "LoadingIndicator" } ) @item.MinTime @item.AverageTime @item.MaxTime } В частичном представлении пока смотреть нечего: строчка "Сработал Ajax" Теперь вопросы: Если верить отладчику, то при первичной загрузке основной страницы запускается метод ShowPageResultInChart. Хотя он предполагался к запуску только при нажатии на Ajax.ActionLink. Почему, что я сделал не так? От этой беды я избавился условием в методе ShowPageResultInChart, но почему он срабатывает? Я правильно понимаю, что это противоречит смыслу Ajax? Разместить его ниже таблицы я не могу по условиям задания. Причем у меня сложилось впечатление, что запускается он как минимум 2 раза, но может я ошибаюсь. Судя по всему, у меня запускается несколько экземпляров второго контроллера. Это я понял по тому, что VM в процессе обнуляется и при нажатии на Ajax.ActionLink на входе метода ShowPageResultInChart VM = null. Такое впечатление, что первый экземпляр создается при выводе таблицы, второй - при нажатии на Ajax.ActionLink. От этой беды я избавился сделав поле менеджера статическим, но почему так происходит?


Ответы

Ответ 1



1) ShowPageResultInChart вы вызываете не только с помощью @Ajax.ActionLink, а также с помощью @Html.Action, отсюда он и выполняется при загрузке страницы. @Html.Action("ShowPageResultInChart", new { pattern ="test" }) 2) При каждом запросе создается отдельный экземпляр класса Controller через ControllerFactory. Обратите внимание, что Html.Action Html Helper создаст другой экземпляр контроллера. В общем, ControllerActivator.Create вызывается (для каждого запроса), чтобы создать контроллер (который создает новый контроллера или через DependencyResolver или через Activator, если не Resolver не был установлен): public IController Create(RequestContext requestContext, Type controllerType) { try { return (IController) (_resolverThunk().GetService(controllerType) ? ? Activator.CreateInstance(controllerType)); }

Как сделать не закрывающуюся программу на Java SE?

#java


Нужно сделать что бы программа после запуска ожидала команд и после того как команда
отработала она продолжала их ждать.
    


Ответы

Ответ 1



Сделай обработку в цикле while(true) или напиши прогу с UI. Можешь запускать задачу в новом потоке и ждать от пользователя ввода символа.

Как правильно записать конструктор класса с полем map?

#cpp #stl #map #шаблоны_с++


//hashtable.h
#pragma once
#include 
#include 
#include 
using namespace std;

template
class hashtable
{
private:
    map *table;
public:
    hashtable(kType k, vType v);
    ~hashtable();
};




//hashtable.cpp
#include "hashtable.h"

template
hashtable::hashtable() 
{
    // ??? Compiler Error C2955 ('hashtable': use of class template requires template
argument list)
}


Could you tell me what is wrong there?

Возможно ли вообще и если да, то как записать map в качестве поля класса?
Так чтобы можно было написать hashtable  и получался ассоциативный массив
с ключем в виде char* и параметром int, но чтобы была возможность задать и другие типы? 

по ТЗ, использовать map надо обязательно
    


Ответы

Ответ 1



Ваша функция должна быть определена как template hashtable::hashtable(kType k, vType v) ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ чтобы соответствовало объявлению в классе