The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Код корректно ли C: 32<->64 ?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Код корректно ли C: 32<->64 ?"  +/
Сообщение от nikto on 06-Июн-12, 14:36 
Макрос разворачивает нек-рые ф-ции для типа 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;
}

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Код корректно ли C: 32<->64 ?"  +/
Сообщение от pavlinux (ok) on 06-Июн-12, 18:41 
Напурква столько скобок и преобразований типов?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Код корректно ли C: 32<->64 ?"  +/
Сообщение от nikto on 06-Июн-12, 20:30 
> Напурква столько скобок и преобразований типов?

1. Макросы раскрывают.
2. Был инцидент на одной платформе:
2.1. с (пере-) определением типов - замахался баг искать при передачу в функцию параметра: (off_t) 0
2.2. с тех пор при (пере-) определении и в макросах явное приведение типов,
2.3. а скобки ну есть не просят в макросах ну фиг с ними
2.4. если паямть не подводит темa в этом форуме(с/c++) назвыается: трабля

А по теме топика есть мнения - корректно ли  ?
:)

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Код корректно ли C: 32<->64 ?"  +/
Сообщение от pavlinux (ok) on 06-Июн-12, 23:46 
>> Напурква столько скобок и преобразований типов?
> А по теме топика есть мнения - корректно ли  ?

1. Ну для полного щастя я б ещё long в чё-нить типа s64/intmax_t превратил.

> (off_t) 0

2. Это уже из области былин, НОЛЬ он везде ноль.

3. В Си, все твои потуги с явными типами в присваивании не считаются и выкидываются.
char *A  = (float *)malloc(n); всё равно будет (char *);

Нафига преобразовывать тип указателя ваще не ясно.
На 32-битах они 4 байта, на 64-х - 8 байт.

(ptrdiff_t **)(char *)(size_t **)(int ***)N, одно и тоже, что и (void *)N;
только код засрёшь, и потеряешь адрес или значение. Не, конечно бывают случаи
когда ну очень надо, но это такая редкость.

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Код корректно ли C: 32<->64 ?"  +/
Сообщение от nikto on 07-Июн-12, 10:10 
>1. Ну для полного щастя я б ещё long в чё-нить типа s64/intmax_t превратил.

Думается, после будущего разговора с рук-вом,
все-таки отказаться от использования long`a - перехать на int,
тем более gui и локальные нсатройки.

>2. Это уже из области былин, НОЛЬ он везде ноль.

Ага, если бы по голове не зафигaчило - не поверил бы.

>3. В Си, все твои потуги с явными типами в присваивании не считаются и выкидываются.

Макросы разворачивают - работает, ну и ладно.

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

Согласен, также см. п.2.

Вообщем благодарствую, фронт работ прояснен.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Код корректно ли C: 32<->64 ?"  +/
Сообщение от pavlinux (ok) on 07-Июн-12, 15:30 
>>2. Это уже из области былин, НОЛЬ он везде ноль.
> Ага, если бы по голове не зафигaчило - не поверил бы.

  У конструкций типа (off_t)0, (char *)NULL, есть одни плюс - видно тип переменной.
Я вот хрен знает, остались ли ещё в природе компиляторы, для которых (char *)
и (void *) различны.
  Есть консольный торрент-клиент, его писал какой-то японец,
так там все переменные (char *) инициализируются как (char *)('\0'); :)

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру