Сложные C бросают объяснение

Я просто сделал это на скорую руку быстрое в Ruby:

def perms(x, y, possible_characters)
  all = [""]
  current_array = all.clone
  1.upto(y) { |iteration|
    next_array = []
    current_array.each { |string|
      possible_characters.each { |c|
        value = string + c
        next_array.insert next_array.length, value
        all.insert all.length, value
      }
    }
    current_array = next_array
  }
  all.delete_if { |string| string.length < x }
end

Вы могли бы изучить API языка для созданного в функциях типа перестановки, и Вы могли бы быть в состоянии записать больше оптимизированного кода, но если числа - весь, что высоко, я не уверен, что существует большая часть пути вокруг наличия большого количества результатов.

Так или иначе, идея позади кода является запуском со строкой длины 0, затем отслеживайте все строки длины Z, где Z является текущим размером в повторении. Затем пройдите каждую строку и добавьте каждый символ на каждую строку. Наконец в конце, удалите любого, которые были ниже x порога и возвращают результат.

я не протестировал его с потенциально бессмысленным входом (список нулевого символа, странные значения X и Y, и т.д.).

8
задан Kelly S. French 11 November 2009 в 16:27
поделиться

10 ответов

Давайте рассмотрим шаг за шагом.

void(*)()

Это указатель на функцию, которая принимает неуказанные аргументы и не имеет возвращаемого значения.

(void(*)())buf

просто приводит buf к этому типу указателя функции. Наконец,

((void(*)())buf)();

вызывает эту функцию.

Таким образом, весь оператор «интерпретирует buf как указатель на функцию void без аргументов и вызывает эту функцию».

]
21
ответ дан 5 December 2019 в 04:38
поделиться

Он преобразует buf в указатель функции типа void (*) () (функция, не возвращающая ничего / void и принимающая неопределенные аргументы) и вызывает ее.

Стандарт ANSI на самом деле не позволяет преобразовывать обычные указатели данных в указатели на функции, но ваша платформа может это разрешить.

9
ответ дан 5 December 2019 в 04:38
поделиться

Приводит buf к типу void (*) () , указателю на функцию, которая принимает неуказанные параметры и ничего не возвращает. Затем он вызывает функцию по этому адресу (две крайние правые скобки).

4
ответ дан 5 December 2019 в 04:38
поделиться
((void(*)())buf)();
 \------------/         cast `buf` to
 \---------/            type: pointer to function accepting a fixed but
                              unspecified number of arguments and
                              returning void
\----------------/      and call that "function"
2
ответ дан 5 December 2019 в 04:38
поделиться

Я обычно использую команду "cdecl", когда сталкиваюсь с ошеломляющим заявлением. Пример:

[me@machine]$ cdecl
Type `help' or `?' for help
cdecl> explain (void(*)())buf
cast buf into pointer to function returning void

Хотя есть случаи, когда я действительно хочу, чтобы там был инструмент, объясняющий вывод "cdecl": /

5
ответ дан 5 December 2019 в 04:38
поделиться

Он преобразует buf в указатель функции, который принимает неуказанные аргументы и вызывает его.

2
ответ дан 5 December 2019 в 04:38
поделиться

Я предполагаю, что во многих случаях это приводит к сбою машины. В противном случае он рассматривает массив как указатель на функцию, которая возвращает void, и вызывает ее.

1
ответ дан 5 December 2019 в 04:38
поделиться

Вы можете найти "опытное программирование на c" хорошим чтением - распаковка такого рода вещей находится в одной из глав, если я правильно помню. Я давно его не читал, но помню, что в то время думал, что это того стоило. http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298

1
ответ дан 5 December 2019 в 04:38
поделиться

вызывает указатель функции. функция не имеет аргументов.

Указатель на функцию - Википедия

0
ответ дан 5 December 2019 в 04:38
поделиться

Существует онлайн-версия инструмента 'cdecl', которую lsc упомянула и которая может оказаться полезной: http://www.cdecl.org/

1
ответ дан 5 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: