C++ 二进制操作数无效*
我一直收到一个错误,该错误表示二进制*的无效操作数具有无符号int'和'struct\u IO\u FILE*。结构是在函数外部定义的,因此它是通用的。缓冲区是在main中定义的。如果需要,我可以提供更多的代码。我有什么问题 编辑:好吧,显然我有点困惑。我要做的是传入一个文件,然后为该文件分配足够的空间。我曾考虑使用一个文件函数来传递文件,然后使用它,但希望只使用stdin。这是不允许的吗?这是在C.,只是贴上了C++的标签,希望其他人也能看到类似的问题。 对不起,这个愚蠢的问题。对C整体来说不是新的,但对malloc来说是新的。二年级学生:PC++ 二进制操作数无效*,c++,c,malloc,buffer,C++,C,Malloc,Buffer,我一直收到一个错误,该错误表示二进制*的无效操作数具有无符号int'和'struct\u IO\u FILE*。结构是在函数外部定义的,因此它是通用的。缓冲区是在main中定义的。如果需要,我可以提供更多的代码。我有什么问题 编辑:好吧,显然我有点困惑。我要做的是传入一个文件,然后为该文件分配足够的空间。我曾考虑使用一个文件函数来传递文件,然后使用它,但希望只使用stdin。这是不允许的吗?这是在C.,只是贴上了C++的标签,希望其他人也能看到类似的问题。 对不起,这个愚蠢的问题。对C整体来说不
我想你想从标准文本中读取像素数:
然后为这么多像素分配内存:int n;
scanf("%d", &n);
分配内存的正确方法如下
unsigned char * buffer = (unsigned char *) malloc (sizeof(pixel) * n );
在C中,铸造malloc的结果被认为是不好的做法1。这是不必要的,因为void*的值可以分配给任何指针类型,并且在C89编译器中,如果您忘记包含stdlib.h或在范围中没有malloc声明,它可以禁止诊断
此外,由于表达式*缓冲区具有类型pixel,因此表达式sizeof*缓冲区等效于sizeof pixel。如果缓冲区类型发生变化,这可以节省一些维护时间
如何获得数组的元素数实际上取决于应用程序。最简单的方法是将该值粘贴在数据文件的开头:
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
}
等等。
1.与C++相比,它是需要的,但是如果你正在编写C++,你应该使用新的操作符。是的,你会看到成千上万的例子,包括演员阵容。您还将看到数千个使用voidmain的示例。大多数C引用都是垃圾 那完全没有道理。或者你想从stdin那里得到一些信息?然后你必须用例如scanf来阅读它。至于int*的转换,你为什么这么做?你不想要一个像素结构的数组吗?为什么要通过stdin?而且,编译器正在做您告诉它做的事情,而不是您期望它做的事情。在本例中,您期望stdin给您什么?它是一个文件,代表键盘或终端、控制台或任何你称之为它的东西。我猜你想知道输入有多大,但如果是这样的话,你实际上必须先阅读它…你认为这意味着什么:buffer=int*malloc sizeofpixel*stdin;???为了得到文件的长度,有10亿篇关于这个的帖子。这里有一个:stdin>>n?C++中的MALOC?而缓冲区不是指针。@ JoachimPileborg抱歉,卡在C++模式下,更改答案为C.处理了很多错误。但仍然无法将stdin扫描到其中。我如何在stdin中扫描到%d,因为我没有声明n=to%d。声明int n;如上所述。
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
}
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 );
}
}
}
10 20 30
40 50 60