Ответы пользователя по тегу C
  • Как "добавить/удалить" элемент массива?

    arusef
    @arusef
    Novice .NET dev
    Осторожно, псевдокод.
    Не проверял, но логика должна работать с любым входным массивом.

    let input = [ a1, a2, ... , aN ] // ordered ascending, N > 1
    let k, P // assume k > 0, 1-based indexing
    // remove at k, 0-based indexing
    for (let i = k; i < N; ++i)
       input[i - 1] = input[i]
    // insert P preserving order
    for (let i = N - 1; i >= 0; --i) {
       if (i == 0 || P >= input[i - 1]) {
          for (let j = N - 1; j > i; --j)
             input[j] = input[j-1]
          input[i] = P
          break
       } else continue
    }
    // finish
    print(input)
    Ответ написан
    Комментировать
  • Как реализовать сумму дробей?

    arusef
    @arusef
    Novice .NET dev
    Общая схема примерно такая:
    (I)nput := [x0, y0, x1, y1, x2, y2 ... xn, yn]
    
    (R)ational := (a, b)
    Trunc(R) := R(a / НОД(a,b), b / НОД(a,b))
    R1 + R2 := Trunc(a1*b2 + a2*b1, b1*b2)
    R1 + R2 + R3 := (R1 + R2) + R3
    
    Output := R(I[0],I[1]) + R(I[2],I[3]) + ... + R(I[2n-1],I[2n])
    Ответ написан
  • Можно ли сэкономить память при копипасте?

    arusef
    @arusef
    Novice .NET dev
    В общем случае эта задача не решаема из-за различия контекстов исполнения.
    Чтобы добиться схожего эффекта, люди и придумали функции ведь. Думаю, что вы знаете, что функция - в сущности, инструкция call, которая обвешена дополнительным кодом для организации изолированного контекста. Если вам это поведение не нужно, то почему бы не использовать обычные инструкции jmp/call и писать в goto-стиле? Тогда отдельные участки кода будут полагаться на определённые предположения о контексте и переиспользоваться, в зависимости от оного. Но учтите, что такой подход крайне сложен и является источником большого числа ошибок.
    Ответ написан
  • Как прочитать данные из файла?

    arusef
    @arusef
    Novice .NET dev
    n_obj = fread(&data, size, n, out);
    Замените на
    n_obj = fread(data, size, n, out);
    Ответ написан
    5 комментариев
  • MPI: Как оповестить процесс о новых сообщениях?

    arusef
    @arusef
    Novice .NET dev
    Можно просто захватывать мьютекс на время выполнения приёма данных. Однако, исходя из здравого смысла, ваша "многопоточность" будет сводиться к тому, что потоки станут работать поочерёдно. Можно использовать только один поток, т.к. MPI в принципе подразумевает выделение процессов под количество вычисляющих ядер в системе и наличие второго потока будет лишь притормаживать работу. В таком случае, ваш процесс может принимать данные о задаче в неблокирующей манере в какой-нибудь буфер, где после выполнения задачи будет проводиться проверка на наличие новых задач.
    Ответ написан
    Комментировать