Доступ к данным в массиве с помощью указателей - PullRequest
1 голос
/ 10 марта 2011

Я новичок в указателях, и поэтому у меня возникли некоторые трудности.Я верю, что решение этого вопроса должно быть легким для вас, эксперты.Проблема в коде.

 // flags is an array of data that I create, manipulate, but now having trouble accessing elsewhere. 
int *flags = (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, flags);

// I want to use flags here, but it doesn't work 

place_effects_on_events(vocal_data, flags, number_of_flags , events_with_effects);

ДРУГИЕ МЕТОДЫ:

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

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

    // the data prints absolutely correctly here.   
for (int i = 0; i < number_of_flags; i++) {
    printf("FLAG %i  -- %d \n", i, flags[i]);
}
}





 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. 




int threshold = calculate_threshold_value(audio_samples, size_of_audio);



int length = (int)size_of_audio;




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

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


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

        flag++;
        run = false;


    }   

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



}


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

return flag;

}

ПРОБЛЕМА ЗДЕСЬ

 void place_effects_on_events (int *vocal_samples, int *flags, int number_of_flags ,int *events_with_effects)
 {


// here the data does not print correctly 
for (int i = 0; i < number_of_flags; i++) {
    printf("FLAG %i  -- %d\n", i,  flags[i]);
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Вы должны передать указатель на flags на event_extractor:

int number_of_flags = event_extractor(vocal_data, size, &flags);

и измените его прототип на

int event_extractor (int *audio_samples, unsigned int size_of_audio, int **flags)

В противном случае flags само по себе никогда не обновляется и по-прежнему указывает на первую malloc область памяти. Поскольку в данный момент эта область памяти больше не существует, доступ к ее содержимому приведет к неопределенным результатам.

0 голосов
/ 10 марта 2011

вы передаете флаги в event_extractor. Попробуйте передать & флаги к нему. Я думаю, вы хотите, чтобы флаги обновлялись после вызова функции event_extractor. Еще один момент: вы не возвращаете number_of_flags из функции event_extractor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...