В базе R,
D <- matrix(c(1, 0, 0,
1, 0, 1,
1, 0, 0,
2, 0, 3,
1, 1, 1),
ncol=3, byrow=TRUE, dimnames=list(1:5, c("v1", "v2", "v3")))
D <- data.frame(user=c("a", "a", "b", "b", "c"), D)
aggregate(. ~ user, D, sum)
Возвращает
> aggregate(. ~ user, D, sum)
user v1 v2 v3
1 a 2 0 1
2 b 3 0 3
3 c 1 1 1
Наличие достаточно большого статического предела, вероятно, достаточно хорошо для всех ситуаций. Если действительно необходимо получить все сообщение об ошибке, можно использовать версия GNU strerror_r, или можно использовать стандартную версию и опросить ее с последовательно более крупными буферами, пока Вы не получаете то, в чем Вы нуждаетесь. Например, можно использовать что-то как код ниже.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Call strerror_r and get the full error message. Allocate memory for the
* entire string with malloc. Return string. Caller must free string.
* If malloc fails, return NULL.
*/
char *all_strerror(int n)
{
char *s;
size_t size;
size = 1024;
s = malloc(size);
if (s == NULL)
return NULL;
while (strerror_r(n, s, size) == -1 && errno == ERANGE) {
size *= 2;
s = realloc(s, size);
if (s == NULL)
return NULL;
}
return s;
}
int main(int argc, char **argv)
{
for (int i = 1; i < argc; ++i) {
int n = atoi(argv[i]);
char *s = all_strerror(n);
printf("[%d]: %s\n", n, s);
free(s);
}
return 0;
}
Я не волновался бы об этом - размер буфера 256 намного больше, чем достаточный, и 1024 излишество. Вы могли использовать strerror()
вместо strerror_r()
, и затем дополнительно strdup()
результат, если необходимо сохранить строку ошибки. Это не ориентировано на многопотоковое исполнение, все же. Если действительно необходимо использовать strerror_r()
вместо strerror()
для потокобезопасности, просто используйте размер 256. В glibc-2.7
, самая длинная строка сообщения об ошибке является 50 символами ("Недопустимый или неполный многобайтовый или широкий символ"). Я не ожидал бы, что будущие сообщения об ошибках будут значительно более длинными (в худшем случае, несколько байтов дольше).