gpt4 book ai didi

c - 将文件写入磁盘并使用缓冲区时 C 中的段错误 11

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:56 26 4
gpt4 key购买 nike

此程序旨在创建一个输出正弦波文件,其中包含用户输入的持续时间、振幅、采样率和频率,用值填充缓冲区并在用数据写入新的 .aiff 文件之前应用短启动和衰减斜坡.

虽然我的程序编译得很好,但它在使用参数运行时遇到了“段错误 11”,在快速谷歌搜索后似乎与内存不足有关。我已经多次检查我的代码(主要是处理缓冲区大小和指向它的指针的区域)。

   /* playsine.c */
/* Creates a sine wave audio file with input outfile - duration - amplitude - sampling
rate - frequency */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <portsf.h>

int makeSine(float *buffer, double amplitude, long numFrames, double sineFreq,
double samplingPeriod){
long i;
double time;
double twoPi = 2 * M_PI;
for(i = 0, time = 0; i < numFrames; i++){
buffer[i] = amplitude * sin(twoPi * sineFreq * time);
time += samplingPeriod;
}
return i;
}



long attack(float *buffer, long attackFrames){
long i = 0;
double factor = 0.0, increment = 1.0/attackFrames;
while(factor <= 1.0 && i < attackFrames){
buffer[i] = factor * buffer[i];
factor += increment;
++i;
}
return i;
}

long decay(float *endBuffer, long decayFrames){
long i = 0;
double factor = 1.0, decrement = 1.0/decayFrames;
while(factor >= 0.0 && i < decayFrames){
endBuffer[i] = decayFrames * endBuffer[i];
factor -= decrement;
++i;
}
return i;
}

enum {nameArg, outArg, durArg, ampArg, sampArg, freqArg, numArg};

int main(int argc, char* argv[]){

if(argc < numArg){
printf("Usage:\toutfile.aiff\tduration(s)\tamplitude(0-1)\tsampling rate\t\
frequency(hz)\n");
return 1;
}
if(psf_init()){
printf("Error: Unable to open portsf library\n");
return 1;
}

PSF_PROPS props;
int outfile;
long numFrames, samplingRate = atol(argv[sampArg]);
double amps = atof(argv[ampArg]), samplingPeriod = 1.0/samplingRate;
double sineFreq = atof(argv[freqArg]), attackFrames = 0.005 * samplingRate;
double decayFrames = 0.01 * samplingRate;
float *buffer, duration = atof(argv[durArg]);
numFrames = (long)duration * samplingRate;
float *endBuffer = buffer + (numFrames - (long)decayFrames);

//Fill structure
props.srate = samplingRate;
props.chans = 1;
props.samptype = PSF_SAMP_16;
props.format = PSF_AIFF;
props.chformat = MC_MONO;


//Assign buffer
buffer = (float*)malloc(numFrames * props.chans * sizeof(float));
if(buffer == 0){
printf("Error: unable to allocate buffer\n");
return 1;
}else{
//Fill buffer
if(makeSine(buffer, amps, numFrames, sineFreq, samplingPeriod) != numFrames){
printf("Error: unable to create sinewave\n");
return 1;
}
attack(buffer, attackFrames);
decay(endBuffer, decayFrames);
}

//Create an outfile
outfile = psf_sndCreate(argv[outArg], &props, 0, 0, PSF_CREATE_RDWR);
if(outfile < 0){
printf("Error: unable to create %s\n", argv[outArg]);
return 1;
}
//Write buffer to file
printf("Writing %s ...\n", argv[outArg]);
if(psf_sndWriteFloatFrames(outfile, buffer, numFrames) != numFrames){
printf("Warning: error writing %s\n", argv[outArg]);
return 1;
}
//Close file
if(psf_sndClose(outfile)){
printf("Warning: error closing %s\n", argv[outArg]);
return 1;
}

psf_finish();
return 1;
}

最佳答案

我在 decay()attack() 中看到的两个直接问题:

long attack (float *buffer, long attackFrames) {
long i;
...
buffer[i] = factor * buffer[i]; //Oops, i is never initialized

变量i 从未被初始化。这是未定义的行为,很可能导致崩溃。我假设你真的想做这样的事情:

long attack (float *buffer, long attackFrames) {
long i = 0;
double factor = 0.0, increment = 1.0/attackFrames;

while(factor <= 1.0 && i < attackFrames) {
buffer[i] = factor * buffer[i];
factor += increment;
++i;
}

return i;
}

编辑:另一个问题是您使用endBuffer 引用未初始化的内存:

 float *buffer;              // Buffer not initialized
float *endBuffer = buffer + (numFrames - (long)decayFrames); // Oops!
...
buffer = (float*)malloc(numFrames * props.chans * sizeof(float));
//endBuffer still points to buffer's original address which is who-knows-where

您应该在使用malloc()分配buffer之后分配endBuffer

关于c - 将文件写入磁盘并使用缓冲区时 C 中的段错误 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com