Пустая структура в C

Похоже ли это на ваш желаемый результат?

# A tibble: 30 x 4
   id1   id2       x       y
   <chr> <chr> <dbl>   <dbl>
 1 a     A     0.266 -0.820 
 2 a     A     0.482  0.919 
 3 a     A     0.913 -0.415 
 4 b     B     0.372  0.487 
 5 b     B     0.600  0.782 
 6 b     B     0.294 -0.394 
 7 c     C     0.573  0.738 
 8 c     C     0.494  0.0746
 9 c     C     0.459 -0.0593
10 d     D     0.908  0.576 
# … with 20 more rows

Если вы удерживаете дополнительную информацию об идентификаторе в k до тех пор, пока не выполните spread, вы можете избежать неоднозначной ошибки идентификатора. Здесь я назвал эту дополнительную информацию k2.

data %>%
  gather('k', 'v', -id1, -id2) %>%
  mutate(k2 = str_replace(k, "\\D", ""),
         k = str_replace(k, "\\d", "")) %>%
  spread('k', 'v') %>%
  select(-k2)

Тогда вы можете сбросить k2 в конце и не нужно split() %>% lapply()

12
задан Mike 4 April 2013 в 12:43
поделиться

4 ответа

This page says push is slower. http://dev.opera.com/articles/view/efficient-javascript/?page=2

--121 --- 4155927-- ​​

Re ваша головоломка; Я предполагаю stringifyList является универсальным методом? Вам нужно вызвать его с помощью отражения:

MethodInfo method = typeof(SomeType).GetMethod("stringifyList")
            .MakeGenericMethod(lt).Invoke({target}, new object[] {o});

, где {target} равно null для статического метода, или this для метода экземпляра на текущем экземпляр.

Далее - я бы не предполагал, что все коллекции являются: на основе List , b: универсальные типы. Важно то, что они реализуют IList для некоторого T ?

Вот полный пример: A class with an empty sequence of members and base class objects is an empty class. Complete objects and member subobjects of an empty class type shall have nonzero size.

in C it is rather more murky since the c99 standard has some language which implies that truly empty structures aren't allowed (see TrayMan's answer) but many compilers do allow it (e.g gcc).

Since this is compiler dependent it is unlikely that you will get truly portable code in this case. As such non portable ways to suppress the warning may be your best bet.

23
ответ дан 2 December 2019 в 02:54
поделиться

Стандарт C99 несколько двусмысленен в этом, но, кажется, говорит, что пустая структура должна иметь ненулевое значение размер.

6.2.6.1 За исключением битовых полей, объекты состоят из смежных последовательностей из одного или нескольких байтов, номер, порядок и кодировка которых либо указаны явно, либо определяется реализацией.

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

Если вам не требуется «слишком строгая» приверженность, вам может сойти с рук это:

struct empty {
  char nothing[0];
};

Это расширение GCC , однако.

Я надеялся, что смогу использовать функцию C99, называемую «гибкие массивы», объявленную так:

struct empty99
{
  char nothing[]; // This is a C99 "flexible array".
};

, но это не работает; они требуют, чтобы сначала был хотя бы один нормальный член структуры, они не могут быть единственным членом.

2
ответ дан 2 December 2019 в 02:54
поделиться

Is можно ли добавить член и сохранить нулевой размер структуры?

Нет. FWIW, C ++ допускает пустые структуры, но sizeof () всегда отличен от нуля для пустой структуры.

Любое другое решение?

Непростые. Стоит отметить, что пустые структуры лишь частично поддерживаются в C и запрещены в C99.

Пустые структуры поддерживаются в C ++, но разные компиляторы реализуют их с разными результатами (для смещений sizeof и struct), особенно когда вы начинаете бросать наследование в смесь.

3
ответ дан 2 December 2019 в 02:54
поделиться
Другие вопросы по тегам:

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