0

我在 C 编程方面完全无能,我通过查看不同的程序并通过类比工作将其拼凑起来(即我根本没有太多的编码经验)。

下面的程序(用于读取 aiff 文件(使用 libaiff 库)然后制作它的副本)在执行时工作。但是,如果我进行以下两个“无意义”的更改(即我只是定义一个我不使用的指针),我会得到错误:

char *filepathwrite = "Filepath/filename (Copy).aiff";

如果我定义

char *filepath = "LongFilepath";

我得到分段错误 11。 但是如果我定义

char *filepath = "ShortFilepath";

或者

int check = 1;

该程序仍然可以正常工作。

我不能说我做错了什么。

感谢您提供的任何帮助。我正在使用 gcc 编译器在 Mac OS X Mavericks 上工作。

#define LIBAIFF_NOCOMPAT 1 // do not use LibAiff 2 API compatibility
#include <libaiff/libaiff.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
char *filepathread = "Filepath/filename.aiff";
char *filepathwrite = "Filepath/filename (Copy).aiff";

/* Initialize files for importing */
AIFF_Ref fileref1;

/* Intialize files for getting information about AIFF file */
uint64_t seconds, nSamples;
int channels;
double samplingRate;
int bitsPerSample;
int segmentSize;
int dummy;
int nsamplepts;
int32_t *samples, *samplesVec;
int count, maincount = 0, k, p;

/* Import Routine */
fileref1 = AIFF_OpenFile(filepathread, F_RDONLY) ;
if(fileref1)
{
    printf("File opened successfully.\n");
    dummy = AIFF_GetAudioFormat(fileref1,&nSamples,&channels,&samplingRate,&bitsPerSample,&segmentSize);
    if (dummy < 1)
    {
        printf("Error getting audio format.\n");
        AIFF_CloseFile(fileref1); return 0;
    }
    nsamplepts = ((int) nSamples)*channels;
    samplesVec = malloc(nsamplepts * sizeof(int32_t));
    for (count = 0; count < nsamplepts; count++)
    {
        dummy = AIFF_ReadSamples32Bit(fileref1, samples, channels);
        if (dummy == 0) {
            break;
        }
        p = 0;
        for (k = channels*maincount; k < ((channels*maincount)+channels); k++) {
            samplesVec[k] = *(samples+p);
            p = p + 1;
        }
        maincount = maincount + 1;
    }
    printf("Number of maincounts (should equal sample frames): %d\n",maincount);
    printf("Number of sample frames: %llu\n",nSamples);
    printf("Number of sample points: %d\n",nsamplepts);
    printf("Segment size: %d\n",segmentSize);
    printf("Number of channels: %d\n",channels);
    printf("Number of Sampling Rate: %f\n",samplingRate);
    AIFF_CloseFile(fileref1);
}

seconds = nSamples/samplingRate;

/* Print out the seconds in H:MM:SS format */
printf("Length: %lu:%02lu:%02lu \n", (unsigned long) seconds/3600, (unsigned long) (seconds/60)%60, (unsigned long) seconds%60);

/* Export Routine */
fileref1 = AIFF_OpenFile(filepathwrite, F_WRONLY);
if(fileref1)
{
    dummy = AIFF_SetAudioFormat(fileref1, channels, samplingRate, bitsPerSample);
    dummy = AIFF_StartWritingSamples(fileref1);
    dummy = AIFF_WriteSamples32Bit(fileref1, samplesVec, nsamplepts);
    dummy = AIFF_EndWritingSamples(fileref1);
    AIFF_CloseFile(fileref1);
}
free(samplesVec);
return 0;
}
4

0 回答 0