2011-02-18 57 views
1

我有一些C代码,我一直在我的Mac上的Xcode工作。然后我想在Windows机器上使用它并用TinyC进行编译。当我运行它时,输出是不同的。不同的编译器,不同的输出?

这可能是由于使用不同的编译器?

谢谢!


EDIT 1

的代码是打开了一个wav文件到所有的样品投入到阵列的简单的脚本。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 



void read_wav_header(unsigned int *samp_rate, unsigned int *bits_per_samp, 
       unsigned int *num_samp); 
void read_wav_data(int *data, unsigned int samp_rate, 
       unsigned int bits_per_samp, unsigned int num_samp); 
int conv_bit_size(unsigned int in, int bps); 



int main(void) 
// int read_wav(void) 
{ 


unsigned int samp_rate, bits_per_samp, num_samp; 
read_wav_header(&samp_rate, &bits_per_samp, &num_samp); 

printf("samp_rate=[%d] bits_per_samp=[%d] num_samp=[%d]\n", 
     samp_rate, bits_per_samp, num_samp); 

int *data = (int *) malloc(num_samp * sizeof(int)); 
read_wav_data(data, samp_rate, bits_per_samp, num_samp); 

unsigned int i; 
// for (i = 0; i < num_samp; ++i) { 

for (i = 0; i < 100; ++i) { 
    printf("%d\n", data[i]); 
} 

return EXIT_SUCCESS; 
    } 

    void read_wav_header(unsigned int *samp_rate, unsigned int *bits_per_samp, 
       unsigned int *num_samp) 
{ 
unsigned char buf[5]; 

// freopen ("/Users/ericbrotto/Desktop/iPhoneData/tmp/Hack.wav","r",stdin); 

freopen ("C:/Documents and Settings/Eric.Brotto/Desktop/Eric_Other/Files/Hack.wav","r",stdin); 



/* ChunkID (RIFF for little-endian, RIFX for big-endian) */ 
fread(buf, 1, 4, stdin); 
buf[4] = '\0'; 
if (strcmp((char*)buf, "RIFF")) exit(EXIT_FAILURE); 


/* ChunkSize */ 
fread(buf, 1, 4, stdin); 

/* Format */ 
fread(buf, 1, 4, stdin); 
buf[4] = '\0'; 

printf("IS THIS WAVE? -->%s<--\n",(char*)buf); 


if (strcmp((char*)buf, "WAVE")) exit(EXIT_FAILURE); 

/* Subchunk1ID */ 
fread(buf, 1, 4, stdin); 
buf[4] = '\0'; 
printf("IS THIS fmt? -->%s<--\n",(char*)buf); 

if (strcmp((char*)buf, "fmt ")) exit(EXIT_FAILURE); 

/* Subchunk1Size (16 for PCM) */ 
fread(buf, 1, 4, stdin); 
if (buf[0] != 16 || buf[1] || buf[2] || buf[3]) exit(EXIT_FAILURE); 

/* AudioFormat (PCM = 1, other values indicate compression) */ 
fread(buf, 1, 2, stdin); 
if (buf[0] != 1 || buf[1]) exit(EXIT_FAILURE); 

/* NumChannels (Mono = 1, Stereo = 2, etc) */ 
fread(buf, 1, 2, stdin); 
unsigned int num_ch = buf[0] + (buf[1] << 8); 
if (num_ch != 1) exit(EXIT_FAILURE); 

/* SampleRate (8000, 44100, etc) */ 
fread(buf, 1, 4, stdin); 
*samp_rate = buf[0] + (buf[1] << 8) + 
(buf[2] << 16) + (buf[3] << 24); 

/* ByteRate (SampleRate * NumChannels * BitsPerSample/8) */ 
fread(buf, 1, 4, stdin); 
const unsigned int byte_rate = buf[0] + (buf[1] << 8) + 
(buf[2] << 16) + (buf[3] << 24); 

/* BlockAlign (NumChannels * BitsPerSample/8) */ 
fread(buf, 1, 2, stdin); 
const unsigned int block_align = buf[0] + (buf[1] << 8); 

/* BitsPerSample */ 
fread(buf, 1, 2, stdin); 
*bits_per_samp = buf[0] + (buf[1] << 8); 

if (byte_rate != ((*samp_rate * num_ch * *bits_per_samp) >> 3)) 
    exit(EXIT_FAILURE); 

if (block_align != ((num_ch * *bits_per_samp) >> 3)) 
    exit(EXIT_FAILURE); 



/* Subchunk2ID */ 
// fread reads line by line until the end. 

fread(buf, 1, 4, stdin); 
    buf[4] = '\0'; 

if (strcmp((char*)buf, "data")) exit(EXIT_FAILURE); 



/* Subchunk2Size (NumSamples * NumChannels * BitsPerSample/8) */ 
fread(buf, 1, 4, stdin); 

const unsigned int subchunk2_size = buf[0] + (buf[1] << 8) + 
(buf[2] << 16) + (buf[3] << 24); 
*num_samp = (subchunk2_size << 3)/(
            num_ch * *bits_per_samp); 
} 


void read_wav_data(int *data, unsigned int samp_rate, 
       unsigned int bits_per_samp, unsigned int num_samp) 
{ 

// freopen ("/Users/ericbrotto/Desktop/iPhoneData/tmp/Hack.wav","r",stdin); 
freopen ("C:/Documents and Settings/Eric.Brotto/Desktop/Eric_Other/Files/Hack.wav","r",stdin); 

    unsigned char buf; 
unsigned int i, j; 
for (i=0; i < num_samp; ++i) { 
    unsigned int tmp = 0; 
    for (j=0; j != bits_per_samp; j+=8) { 
     fread(&buf, 1, 1, stdin);   
     tmp += buf << j; 
    } 
    data[i] = conv_bit_size(tmp, bits_per_samp); 
} 
} 


int conv_bit_size(unsigned int in, int bps) 
{ 
const unsigned int max = (1 << (bps-1)) - 1; 
return in > max ? in - (max<<1) : in; // Supposedly this is not correct: http://ubuntuforums.org/showthread.php?p=10442711 
// return in > max ? in - ((max<<1)+2) : in; 

} 

编辑2

我的Mac它输出阵列中的所有样品(大约-32000到32000之间整数)。在这里,我得到你在图像中看到的输出,然后是几百万个零。

enter image description here

+0

输出是什么,以及代码是什么生成的? – Joe 2011-02-18 13:45:30

+0

完全有可能,它取决于您正在编写的代码,有些代码被认为是“依赖于实现”,这意味着结果会因编译器而异 – vmpstr 2011-02-18 13:45:58

+0

我们还需要输出 – delnan 2011-02-18 13:56:18

回答

0

是的。即使假定两个编译器都符合ISO标准(这不一定如此),但该标准仍有很大的余地。

例如,如果您的程序使用实现定义的或特定于语言环境的行为,则输出可能不同。

如果编写程序的人使用了未定义的行为,那么这也是不同输出的可能性。

最好的办法是向我们展示适当分析的代码。

如果您对各种不同的事情感兴趣,请参阅附件J C99(您可以从该页底部的TC1,2和3下载草稿 - 它与最终产品之间的差异是最小)列出了可移植性问题(未指定,未定义,实现定义和特定于语言环境的行为)。

有一点你可能想要小心。这可能不适用于Tiny C,但我知道我使用的Microsoft编译器是其中的"r""rb"fopen/freopen中的区别对待。如果您只指定"r",则会发生翻译,这可能会从二进制文件(例如wav文件)中给您提供错误数据。

0

任何相当简单的代码(即的printf(“世界,你好!”)的行为应该以同样的方式在这两个环境。更奇特的表情都不能保证。

Xcode使用GCC,所以你的代码可以使用GNU - 特定扩展名(不保证是便携式)

相关问题