Макрос разворачивает нек-рые ф-ции для типа arr,
предполагается хранить массив типа "long" (stl/boost/etc - не трогаем).Подскажите пожалуйста, есть ли недочеты/ошибки и т.д. ?
Kод:
#define SZ_CONST 16
typedef struct arr
{
size_t a; /* allocated len */
size_t len; /* current len */
ptrdiff_t *ptr; /* */
} arr;
int realloc_redef(
char **d,
size_t c,
size_t n)
{
char *t;if (!(t = (char *) malloc((size_t)(n)))) return 0;
memcpy((void *)(t),(const void *)(*d),(size_t)(c));
free((void *)(*d));
*d = t;return 1;
}
int arr_ready(
arr *x,
size_t n)
{
size_t i;if (x->ptr) {
i = x->a;
if (n > i) {x->a = SZ_CONST + n + 2;
if (realloc_redef((char **)&x->ptr,i * sizeof(long),x->a * sizeof(long)))
return 1;x->a = i;
return 0;
}
return 1;
}
x->a = n;
x->len = 0;
return !!(x->ptr = (ptrdiff_t *) malloc((size_t)((n * sizeof(long)))));
}int arr_copya(
arr *dst,
size_t cnt,
long *src)
{
if (!arr_ready(dst,cnt + 1))
return 0;
memcpy((void *)(dst->ptr),(const void *)(src),(size_t)(sizeof(long) * cnt));
dst->len = cnt;
dst->ptr[dst->len] = 0;return 1;
}
Напурква столько скобок и преобразований типов?
> Напурква столько скобок и преобразований типов?1. Макросы раскрывают.
2. Был инцидент на одной платформе:
2.1. с (пере-) определением типов - замахался баг искать при передачу в функцию параметра: (off_t) 0
2.2. с тех пор при (пере-) определении и в макросах явное приведение типов,
2.3. а скобки ну есть не просят в макросах ну фиг с ними
2.4. если паямть не подводит темa в этом форуме(с/c++) назвыается: трабляА по теме топика есть мнения - корректно ли ?
:)
>> Напурква столько скобок и преобразований типов?
> А по теме топика есть мнения - корректно ли ?1. Ну для полного щастя я б ещё long в чё-нить типа s64/intmax_t превратил.
> (off_t) 02. Это уже из области былин, НОЛЬ он везде ноль.
3. В Си, все твои потуги с явными типами в присваивании не считаются и выкидываются.
char *A = (float *)malloc(n); всё равно будет (char *);Нафига преобразовывать тип указателя ваще не ясно.
На 32-битах они 4 байта, на 64-х - 8 байт.(ptrdiff_t **)(char *)(size_t **)(int ***)N, одно и тоже, что и (void *)N;
только код засрёшь, и потеряешь адрес или значение. Не, конечно бывают случаи
когда ну очень надо, но это такая редкость.Для хорошей портабельности, используемые типы нужно подгонять
под типы аргументов у библиотечных функций.
>1. Ну для полного щастя я б ещё long в чё-нить типа s64/intmax_t превратил.Думается, после будущего разговора с рук-вом,
все-таки отказаться от использования long`a - перехать на int,
тем более gui и локальные нсатройки.>2. Это уже из области былин, НОЛЬ он везде ноль.
Ага, если бы по голове не зафигaчило - не поверил бы.
>3. В Си, все твои потуги с явными типами в присваивании не считаются и выкидываются.
Макросы разворачивают - работает, ну и ладно.
>Для хорошей портабельности, используемые типы нужно подгонять
>под типы аргументов у библиотечных функций.Согласен, также см. п.2.
Вообщем благодарствую, фронт работ прояснен.
>>2. Это уже из области былин, НОЛЬ он везде ноль.
> Ага, если бы по голове не зафигaчило - не поверил бы.У конструкций типа (off_t)0, (char *)NULL, есть одни плюс - видно тип переменной.
Я вот хрен знает, остались ли ещё в природе компиляторы, для которых (char *)
и (void *) различны.
Есть консольный торрент-клиент, его писал какой-то японец,
так там все переменные (char *) инициализируются как (char *)('\0'); :)