From: Larry B. <LBe...@in...> - 2004-12-22 19:53:38
|
I have a problem compiling a rather simple program that I hope someone = can help me with. Here's the source (part of the test suite for ffmpeg ... ) [snip source] /* * Copyright (c) 2003 Michael Niedermayer <mic...@gm...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 = USA * */ #include <stdio.h> #include <inttypes.h> #define F 100 #define SIZE 2048 static uint64_t int_sqrt(uint64_t a) { uint64_t ret=3D0; int s; uint64_t ret_sq=3D0; for(s=3D31; s>=3D0; s--){ uint64_t b=3D ret_sq + (1ULL<<(s*2)) + (ret<<s)*2; if(b<=3Da){ ret_sq=3Db; ret+=3D 1ULL<<s; } } return ret; } int main(int argc,char* argv[]){ int i, j; uint64_t sse=3D0; uint64_t dev; FILE *f[2]; uint8_t buf[2][SIZE]; if(argc!=3D3){ printf("tiny_psnr <file1> <file2>\n"); return -1; } f[0]=3D fopen(argv[1], "r"); f[1]=3D fopen(argv[2], "r"); for(i=3D0;;){ if( fread(buf[0], SIZE, 1, f[0]) !=3D 1) break; if( fread(buf[1], SIZE, 1, f[1]) !=3D 1) break; for(j=3D0; j<SIZE; i++,j++){ const int a=3D buf[0][j]; const int b=3D buf[1][j]; sse +=3D (a-b) * (a-b); } } dev=3D int_sqrt((sse*F*F)/i); //FIXME someone should write a integer fixpoint log() function for = bitexact PSNR scores ... printf("stddev:%3d.%02d bytes:%d\n", (int)(dev/F), (int)(dev%F), i); return 0; } [/snip source] Any input files will do ... Here's the description of the problem: --- If I compile the program under msys, the returned value from the = first of the two fread statements always return 0 (I assume I'll get = zero from the second fread too), breaking out of the for-loop, and = resulting in a zero divide error calculating dev later on. --- If I compile it under cygwin ... no error ... and the program = processes and returns the expected results. --- If I compile it under cygwin with the -mno-cygwin option, the zero = divide error as compiling under msys occurs. No errors or warnings are generated from any of the compiles. I'm sure it's a configuration issue with my msys/mingw32. Anybody have = any ideas? Live Long and Prosper Larry=20 |
From: Andres R. <lo...@ho...> - 2004-12-22 22:52:46
|
Hello! Larry Berlinski wrote: [snip] > f[0]= fopen(argv[1], "r"); > f[1]= fopen(argv[2], "r"); > > It seems it boils down to how flags are used in opening a file. If you change "r" to "rb", the code works. It seems to be a probelm in ms runtime or I might be wrong here. Someone with better knowledge at internals could explain it further. Andres. |
From: Luke D. <cod...@ho...> - 2004-12-23 05:37:06
|
It's not exactly a "problem". http://www.mingw.org/MinGWiki/index.php/binary Luke ----- Original Message ----- From: "Andres Rand" <lo...@ho...> To: <min...@li...> Sent: Thursday, December 23, 2004 6:53 AM Subject: Re: [Mingw-msys] MSYS Compiling using MINGW32 > Hello! > > Larry Berlinski wrote: > [snip] > > > f[0]= fopen(argv[1], "r"); > > f[1]= fopen(argv[2], "r"); > > > > > It seems it boils down to how flags are used in opening a file. > If you change "r" to "rb", the code works. It seems to be a probelm > in ms runtime or I might be wrong here. Someone with better knowledge > at internals could explain it further. > > Andres. |
From: Andres R. <lo...@ho...> - 2004-12-23 06:25:39
|
Hi! Luke Dunstan wrote: >It's not exactly a "problem". > >http://www.mingw.org/MinGWiki/index.php/binary > >Luke > > After Dave's post I remembered it, and shame on me, I have not looked at wiki at all. Andres. |