Как исправить эти ошибки C ++ «Неправильное преобразование» и «Нет соответствия для оператора» - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь прочитать файл, содержащий серию слов и предложений.Затем необходимо сохранить уникальные слова и вести подсчет каждого отдельного слова. Слова должны быть упорядочены по убыванию количества и, если есть несколько слов с одинаковым количеством, по алфавиту.(Этот порядок может быть достигнут при чтении слов, частично при чтении слов или в конце всей обработки ввода.) В конце я хочу вывести первые и последние десять слов в отсортированном списке вместе сих количество.

Как исправить эту ошибку const char*.Я не знаю, что не так в моем коде или где и что именно я должен изменить:

[Ошибка] недопустимое преобразование из 'char' в 'const char *' [-fpermissive]

[Ошибка] нет совпадения для «operator <=» (типы операндов - «WordType» и «WordType») </p>

struct WordType
{
    int word;
    int len, count;
};

const int MaxWords=50000;
char Words[MaxWords*10];
WordType Counters[MaxWords];
int NumWords=0;


bool Compare(WordType &A, WordType &B){
    if(A.count<B.count)return true;
    if(A.count>B.count)return false;
    char w1[50],w2[50];
    strncpy(w1,Words[A.word],A.len);   //Error comes here
    w1[A.len]='\0';
    w2[B.len]='\0';
    strncpy(w2,Words[A.word],B.len);   //Error comes here
    return strcmp(w1,w2) < 0 ;  
}

int partition (int low, int high)
{
    WordType pivot = Counters[high]; 
    int i = (low - 1); 

    for (int j = low; j <= high- 1; j++)
    {
        if (Compare(Counters[j] <= pivot))      //Error comes here
        {
            i++;
            swap(&Words[i], &Words[j]);
        }
    }
    swap(&Words[i + 1], &Words[high]);
    return (i + 1);
}

void quickSort(int low, int high)
{
    if (low < high)
    {
      int pi = partition(low, high);
       quickSort(low, pi - 1);
       quickSort(pi + 1, high);
    }
  }

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

(Какими бы ни были ваши намерения с кодом, я только что посмотрел на 3 ошибки)

Эта функция сравнения решает 1-ю и 2-ю ошибки компиляции:

#include <string>

bool Compare(WordType &A, WordType &B)
{
    if (A.count < B.count)
        return true;

    if (A.count > B.count)
        return false;

    std::string w1{ Words[A.word] }, w2{ Words[B.word] }; // Fix

    return (strcmp(w1.c_str(), w2.c_str()) < 0);
}

Функция сравнения получает 2 параметра, поэтому я думаю, что вы действительно хотите вызвать ее следующим образом:

if (Compare(Counters[j], pivot)) // Fix

-

Кроме того, я предпочитаю использовать std:array & для инициализации переменных:

#include <array>

struct WordType
{
    int word = 0;
    int len = 0, count = 0;
};

constexpr int MaxWords = 50000;
std::array<char, MaxWords * 10> Words;
std::array<WordType, MaxWords> Counters;

int NumWords = 0;

// & to call in main():
Words.fill('\0');
0 голосов
/ 26 августа 2018
if (Compare(Counters[j] , pivot))
strncpy(w2,(const char *)Words[A.word],B.len); 
strncpy(w2,(const char *)Words[A.word],B.len);  

Вот так должна выглядеть ваша строка с ошибкой

...