2015-01-31 35 views
0

第一个值之后,我越来越段故障。并且buffer能够正确传递到main(),我能够使用datas[i]检查main中的值。我只是将printf复制到main()中,并且必须用*buffer[i]替换datas[i],然后编译好。它打印readWav()中的第一个值,然后发生SegFaultç分段错误,当我尝试当我尝试在<code>readWav()</code>功能上<code>*buffer[i]</code>使用<code>printf</code>给printf只是打印功能里面

如何做到这一点的readWav() - 什么是错的*buffer[i]) - 换句话说,如果datas[i]是指实际值main()那会是在readWav()buffer方面是什么?

更新: main()将通过datas其他功能仍需添加。这就是为什么我试图在readWav()中打印它,认为它将如何传递给其他功能非常相似 - 请纠正我,如果我错了?

#include <stdio.h> 
#include "sndfile.h" 

int readWav(const char *const fname, long *numFrames, int *sRate, float **buffer); 

int main(int argc, char *argv[]) 
{ 
    int sRates, sRatem, ret; 
    long nSamples = 0, nSamplem; 
    float *datas, *datam; 

    printf("Read Test\n"); 
    if (argc != 3) { 
     fprintf(stderr, "Expecting two wav file as argument\n"); 
     return 1; 
    } 

    ret = readWav(argv[1], &nSamples, &sRates, &datas); 
    if (ret != 0) { 
     printf("Error\n"); 
     return 1; 
    } 
    // Output Info 
    printf("Read %ld frames from %s, Sample rate: %d, Length: %fs\n", 
     nSamples, argv[1], sRates, (float)nSamples/sRates); 

    for (i=0; i < nSamples ; i++) { 
     printf("%d\t %f\n", i, datas[i]); 
    } 

    free(datas); 

    return 0; 
//Cleanup etc: 
} 

int readWav(const char *const fname, long *numFrames, int *sRate, float **buffer) 
{ 
    // Open sound file 
    SF_INFO sndInfo; 

    if ((sRate == NULL) || (numFrames == NULL) || (buffer == NULL)) { 
     fprintf(stderr, "Invalid arguments passed to readWav()\n"); 
     return 1; 
    } 

    SNDFILE *sndFile = sf_open(fname, SFM_READ, &sndInfo); 
    if (sndFile == NULL) { 
     fprintf(stderr, "Error reading source file '%s': %s\n", fname, sf_strerror(sndFile)); 
     return 1; 
    } 

    // Allocate memory 
    *buffer = malloc(sndInfo.frames * sndInfo.channels * sizeof(float)); 
    if (*buffer == NULL) { 
     fprintf(stderr, "Could not allocate memory for file\n"); 
     sf_close(sndFile); 

     return 1; 
    } 

    *sRate = sndInfo.samplerate; 
    // Load data 
    *numFrames = sf_readf_float(sndFile, *buffer, sndInfo.frames); 
    // Check correct number of samples loaded 
    if (*numFrames != sndInfo.frames) { 
     fprintf(stderr, "Did not read enough frames for source\n"); 
     sf_close(sndFile); 
     free(*buffer); 
    } 
    else { 
     printf("Successfully read file\n"); 
     *numFrames = sndInfo.frames; 
    } 
    // Output Info 
    printf("Read %ld frames from %s, Sample rate: %d, Length: %fs\n", 
     *numFrames, fname, *sRate, (float)*numFrames/sndInfo.samplerate); 

    for (i=0; i < sndInfo.frames ; i++) { 
     printf("%d\t %f\n", i, *buffer[i]); 
    } 

    sf_close(sndFile); 
    return(0); 
} 
+0

你必须首先解除引用:'(* buffer)[i]' – 2015-01-31 19:13:25

回答

2

您正在访问数组索引BEFORE derefencing指针。

你的意思做(*buffer)[i],但没有*(buffer[i])代替(注意我是如何增加为清晰起见,括号)

下一次,请记住*的优先级低于[]

+0

谢谢你的工作。如果我添加第三个函数,比如fthird(),那么我可以使用与readWav()相同的格式。 – user4504270 2015-01-31 19:24:30

+0

我想象。我只是剔除了你的代码,但是因为之前有类似的问题而立即知道。不要忘记你可以接受你认为回答问题最好的答案! – 2015-01-31 19:25:23

+0

真棒以赛亚 - 你对优先权的解释{*的优先级低于[]} – user4504270 2015-01-31 19:44:42

相关问题