2014-12-01 8 views
-1

В части из проекта, над которой я работаю, я реализую дерево AVL. Одна из функций, которую мне нужно реализовать, принимает и массив ключа (класс шаблона для ключей дерева) и указатель int (которому мне нужно вставить размер дерева AVL). В этом func мне нужно вставить элементы дерева в массив в определенном порядке (теперь это не имеет значения). Это подпись функции, и она ДОЛЖНА быть такой: GetAllAppsByDownloads(Key **apps, int *numOfApps)Динамическое распределение массива в функции в C++

Но по какой-то причине я не могу ее реализовать. Я столкнулся с небольшими проблемами, и главное, что я неправильно распределяю память (я хочу, чтобы массив был инициализирован значением по умолчанию для Key), а затем, когда я вставляю ключи, они не вставлены правильно.

Это, как я вызвать функцию из тестов, которые я построил (возможно, я это делаю неправильно?):

int* keyArr; 
    int numApps; 
    tree.GetAllAppsByData(&keyArr,&numApps); 
    for(int i=0; i<numApps; i++){ 
     cout<<keyArr[i]<<endl; 
    } 

И это мои функции:

void GetAllAppsByData(Key** apps, int*numOfApps){ 
    AVL_node<Dat,Key,OS>* temp=(getRoot()); 
    *numOfApps=size; 
    *apps=(new Key[size]()); /*size represents the amount of elements. 
    its a variable in the private section of the class*/ 
    KeyIntoArrByData(temp, apps, 0); 
}; 


void KeyIntoArrByData(AVL_node<Dat,Key,OS>* root, Key** array, int i){ 
    if(root==NULL) return; 
    KeyIntoArrByData(root->right, array, i); 
    array[i]=&(root->key); 
    i++; 
    KeyIntoArrByData(root->left, array, i); 
} 
    /* P.S Dat and OS are other template variables I receive from the user, they 
    don't matter here*/ 

Я думаю, причина, по которой ключ вставлен неправильно, потому что i меняется, когда я возвращаюсь обратно из рекурсии, но мне не удалось найти решение для него (я попробовал добавить еще один int в класс, который я буду использовать только в этой функции, чтобы он остался как новое значение при возврате рекурсии), wou Не обращай внимания на хаха.

Но это не большая проблема, элементы, которые он вставляет в массив, вставлены неправильно (помещается в мусор, а не в ключи), обратите внимание: только array[0] вставлен правильно.

Пожалуйста, помогите мне понять, что я делаю неправильно :(

+0

Что об использовании отладчика пошагово, чтобы получить власть, что на самом деле происходит на –

+0

'* numOfApps = размер;.?' Где 'size' фактически приходит от –

+0

не спекулировать, использовать? отладчик, чтобы пройти через код и узнать, что именно происходит. –

ответ

0

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

void KeyIntoArrByData(AVL_node<Dat,Key,OS>* root, Key** array, int &i) 
+0

О боже, я не могу поверить, что забыл о ссылках, сейчас я так глуп, спасибо, он исправил это. Это мой новый код: [link] (http://pastebin.com/WbMXkN3T). Я вижу (из печати) он вставляет значения так, как должен, но когда я должен вернуться из функции в последний раз (закончил вставку, вернул рекурсию и предположим, что вернусь к 'GetAllAppsByData'), она сработает (messege [ссылка] (http://i61.tinypic.com/9ztd1.png)). Абсолютно не знаю, почему. Если я перехожу через 'tree.GetAllAppsByData (& keyArr, &AndApps);' в отладчике он не разбивается, а вместо этого вставляет ненужный мусор. – Akruze