Compiler construction 不同的编译器,不同的输出?

Compiler construction 不同的编译器,不同的输出?,compiler-construction,Compiler Construction,我在mac上的Xcode中编写了一些c代码。然后我想在Windows机器上使用它,并用TinyC编译它。当我运行它时,输出是不同的 这是否可能是因为使用了不同的编译器 谢谢 编辑1 这段代码是一个简单的脚本,它打开一个wav文件,将所有样本放入一个数组中 #include <stdio.h> #include <stdlib.h> #include <string.h> void read_wav_header(unsigned int *samp_ra

我在mac上的Xcode中编写了一些c代码。然后我想在Windows机器上使用它,并用TinyC编译它。当我运行它时,输出是不同的

这是否可能是因为使用了不同的编译器

谢谢

编辑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之间。这里我得到了你在图像中看到的输出,后面是几百万个零


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

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

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

你最好的办法是向我们展示正确分析的代码

如果您对可能不同的东西感兴趣,您可以在该页底部的附录J中使用TC1、2和3来下载草稿-与最终产品之间的差异最小列出了未指定、未定义、实现定义和特定于语言环境的行为的可移植性问题


有一件事你可能需要小心。这可能不适用于Tiny C,但我知道我使用的Microsoft编译器就是其中之一,在fopen/freopen中r和rb的处理方式不同。如果您只指定r,则会发生转换,这可能会从二进制文件(如wav文件)中为您提供错误的数据。

任何合理简单的代码,如printfHello World!在两种环境中的行为应相同。更多的异国情调的表达是不能保证的


Xcode使用gcc,因此您的代码可能使用gnu特定的扩展,而该扩展不保证可移植

输出是什么,是什么代码生成的?这是完全可能的。这取决于您正在编写的代码。有些代码被视为依赖于实现,这意味着不同编译器的结果会有所不同。我们也需要输出。请参见编辑1。我希望不会太多:你是在建议我使用rb而不是r吗?@Eric:不,我只是粗略地看了一下你的代码,指出这是一个可能的问题。我不太可能做深入的分析,因为我通常会因为这类东西得到很好的报酬:-我的建议是创建一个非常短的wav文件进行调试,这样你就不会得到几百万个零。这会使你的任务稍微轻松一些。然后,这只是一个比较输出的问题。