2013-04-12 2 views
0

Я создаю движок raytracing в C, используя библиотеку minilibX. Я хочу, чтобы иметь возможность читать в .conf файл конфигурации для сцены для отображения:Инициализация бесконечного числа символов **

Например:

([email protected] 117)cat universe.conf 
#randomcomment 
obj:eye:x:y:z 
light:sun:100 
light:moon:test 

Количество объектов может изменяться в диапазоне от 1 до бесконечности. С этого момента, я чтение файла, копирование каждую строку 1 на 1 в гольца ** вкладку и mallocing по количеству найденных объектов, например:

void open_file(int fd, struct s_img *m) 
{ 
    int i; 
    char *s; 
    int curs_obj; 
    int curs_light; 

    i = 0; 
    curs_light = 0; 
    curs_obj = 0; 
    while (s = get_next_line(fd)) 
    { 
     i = i + 1; 
     if (s[0] == 'l') 
     { 
      m->lights[curs_light] = s; 
      curs_light = curs_light + 1; 
     } 
     else if (s[0] == 'o') 
     { 
      m->objs[curs_obj] = s; 
      curs_obj = curs_obj + 1; 
     } 
     else if (s[0] != '#') 
     { 
      show_error(i, s); 
      stop_parsing(m); 
     } 
    } 

Теперь, я хочу быть способный хранить каждую информацию каждого tab[i] в новом char **tab, 1 для каждого объекта, используя ':' в качестве разделителя. Поэтому мне нужно инициализировать и malloc неопределенное количество char **tab. Как я могу это сделать?

(Ps: Я надеюсь, что мой код и мой английский будут достаточно хороши для вас, и я использую только самую основную функцию, например, читать, писать, открывать, malloc ... и я переписываюсь, построение всего остального, например printf, get_line и т. д.)

+0

Что не так с распределением нового пространства по мере необходимости? – atk

+0

Мне нужно выделить новую вкладку char ** для каждого нового объекта. Итак, как мне это сделать? Есть ли способ объявить как можно больше вкладок char **, поскольку мне нужно? – Antoninarto

ответ

0

Я хотел бы использовать альтернативный подход (как это с, не C++) и выделять просто большие буферы, как мы идем :

char *my_malloc(size_t n) { 
     static size_t space_left = 0; 
     static char *base = NULL; 
     if (base==NULL || space_left < n) base=malloc(space_left=BIG_N); 
     base +=n; return base-n; 
} 

Отказ от ответственности: я пропустил вещи и возвращаемые значения тестирования для сбора мусора и все меры безопасности, чтобы рутина коротка.

Еще один способ подумать, что это прочитать файл в достаточно большой mallocated массив (вы можете проверить его с помощью ftell), сканировать буфер, заменять разделители, линейные каналы и т. Д. С помощью символов ascii zero и помнить начальные местоположения ключевых слов.

+0

Опция Ftell кажется хорошей, поэтому ... Я собираюсь перекодировать ftell, а затем попробовать с этим. Благодаря! – Antoninarto

+0

Вы, очевидно, поняли, что это 'fseek (fp, 0, SEEK_END); sz = ftell (fp); 'и что он не переносимый. –

2

Вы не можете выделить неопределенный объем памяти; malloc не поддерживает его. Что вы можете сделать, это выделить достаточно памяти на текущий и пересмотреть, что позже:

size_t buffer = 10; 
char **tab = malloc(buffer); 

//... 
if (indexOfObjectToCreate > buffer) { 
    buffer *= 2; 
    tab = realloc(tab, buffer); 
} 
+2

Для тех, кто этого не осознает: вам также придется следить за целым переполнением. буфер имеет максимальный размер, и если вы действительно читаете «бесконечный» объем данных, вы в конечном итоге закончите работу (подумайте, что это менее важно для 64-битной системы, чем для меньшего). – atk

Смежные вопросы