|
|
  |
Правильно ли так использовать функцию calloc? |
|
|
|
Oct 5 2011, 03:47
|

Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544

|
Работаю в Keil ARM. Проект под STM32. Пытаюсь разобраться с файлом gif. Использую библиотеку libungif-4.1.4. Приведу только часть кода в которой возникла проблема: Код typedef unsigned char GifByteType;
typedef struct GifColorType { GifByteType Red, Green, Blue; } GifColorType;
typedef struct ColorMapObject { int ColorCount; int BitsPerPixel; GifColorType *Colors; } ColorMapObject;
...............
BitsPerPixel = 8;
ColorMap = (ColorMapObject *)malloc(sizeof(ColorMapObject));
if(ColorMap == (ColorMapObject *) NULL) { FATFileClose(fd);
return 0; }
ColorMap->Colors = (GifColorType *)calloc(1 << BitsPerPixel, sizeof(GifColorType));
if(ColorMap->Colors == (GifColorType *) NULL) { free((ColorMapObject *)ColorMap); FATFileClose(fd);
return 0; }
.......... В данном куске кода выделяется память под глобальную палитру. Выделить то надо всего 768 байт. Память по функции malloc выделяется. А вот по calloc нет. Первая мысль, которая возникла, это не хватает памяти. Но такое не может быть, так как на борту 96 кило памяти и ей просто некуда деться. И вторая мысль - неправильное использование функции calloc. Есть у кого какие соображения?
Сообщение отредактировал 011119xx - Oct 5 2011, 03:48
|
|
|
|
|
Oct 5 2011, 05:17
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
использование функции calloc - правильное CODE $ cat el.c #include <stdlib.h> #include <stdio.h>
typedef unsigned char GifByteType;
typedef struct GifColorType { GifByteType Red, Green, Blue; } GifColorType;
typedef struct ColorMapObject { int ColorCount; int BitsPerPixel; GifColorType *Colors; } ColorMapObject;
static const int BitsPerPixel = 8;
int main() { ColorMapObject *ColorMap = malloc(sizeof(ColorMapObject)); if(!ColorMap) abort();
ColorMap->Colors = calloc(1 << BitsPerPixel, sizeof(GifColorType)); if(!ColorMap->Colors) abort();
exit(EXIT_SUCCESS); } $ gcc el.c -std=gnu99 -Wall -o el $ ./el $
Сообщение отредактировал Idle - Oct 5 2011, 05:21
|
|
|
|
|
Oct 5 2011, 06:21
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(011119xx @ Oct 5 2011, 09:39)  Не вижу принципиальных отличий вашего и "моего" варианта. их нет
|
|
|
|
|
Oct 6 2011, 03:00
|

Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544

|
Увеличил размер кучи, теперь с выделением памяти проблем нет. Есть еще одна не понятная проблема. Для проверки расширения файла использую процедуру: Код int extcheck(char *s, char *match) { char tmp[5]; uint8_t i;
if(strlen(s) > 3) { strncpy(tmp, s + strlen(s) - 4, 4); tmp[4] = 0;
tolower(*tmp); if(strcmp(tmp, match) == 0) return 1; } return 0; } Проблема в функции tolower. Не хочет она переводить символы из верхнего регистра в нижний. Пробовал вместо Код tolower(*tmp); и так: Код for(i = 0; i < 4; i++) tolower(tmp[i]); тоже не работает. В чем может быть проблема?
|
|
|
|
|
Oct 6 2011, 03:54
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
А так? Код for(i = 0; i < 4; i++)
tmp[i]=tolower(tmp[i]);
|
|
|
|
|
Oct 6 2011, 05:15
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(011119xx @ Oct 6 2011, 07:00)  В чем может быть проблема? В Вашем подходе к делу. Вы бы хоть краем глаза на описание применяемой функции смотрели, всё было бы хорошо... Ну и основы Си почитать нужно обязательно. Как по Вашему функция получающая аргументом значение а не указатель может его изменить? Ответ - никак. Дальше включаем голову и понимаем, что если функция не в состоянии "глобально" изменить аргумент, то она возвращает результат своей деятельности, который вы игнорировали. Ведь всё просто и логично.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|