0

これは私のプログラムの一部です:

  while((total_bytes_read != fsize) && ((nread = read(f_sockd, filebuffer, fsize_tmp)) > 0)){
    if(write(fd, filebuffer, nread) != nread){
      perror("write RETR");
      onexit(f_sockd, 0, 0, 1);
    }
    total_bytes_read += nread;
    fsize_tmp -= nread;
  }

ここでtotal_bytes_read, fsize, nread、はとして宣言されuint32_tます。
64ビットマシンでは問題はありません。コンパイルと実行は非常にうまくいきます(コードのこの部分はファイルを受け取る必要があります)。
問題は、このエラーが発生したために32ビットマシンでコンパイルする場合です。プログラムに変更するとファイルを受信しなくなりますが、ファイルの内容(の一部)
warning: comparison of integers of different signs: 'ssize_t' (aka 'int') and 'uint32_t' (aka 'unsigned int') [-Wsign-compare] if(write(fd, filebuffer, nread) != nread){
が出力されるため、この問題を解決する方法がわかりません。 stdoutに。 なぜ私はこの奇妙な振る舞いをしたのですか、そしてどうすればこれを解決できますか?if(write(fd, filebuffer, nread) != nread){ if(nread != (uint32_t)write(fd, filebuffer, nread)){

4

1 に答える 1

3

適切なタイプを使用してください。標準は言う:

ssize_t read(int fildes, void *buf, size_t nbyte);
^^^^^^^                             ^^^^^^

だからそれはあなたが使うべきものです。ないint、ないuint64_t、ないunsigned long longなど。

于 2012-08-28T17:18:10.463 に答える