Задать вопрос
  • Как модифицировать память программы используя WriteProcessMemory() в C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как используя адрес переменной полученный из первый программы изменить значение самой переменной?


    DWORD ProcessId = ...;
    LPVOID Address = ...;
    int value = 500;
    
    processHandle = OpenProcess(PROCESS_VM_WRITE, FALSE, ProccessId);
    if (WriteProcessMemory(processHandle, Address, &newValue, sizeof(newValue), NULL))
        printf("Success\n");
    else
        printf("Error\n");


    В первой программе нужно сделать volatile int value = 100;, чтобы она гарантированно извлекала значение переменной из памяти на каждой итерации цикла.
    Ответ написан
  • Как в system V amd64 abi поместить метку в регистр?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    я хочу поместить метку "L0" в регистр %rbx.
    relocation R_X86_64_32S against `.text' can not be used when making a shared object

    Если это локальная метка -- то по смещению от PC:
    leaq L0(%rip), %rbx
    Если это метка из другой динамической библиотеки -- то через plt:
    movq L0@gotpcrel(%rip), %rbx
    Ответ написан
    1 комментарий
  • Как совместить lib файл с проектом?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    После сборки чужой библиотеки из исходного кода, появился файл с расширением .lib

    Традиционно статические библиотеки называются *.lib на винде и *.a на *nix. Динамические библиотеки называются *.dll и *.so, соответственно.

    Что делать с ним - непонятно,

    Передавать линковщику. Нет разницы, как оно называется.
    Ответ написан
    Комментировать
  • Почему команда uniq не работает должным образом?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему команда uniq не работает должным образом?

    Потому что она ожидает, что повторяющиеся строки идут друг за другом. Можно в конвейер вставить sort перед uniq, чтобы одинаковые строки сгруппировать.
    Ответ написан
    2 комментария
  • Почему возникает ошибка линковки в данном случае?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему возникает ошибка линковки в данном случае?
    'memset' was not declared in this scope

    Это ошибка компиляции, а не линковки. Потому что не хватает #include <cstring>
    Ответ написан
    4 комментария
  • Какая команда покажет наличие файлов в большом и малом регистре в одной директории одновременно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    примерно так:
    find -type f | sort --ignore-case | uniq -D -i
    Ответ написан
    Комментировать
  • Как сделать плавное изменение яркости ШИМ?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    хочется чтобы лента плавно изменяла яркость

    для этого нужно менять скважность ШИМ не один раз скачком от текущего значения к целевому, а постепенно, за несколько шагов. С постоянной скоростью -- примерно так:
    void set_pwm_smooth(int new_pwm)
    {
        static const int pwm_step = ...; // шаг изменения ШИМ
        static const int pwm_step_time = ...; // время одного шага изменения ШИМ
        static int old_pwm;
        int pwm = old_pwm;
    
        while (pwm != new_pwm) {
            int next_pwm = pwm + (pwm < new_pwm ? pwm_step : -pwm_step);
            if ((pwm < new_pwm && next_pwm > new_pwm) ||
                (pwm > new_pwm && next_pwm < new_pwm))
                pwm = new_pwm;
            else
                pwm = next_pwm;
            analogWrite(LEDPIN, pwm);
            delay(pwm_step_time);
        }
        old_pwm = new_pwm;
    }
    Ответ написан
  • В чем может быть проблема сборки исходников?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    windres lib/glut/glut.rc lib/glut/resources.o
    : Invalid argumentresources.o

    в чем может быть дело

    windres не нравится второй аргумент командной строки. Похоже на то, что он ожидает '\' в качестве разделителя элементов пути к файлу вместо '/'.
    Можно начать с проверки того, в этом ли дело, запустив windres так: windres lib\glut\glut.rc lib\glut\resources.o
    Ещё стоит проверить, что используется windres из того же набора, что и остальные инструменты сборки, а не какой-нибудь левый.
    Ответ написан
    Комментировать
  • Почему тут undefined reference?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подскажите пожалуйста, почему так

    Потому что порядок перечисления библиотек важен: в списке библиотек a b c символы, которые нужны библиотеке b будут искаться только в библиотеке c, но не в a. Если между библиотеками нет циклических зависимостей (т.е. нет такого, что a определяет символ, нужный b, а b определяет символ, нужный a), то их можно упорядочить так, что линковка будет успешной (см. топологическая сортировка). Если циклические зависимости есть, или сортировать лень, можно перечислить нужные библиотеки несколько раз или взять их в группу:
    g++ main.cpp -Wl,--start-group -lglfw3 -lgdi32 -lopengl32 -lglew32s -Wl,--end-group
    Ответ написан
    Комментировать
  • Как получить результат функции в main при работе с матрицами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    sum_of = sum(matrix[][]);

    должно стать
    sum_of = sum(n, matrix);

    int sum (int n, int matrix[n][n]) {
        int sum = 0;
        for (int j = 0; j < n; ++j){
            for (int i = 0; i < n; ++i){
                if (j == i){
                    sum += matrix[j][i];
                }
            }
        }
        return sum;
    }

    Это, конечно, работает, но лучше написать так:
    int sum (int n, int matrix[n][n])
    {
        int sum = 0;
        for (int i = 0; i < n; ++i) {
            sum += matrix[i][i];
        }
        return sum;
    }
    Ответ написан
    Комментировать
  • Как в netbeans подключить динамическую библиотеку вместе со статическими ubuntu?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    пишу ключ -static

    из info gcc:
    '-static'
    On systems that support dynamic linking, this prevents linking with
    the shared libraries. On other systems, this option has no effect.


    линковать с ключем -dynamic.

    нет же такого ключа когда собираешь под linux

    Что делать? Убирать ключ -static -- всё равно статически слинкованного исполняемого файла не получится, раз нужна динамическая библиотека.
    Ответ написан
    1 комментарий
  • Как склеить изображение в ImageMagic?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если выполнить так, то работает, но вручную прописывать не подходит:

    А скрипт поправить?
    #!/bin/bash
    z1=({0..3}); z2=({4..7}) #...
    for((i = 1; i < 3; ++i)); do
    declare -n a=z$i
    FILES=()
    for n in ${a[@]}; do
    FILES[${#FILES[@]}]="/untitled/a/$i/$n.jpg"
    done
    montage -monitor "${FILES[@]}" -geometry +0+0 -tile 4x1 /untitled/b/$i.jpg
    done
    Ответ написан
    2 комментария
  • Как скопировать файл с заменой в нем некоторых участков?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    замена внутри файла

    Я использую для этого такую конструкцию:
    #! /bin/bash
    
    subst()
    {
    	eval "cat <<EOF
    `cat \"$1\"`
    EOF"
    }
    
    . ./config
    subst ./dhcpd.conf.in > ./dhcpd.conf


    При этом dhcpd.conf.in выглядит так:
    ddns-update-style interim;
    ignore client-updates;
    
    subnet ${NET}.0 netmask 255.255.255.0 {
            option routers                  ${NET}.1;
            option subnet-mask              255.255.255.0;
    
            option domain-name-servers      192.168.248.21;
    
            option root-path                "${NET}.1:/tftpboot/tensilica/rootfs/${ROOTFS}${NFS_MOUNT_OPTIONS}";
    
            range dynamic-bootp ${NET}.128 ${NET}.128;
            default-lease-time 21600;
            max-lease-time 43200;
    }

    а config -- так:
    NET=192.168.135
    ROOTFS=cp0_latest
    NFS_MOUNT_OPTIONS=${NFS_MOUNT_OPTIONS},noac
    IF_CONFIG="$NET.1 up"
    CONFIG=debug-kc705-cp0_latest
    KERNEL_IMAGE=uImage


    Т.е. в функции subst внутренний cat подставляет тело файла-шиблона, а eval выполняет внешний cat с подстановкой shell-переменных, зачитанных из config. Нужно понимать, что и шаблон и конфиг в этом скрипте могут выполнять произвольные команды, т.е. нельзя их брать у недоверенного пользователя.
    Ответ написан
    Комментировать
  • Нужно ли сокращать код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Стоит ли сокращать код? И как?

    Можно сделать так:
    struct
    {	
      bool btn_state;
      bool btn_flag;
      bool hold_flag;
      bool counter_flag;
      bool isHolded_f;
      bool isRelease_f;
      bool isPress_f;
      bool step_flag;
      bool oneClick_f;
      bool isOne_f;
    
    } fl;
    fl flags;
    // ........ 
    
    boolean GButton::isFlag(bool& flag) {
      if (_tickMode) GButton::tick();
      if (flag) {
        flag = false;
        return true;
      } else return false;
    }
    
    boolean GButton::isPress() {
      return isFlag(flags.isPress_f);
    }
    boolean GButton::isRelease() {
      return isFlag(flags.isRelease_f);
    }
    boolean GButton::isClick() {	
      return isFlag(flags.isOne_f);
    }
    boolean GButton::isHolded() {
      return isFlag(flags.isHolded_f);
    }
    Ответ написан
    Комментировать
  • Как сделать так чтобы консольное приложение "вернуло" некий текст?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    приложение из командной строки с определенными аргументами, в ответ вернуло (другому приложению) данные, некий текст. Назовите пожалуйста технологию которая позволяет такое сделать.

    popen например.
    Ответ написан
    Комментировать
  • Почему нельзя инициализировать в case?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert

    switch(1){
    case 1:
        double d = 1; //ошибка
    }

    Почему нельзя инициализировать в case?

    С этим кодом всё в порядке с точки зрения стандарта. Проблемы начнутся, если добавить меток case в switch после определения переменной d. Переход на эти метки входит в область видимости переменной d, но минует её инициализацию. Это запрещено стандартом (с++98, 6.7:3):

    It is possible to transfer into a block, but not in a way that bypasses declarations
    with initialization. A program that jumps from a point where a local variable with
    automatic storage duration is not in scope to a point where it is in scope is ill-formed
    unless the variable has POD type (3.9) and is declared without an initializer.
    Ответ написан
    Комментировать
  • Как передать управление сопрограмме?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ну, с таким псевдокодом всё должно работать.

    Можете подсказать в чём проблема?

    В реализации, похоже на то.
    Ответ написан
    Комментировать
  • Как преобразовать char массив в int С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подскажите, а можно ли по такому же принципу преобразовать char массив в int?

    unsigned char a[4] = {...};
    int b = ...;
    memcpy(a, &b, sizeof(a)); // -- int в char
    memcpy(&b, a, sizeof(a)); // -- char в int
    Ответ написан
  • Как правильно объявить функцию, использующую переменную из класса, и класс включающий в себя использование этой функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как объявить их так, чтобы избежать подобных ошибок?

    Очень странная конструкция в коде:
    - если это такой уж univeralTool, то зачем он завязывается на поле какого-то конкретного объекта какого-то класса?
    - если уж надо завязаться на поле объекта, то почему эта функция -- не член этого класса?
    - если надо обработать какое-то значение, то почему не передать это значение как аргумент функции?

    Ну и если и ни то и ни сё, и действительно надо как написано в коде -- то раздели всё на части и используй объявления или упорядочи определения функций как следует, например так:
    class someClass {
    public:
      void someClassTool();
      int variableInClass = 5;
    };
    
    Someclass someclass;
    
    void someUniversalTool()
    {
      int variable1 = someClass.variableInClass ;
      //some additional code
    }
    
    void SomeClass::someClassTool()
    {
       someUniversalTool();
       //some additional code
    }
    Ответ написан
    Комментировать
  • Преобразование типов и арифметика указателей?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    double * func(double *p, int a, int b) {
        double **p1 = &p;
        *(int*)p = a;
        *(int*)p++ = b;
        return *p1;
    }

    Почти правильно, не считая странных игр с p1.
    По заданию наверно должно быть так:
    void func(double *p, int a, int b)
    {
        *(int*)p = a;
        *((int*)p + 1) = b;
    }


    Если быть совсем строгим и избегать языковых проблем (а в коде выше как минимум type-punning), то так:
    void func(double *p, int a, int b)
    {
        memcpy(p, &a, 4);
        memcpy((char *)p + 4, b, 4);
    }
    Ответ написан
    Комментировать