2017-02-14 23 views
-1

Я пытаюсь вырастить следующий массив символьных массивов:Как вырастить массив символьных массивов в C

char input_channel_name[ 20 ][ 36 ]; 

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

Я попытался преобразовать его в код последующего (с помощью Resizing 2D Arrays in C) без везения:

#define ROWS 20 
#define COLS 36 

main(argc, argv) 
    char **input_channel_name; 

    input_channel_name = malloc(sizeof *input_channel_name * ROWS); 
     if (input_channel_name) 
     { 
      for (size_t i = 0; i < ROWS; i++) 
       input_channel_name[i] = malloc(sizeof *input_channel_name[i] * COLS); 
     } 

get_input_channels: 
    input_file = fopen(input_name, "rb") 
    fread(plotFileHeader.headerFloats, sizeof(float), 2, input_file); 
    number_of_channels_in = plotFileHeader.headerFloats[ N_CHAN_SUB ]; 
    add_rows = number_of_channels_in - ROWS; 

    char **tmp = realloc(input_channel_name, sizeof *input_channel_name * ROWS + add_rows); 
    if (tmp) 
    { 
     input_channel_name = tmp; 
     for (size_t i = 0; i < add_rows; i++) 
     { 
      input_channel_name[ROWS + i] = malloc(sizeof *input_channel_name[ROWS + i] * COLS); 
     } 
    } 

я держу получение

ошибка C2143: синтаксическая ошибка: отсутствует ';' до того 'типа'

, когда я пытаюсь установить input_channel_name = malloc

Есть идеи?

+2

Пожалуйста, найдите время, чтобы сделать вашу программу надлежащего [mcve] , Prototype main по необходимости, добавить отсутствующие директивы и т. Д. – StoryTeller

+1

'main (argc, argv)' -> 'int main (int argc, char ** argv) {...}' – BLUEPIXY

+0

Это не «массив' char' arrays ", но указатель на указатель. Полностью разные типы данных. – Olaf

ответ

0

Ваши недостатки программ в том, что он обрабатывает массивы как указатели. Они на самом деле не одно и то же, и вы не можете нам char** получить доступ к истинному многомерному массиву напрямую.

Путь объявить указатель на массив из 36 символов выглядит следующим образом:

char (*p_arr)[36] = NULL; 

Чтобы это указывает на первый такой массив в malloc -ED блок вы бы продолжить нормально:

char (*p_arr)[36] = malloc(row_count * sizeof *p_arr); 

Или, если ты typedefing сортировать:

typedef char c_arr_36[36]; 
c_arr_36 *p_arr = malloc(row_count * sizeof(c_arr_36)); 
+0

Я постараюсь переварить это и понять его. Из любопытства ответ на http://stackoverflow.com/questions/39208929/resizing-2d-arrays-in-c неверен? Это был самый простой ответ, который я мог найти, и в значительной степени использовал его для линии. Также, в вашем примере, что такое переменная для массива? Это не * p_arr указатель? Разве это не то, чего я пытался избежать? –

+0

@ Das.Rot - Ответ неверен, но он не имеет дело с истинными многомерными массивами, которые вы пытались сделать. 'p_arr' действительно является указателем, но это * указатель на массив *. Это то, что, по-видимому, неохотно охватывает основные учебные пособия. Если вы хотите узнать больше, см. Этот пост http://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays – StoryTeller