2013-09-05 80 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参考只是垃圾

相关问题