2014-02-15 102 views
0

我正在实施此代码,但我收到一个错误。C2664无法转换参数

http://curl.haxx.se/libcurl/c/ftpupload.html

该错误是在该位的代码。

static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    curl_off_t nread; 
    /* in real-world cases, this would probably get this data differently 
    as this fread() stuff is exactly what the library already would do 
    by default internally */ 
    size_t retcode = fread(ptr, size, nmemb, stream); 

    nread = (curl_off_t)retcode; 

    fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T 
      " bytes from file\n", nread); 
    return retcode; 
} 

错误是...

IntelliSense: argument of type "void *" is incompatible with parameter of type "FILE *" 

Error C2664: 'fread' : cannot convert parameter 4 from 'void *' to 'FILE *' 

任何提示将是有益的。我不明白为什么我们要传递一个void *流到函数。那有什么意思?一个指向void的指针?

它在这里被调用。

/* we want to use our own read function */ 
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); 

CURL API

CURLOPT_READFUNCTION

将指针传递给匹配的原型如下的函数: 为size_t函数(无效* PTR,为size_t大小,为size_t nmemb个,空隙 *用户数据);只要需要读取数据以将其发送给对等方,该函数就会被libcurl调用。指针ptr指向 的数据区域可以填充最多大小乘以nmemb字节数的大小。您的函数必须返回您存储在该内存区域中的实际字节数 。返回0会将 文件结束信号发送到库并导致其停止当前传输。

如果停止通过返回0“过早地”当前的数据传输(即 之前的服务器预计它,当你说你会上传ñ 字节,并上传了N个字节不太像),你可能经验, 服务器“挂起”等待其他数据不会来。

读回调可以返回CURL_READFUNC_ABORT立即停止当前 操作,导致从转移(由在7.12.1)

从7.18.0一个CURLE_ABORTED_BY_CALLBACK错误 代码,该函数可以返回CURL_READFUNC_PAUSE其那么 将导致从此连接读取变为暂停。详情请参阅 curl_easy_pause(3)。

错误:做TFTP上传时,你必须返回回调想要 数据的确切数额,否则将被视为最终 包由服务器端和传输将结束。

如果将此回调指针设置为NULL,或根本不设置,则将使用 默认的内部读取函数。它使用CURLOPT_READDATA设置的FILE * userdata在 上执行fread()。

我有点超出我的深度。

+0

'fread'需要'FILE *'作为其** **第四参数,一个'空隙*'不匹配。它传递给参数之前假设参数'stream'是'FILE *',你需要将其强制转换:'FREAD(...,(FILE *)流)' – 0x499602D2

+0

@ 0x499602D2实际上,['FREAD() '](http://en.cppreference.com/w/c/io/fread)开出文件作为最后* *参数;不是第一个。演员决议显然仍然是正确的;把它移动= P。 – WhozCraig

+0

@WhozCraig糟糕!感谢您指出了这一点。让我解决这个问题。 :) – 0x499602D2

回答

0

freadFILE*作为第四个参数,void*不匹配。假设参数流是将它传递给参数之前FILE*,你需要将其强制转换:

fread(..., (FILE*)stream); 

BTW一个reinterpret_cast是语义上更适合这个任务:

fread(..., reinterpret_cast<FILE*>(stream)); 

一个void*是通用指针类型可转换为任何其它指针类型。

0

如果你的程序是用C语言编写,则代码将是有效的,因为在C类void *可以隐式转换为任何类型的指针。然而C++不允许隐含void *转换为其他任何类型的指针。因此,您需要明确指定要转换类型的对象的类型。void *

您可以使用C风格转型或C++风格转型。例如

size_t retcode = fread(ptr, size, nmemb, (FILE *)stream); 

size_t retcode = fread(ptr, size, nmemb, reinterpret_cast< FILE *>(stream)); 
相关问题