Попытка обновить массив с кодом строки Хаффмана - PullRequest
0 голосов
/ 05 марта 2019

Моя текущая программа создает дерево Хаффмана, заполненное узлами символов ascii, которые читаются из текстового файла, а также количество времени, которое они появляются в текстовом файле (частота). Кроме того, он выводит уникальные коды для каждого прочитанного символа на основе частоты, это делается с помощью моей функции перемещения.

Моя проблема: у меня есть этот строковый массив, который может содержать коды для всех 256 значений ascii в моей функции Хаффмана, для которой по умолчанию задана пустая строка для каждого элемента. Я пытался обновить мой массив путем передачи параметра в мою функцию перемещения, но это выдает ошибку.

Код E0413 - «Не существует подходящего преобразования из std :: string в char»

Части моего кода ниже вместе с некоторыми объяснениями переменных в моей функции обхода:

'символ' - это символ, который был найден в текстовом файле

«частота» - это количество раз, которое символ читается в текстовом файле

'traversecode' - код Хаффмана, генерируемый функцией traverse

Я также закомментировал строки в моей функции перемещения, где я получаю ошибку.

struct node {
    int frequency;
    char character;
    const node *child0;
    const node *child1;

    node(unsigned char c = 0, int i = -1) {
        character = c;
        frequency = i;
        child0 = 0;
        child1 = 0;
    }

    node(const node* c0, const node *c1) {
        character = 0;
        frequency = c0->frequency + c1->frequency;
        child0 = c0;
        child1 = c1;
    }

    bool operator<(const node &a) const {
        return frequency > a.frequency;
    }



    void traverse(string codearray[256], string traversecode = "") const {
        if (child0) {
            child0->traverse(traversecode + '0'); // one line throwing the error
            child1->traverse(traversecode + '1'); // second line that throws me the error
        }
        else {
            codearray[int(character)] = traversecode;
            cout << " " << character << "     ";
            cout << frequency;
            cout << "    " << traversecode << endl;
        }
    }

};

функция Хаффмана (функция, которая содержит массив, который я бы хотел обновить)

void huffman(string code[256], const unsigned long long frequency[256]) {
    priority_queue < node > q;
    for (unsigned i = 0; i < 256; i++) {
        if (frequency[i] == 0) {
            code[i] = "";
        }
    }

    for (int i = 0; i < 256; i++)
        if (frequency[i])
            q.push(node(i, frequency[i]));

    while (q.size() > 1) {
        node *child0 = new node(q.top());
        q.pop();
        node *child1 = new node(q.top());
        q.pop();
        q.push(node(child0, child1));
    }

    cout << "CHAR  FREQUENCY  HUFFMAN CODE" << endl;
    q.top().traverse(code);
}

1 Ответ

1 голос
/ 05 марта 2019

Когда вы делаете рекурсивный вызов traverse, вам необходимо указать оба параметра.

child0->traverse(codearray, traversecode + '0');

В настоящее время вы пытаетесь передать второй параметр в качестве первого.

Еще одна возможная проблема заключается в том, что ваш код предполагает, что char не подписано.Если char подписано, доступ к codearray[int(character)] будет иметь доступ за пределами codearray, если символ «отрицательный» (или в верхней половине таблицы ASCII при использовании символов без знака).

...