2011-03-10 27 views
0

我有一个循环涉及在C中动态分配的数组。出于某种原因,它在flag增量7次之后崩溃。在我重新分配数组的大小之前,这并没有发生。这里是代码:循环不会增加过去8?

for (int i = 0; i < length-1; i++) 
{ 

    if (audio_samples[i] > threshold && run) 
    { 

     *event_flags = (int*)realloc(*event_flags, sizeof(int)*(flag+1)); // reallocate the size of the array 
     *event_flags[flag] = i; 
     // printf("FLAG CREATED! %i\n ", i); 
     printf("EVENT FLAG %i %i\n",flag, *event_flags[flag]); 
     if (flag >5) { 
      printf("%d\n", i); 
     } 

     flag++; 
     run = false; 
    } 

任何想法?请记住,数组的大小的确与长度相同。这里是我的错误的一个例子: enter image description here


编辑1

文件中的一个:

int *event_positions = (int *) malloc(1 * sizeof(int)); // let us start with 1 and then add more within the method. This should continue until we have all the flags we want. 
    int number_of_flags = event_extractor(vocal_data, size, event_positions); 

文件中的两个:

float g_THRESHOLD_FACTOR = 2.3; // THIS INCREASES THE THRESHOLD VALUE. 


int event_extractor (int *audio_samples, unsigned int size_of_audio ,int *event_flags) 
{ 

int length = (int)size_of_audio; 


// * * * * * * * * * * * * * * * * * * 
// RECTIFY VALUES (MAKE ABSOLUTE) (MAKE ALL POSITIVE) 
int *rectified_audio = (int *) malloc(length * sizeof(int)); // I took this line from wave header reader. The number is the number of samples of the hip hop track. 
make_values_absolute(audio_samples, length, rectified_audio); 


    // If I convert to signed ints here would the method run more efficiently? 

// * * * * * * * * * * * * * * * * * * * * 
// LOW PASS FILTER 
int *lopass_samples = (int *) malloc(length * sizeof(int)); // I took this line from wave header reader. The number is the number of samples of the hip hop track. 
lopass(rectified_audio, length,0.5, lopass_samples); 



int number_of_flags = apply_threshold (lopass_samples, length, &event_flags); 


printf("\n\n\n NUMBER OF EVENTS AAAA --- %d\n", number_of_flags); 

for (int i = 0; i < number_of_flags; i++) { 
    printf("FLAG %i -- %d \n", i, event_flags[i]); 
} 



return number_of_flags; 
} 


int apply_threshold (int *audio_samples, unsigned int size_of_audio, int **event_flags) 
    { 


int flag = 0; // this will be the number of flags that I have 
bool run = true; // this will make sure that a minimum amount of time passes before I grab another flag. It's a guard. 
int counter = 0; // this is the counter for the above guard. 





printf("\n\nCURRENT MINIMUM TIME: 20100 SAMPLES \n\n"); 

// event_flags[0] = 1; // this first one is a dud. within the loop we will automatically start adding flags 


int threshold = calculate_threshold_value(audio_samples, size_of_audio); 

printf("\n\n this is the threshold %d \n\n", threshold); 

int length = (int)size_of_audio; 

printf("LENGTH OF VOCAL AUDIO %d \n", length ); 


for (int i = 0; i < length-1; i++) 
{ 

    if (audio_samples[i] > threshold && run) 
    { 

     // ** is this realloc working ? 
     // event_flags = (int*)realloc(event_flags, sizeof(int) * (flag+1)); 
     *event_flags = (int*)realloc(*event_flags, sizeof(int)*(flag+1)); // reallocate the size of the array 
     *event_flags[flag] = i; 
     // printf("FLAG CREATED! %i\n ", i); 
     printf("EVENT FLAG %i %i\n",flag, *event_flags[flag]); 
     if (flag >5) { 
      printf("%d\n", i); 
     } 

     flag++; 
     run = false; 




    } 

    if (!run) { 
     counter++; 
     if (counter > 20100) { // hardcode minimum size for now. 
      counter = 0; 
      run=true; 
     } 
    } 

} 

printf("\n\n\n NUMBER OF EVENTS --- %d\n", flag); 

for (int i = 0; i < flag; i++) { 
    printf("FLAG %i -- %d\n", i, *event_flags[i]); 
} 



printf("\nFIVE samples before and after my second flag: \n 0 should indicate a reach in the threshold\n"); 

for (int i = 0; i <10 ; i++) { 
    printf("VOCAL SAMPLE %i %i \n", i-5,audio_samples[*event_flags[1]+i-5]); 
} 


return flag; 
} 
+0

你能显示代码的位置你在哪里'malloc'ing数组? – phimuemue 2011-03-10 13:40:29

+0

你可以显示'event_flags'的定义。我假设'int ** event_flags',但想检查。 – 2011-03-10 13:45:12

+0

请看我的第一个编辑。 – 2011-03-10 13:50:39

回答

2

首先你不应该投下的回报。

那么,如果我想,该变量的类型是int*

*event_flags[flag] = i; 

有一个*太多了不是吗?

编辑:在您离开演员阵容之后的评论。

所以如果你的event_flags有效int**,你真的走错了路。看到你的使用,我猜你只需要一个int而不是数组。如果你这样做,然后

event_flags[flag] = i; 

没有*无处不在,你的问题应该消失。

如果你真的很需要那间接,你就必须分配不仅阵列event_flags也是所有这些指针都指向单独的阵列,具有类似

for (size_t j = startvalue; j < something; ++j) 
    event_flags[j] = malloc(whatever); 
+0

嗯..不完全确定你的意思?我应该完全摆脱演员阵容吗? – 2011-03-10 13:47:23

+1

是的。在C中铸造几乎总是表示不正确的代码。也就是说,如果你的代码没有编译或者没有强制转换就给出警告,那么你可能做错了。如果它在没有演员的情况下正常工作,请删除演员阵容,以免它向人们宣读您正在执行的丑陋黑客代码。 – 2011-03-10 14:17:51

+0

我已经摆脱了演员阵容,但后来'从void *无效转换为int **'。任何帮助? – 2011-03-10 15:13:44

1

我想你可能有问题与运营商的*运营商的优先级相比。即*event_flags[flag](*event_flags)[flag]不引用相同的内存位置。第一个对应于**(event_flags + flag)(可能不可访问),而第二个对应于*((*event_flags) + flag)(你想要的)。

所以,你应该重写你的代码:

int** event_flags; 
// ... 
*event_flags = realloc(*event_flags, sizeof(int) * (flag + 1)); 
(*event_flags)[flag] = i;