2013-11-14 10 views
1

Я пишу код для чтения PPM-файла в массив struct pixel_type, содержащий 3 символа unsigned . г, г, и б код, который вызывает проблемы выглядит следующим образом:C - "warning: format"% c "ожидает аргумент типа" char * ", но аргумент 3 имеет тип" int ":?

struct pixel_type pArray[width][height], *pPtr[width][height]; 
pPtr[width][height] = &pArray[width][height]; 

for(h = 0; h < height; h++) 
{ 
    for(w = 0; w < width; w++) 
    { 
     fscanf(in, "%c%c%c", pPtr[w][h]->r, pPtr[w][h]->g, pPtr[w][h]->b); 
    } 
} 

При компиляции, я получаю это сообщение для всех 3-х "% с" с:

предупреждение:

format â%câ expects argument of type âchar *â, but argument (3,4, or 5) has type âintâ [-Wformat] 

Что было бы лучшим способом для чтения значений пикселей int o массив struct pixel_type?

struct pixel_type 
{ 
    unsigned char r; 
    unsigned char g; 
    unsigned char b; 
}; 
+0

@Kaz Я могу добавить больше своего кода, если вы хотите. Я не прошу кого-либо кодировать для меня, мне просто нужно знать, как наилучшим образом взять значение каждого пикселя (я считаю, что значения пикселей P6 PPM хранятся в двоичном виде) и преобразовать их в три символа (r, g, b) , Затем я могу использовать эту информацию для написания другого файла PPM. – user2993631

+0

@HighCore Вы правы, извините. Сейчас я хочу изменить его. В следующий раз. – user2993631

+0

@ user2993631 ???? Этот комментарий должен был быть для другого вопроса другим человеком и не применяется здесь. Как это произошло ... Я почти уверен, что был на правильном вопросе, когда я набрал его. Извини за это! – Kaz

ответ

1

Вам нужен только один временный указатель, а не целый массив из них.

struct pixel_type { 
    unsigned char r; 
    unsigned char g; 
    unsigned char b; 
    }; 

main() 
{ 
    struct pixel_type pArray[10][10], *pPtr; 
    int height = 10, width = 10, h, w; 
    char buf[32]; 

    /* testing */ 

    strcpy(buf, "abc"); 

    for(h = 0; h < height; h++) { 
     for (w = 0; w < width; w++) { 
      pPtr = &pArray[width][height]; 
      /* testing */ 
      sscanf(buf, "%c%c%c", &pPtr->r, &pPtr->g, &pPtr->b); 
      /* fscanf(in, "%c%c%c", &pPtr->r, &pPtr->g, &pPtr->b); */ 
     } 
    } 
} 
+0

Спасибо, я думаю, что это исправляет. Мой представитель слишком низок, чтобы «проголосовать», но я это ценю. – user2993631

+0

Вам не нужен какой-либо временный указатель. Просто используйте '& pArray [width] [height] .r' и т. Д. –

0

Вам не нужно объявить указатель на массив *pPtr[width][height], поскольку pArray[width][height] уже массив, а это:

pArray[0][0]; 

эквивалентно следующему:

*pArray; 

В так же, как это:

&pArray[0][0]; 

равносильна этому:

pArray; 

Так что вам просто нужно указать адрес, где ваши данные (внутри структуры), после того, как указатель или массив уже deferenced.

struct pixel_type pArray[width][height]; 

for(h = 0; h < height; h++) 
{ 
    for(w = 0; w < width; w++) 
    { 
     fscanf(in, "%c%c%c", &(pArray[w][h].r), &(pArray[w][h].g), &(pArray[w][h].b)); 
    } 
} 
0

Изменение 2D массив указателей pPtr[width][height] указателю pPtr решит вашу проблему.