2013-09-05 152 views
-5
typedef struct pixel_type 
    { 
     unsigned char r; 
     unsigned char g; 
     unsigned char b; 
    } pixel;  



buffer = (int *) malloc (sizeof(pixel) * stdin); 

我不斷收到一個錯誤,說「無效操作數爲二進制*(有無符號整型」和「結構_IO_FILE *)」。該結構在函數之外定義,因此它是通用的。緩衝區是在主內部定義的。如果需要,我可以提供更多的代碼。我的問題是什麼?無效操作數爲二進制*

編輯:好吧,顯然我有點困惑。我想要做的是傳入一個文件,然後給該文件malloc足夠的空間。我正在考慮使用FILE函數來傳遞文件,然後使用它,但希望只是使用「stdin」。這是不允許的?這是C語言。只是標籤C++希望別人可能會看到類似的問題。

對不起,這個愚蠢的問題。作爲一個整體來說並不陌生,但是對malloc來說是新的。二年級的學生:P

+2

這根本沒有任何意義。或者你想從'stdin'獲得一些輸入嗎?然後你必須用例如'scanf'。並且轉換爲'int *',爲什麼要這樣做?你不想要一個像素結構的「數組」嗎? –

+0

你爲什麼通過'stdin'?而且,編譯器正在做你告訴它做的事情,而不是你期望它做的事情。 –

+3

你預計在這種情況下'stdin'會給你什麼?它是一個'FILE',代表鍵盤(或終端,控制檯或任何你稱之爲的)。我猜你想知道「輸入」有多大,但是如果是這種情況,你實際上必須先閱讀它...... –

回答

1

我想你想像素數從stdin

int n; 
scanf("%d", &n); 

,然後爲許多像素分配內存:

unsigned char * buffer = (unsigned char *) malloc (sizeof(pixel) * n); 
+0

'stdin >> n'?和C++中的'malloc'?而'buffer'不是一個指針。 –

+0

@JoachimPileborg對不起,被卡在C++模式下,改爲答案C. –

+0

照顧了很多錯誤。儘管如此,仍然無法掃描stdin。我如何將stdin掃描到%d中,因爲我沒有將n =聲明爲%d。 – user2751556

0

分配內存的方式可能類似於

size_t elements = 0; 

... // get the number of elements as a separate operation 

pixel *buffer = malloc(sizeof *buffer * elements); // note no cast, 
                // operand of sizeof 
if (buffer) 
{ 
    // load your buffer here 
} 

在C中,施放malloc的結果被認爲是不好的做法。這是不必要的,因爲void *的值可以分配給任何指針類型,並且在C89編譯器下,如果您忘記包含stdlib.h或者沒有malloc範圍的聲明,它可以抑制診斷。

此外,由於表達式*buffer具有類型pixel,因此表達式sizeof *buffer相當於sizeof (pixel)。如果buffer的類型有變化,這可以爲您節省一些維護時間。

如何獲取數組的元素數量取決於您的應用程序。最簡單的方法是在你的數據文件的頭部,堅持該值:

size_t elements = 0; 
FILE *data = fopen("pixels.dat", "r"); 
if (!data) 
{ 
    // You will want to add real error handling here. 
    exit(0); 
} 

if (fscanf(data, "%zu", &elements) != 1) 
{ 
    // You will want to add real error handling here 
    exit(0); 
} 

pixel *buffer = malloc(sizeof *buffer * elements); 
if (buffer) 
{ 
    for (size_t i = 0; i < elements; i++) 
    { 
    if (fscanf(data, "%hhu %hhu %hhu", // %hhu for unsigned char 
        &buffer[i].r, &buffer[i].g, &buffer[i].b) != 3) 
    { 
     // more real error handling here 
     exit(0); 
    } 
    } 
} 

當然,這是假設你的數據文件的結構爲3的整數值行,像

10 20 30 
40 50 60 



1.與C++相反,如果需要,但如果您要編寫C++,則無論如何您都應該使用new運算符。是的,你會看到成千上萬個包含演員的例子。您還將看到數千個使用void main()的示例。大多數C參考只是垃圾

相關問題