2013-11-02 3 views
0

У нас есть заголовочный файл с этими структурами заявил:C Язык: Путь доступа к полю в структуре, в структуре (немного сложнее этот)

typedef struct{ 
    unsigned short rgb[3]; 

}PIXEL_T; 

typedef struct{ 
    int format; 
    int nrows; 
    int ncolumns; 
    int max_color; 
    PIXEL_T **pixels; 

}PBM_T; 

И мы пытаемся получить доступ к РГБУ [0], чтобы написать номер. Но поскольку мы новички, работа с массивом «указатель указателей» оказывается сложной. Вот наша лучшая, неправильная попытка:

/*pbm was previously declared as a PBM_T structure. rows and columns are auxiliary  variables to send to the nrows and ncolumns field. we're suppose to create a bitmap matrix*/ 

pbm->(**pixels) = malloc(sizeof(int *)*rows); 
if (pbm->(**pixels) == NULL) 
ERROR(ERR_ALLOC,"Error allocating memory for the bitmap matrix"); 

int i; 

for(i = 0; i < columns; i++) { 
    pbm->pixels[i] = malloc(sizeof(int)*columns); 
    } 

    pbm->&nrows = rows; 
    pbm->&ncolumns = columns; 

    while((getline(&line, &len, file_stream)) != 1) { 
    getline(&line, &len, file_stream); 
    sscanf(line,"%d",&pbm->pixels[i][j]->rgb[0]); /* i and j are for two for cycles we're going to implement */ 
    } 

В основном наша самая большая проблема - это правильный способ доступа к этому полю. Все * и & нас путают. Если кто-то может также дать краткое объяснение того, как это работает, мы будем очень благодарны. Заранее спасибо. не

+0

@ Относитесь к тому, как они работают, прочитайте мой ответ здесь http://stackoverflow.com/questions/19602300/c-pointers-when-new-functions-are-called/19602433#19602433 может помочь полностью – Jageen

+0

благодарим за отзыв , мы получаем смысл операторов & и *, он просто запутывается, когда мы предполагаем использовать их для доступа к полям структуры, особенно к этим «**». – Deegriz

+1

Ваше величество, операторы '*' и '&', а также круглые скобки, не могут применяться к именам полей, как, например, 'pbm -> & nrows' или' pbm -> (** pixels) '. Пожалуйста, оставьте их, ваши испытуемые будут вам благодарны. –

ответ

1

Нет разыменования, просто и просто

pbm->pixels = malloc(sizeof(PIXEL_T *)*rows); 

и

if (pbm->pixels == NULL) ... 

и

pbm->pixels[i] = malloc(sizeof(PIXEL_T)*columns); 

Обратите внимание, что изменить тип, используемый для распределения. Вы выделяете для int* и int соответственно. Это не работает, особенно для последних, поскольку три short, скорее всего, больше, чем один int.

+0

Я вижу. Как насчет sscanf? правильно ли я получаю доступ к полям? sscanf (строка, "% d", & pbm-> pixels [i] [j] -> rgb [0]) – Deegriz

+0

@Digriz Если вы проверите [таблицу приоритетов оператора] (http://en.cppreference.com/) w/c/language/operator_precedence) вы увидите, что различие между указателями struct-pointer ('->') и подтипированием массива ('[]') имеет более высокий приоритет, чем адрес-оператор ('&'), так что будь умницей. И индексация элемента 'pixel' тоже прекрасна, поскольку указатель может быть проиндексирован как массив. –

+1

Три 'коротких' * возможно * больше, чем один' int'. (Я никогда не видел систему, где это не так, но вы должны использовать правильный тип независимо.) –

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