2014-09-25 2 views
0

Я пишу алгоритм сортировки. На данный момент я пытаюсь заполнить массив отсортированными элементами. Я считаю, что это своего рода метод сортировки пузырьков. В основном, я занимаюсь тем, что занимаю строчку на основе оценки с наивысшим балл в bestmatch [0] и т. Д. Для каждой строки я запускаю stage3().Неправильное поведение для алгоритма сортировки

Так что, по сути, я беру оценку (оценка для каждой строки), и я сравниваю ее с тем, что находится в массиве, а затем добавляю это в соответствии со своим рангом относительно. Это не работает. Мой оператор печати, который печатает для каждой строки ввода, просто печатает оценку этой отдельной строки (при условии, что она отлична от нуля). Могу ли я помочь?

void 
stage3(double Score, line_t * linePtr) { 
    int j = 0; 

    line_t line; 
    size_t maxSz = MAX_LINELEN; 
    int scorecmp(int j, double Score, line_t * linePtr); 

     if (Score != 0) { 
      if (j < TOP_SCORING_MAX) { 
       scorecmp(j, Score, linePtr); 
       j++; 
      } /* fill up array */ 

      else { 
       /* compare with last element 
        if greater than last element, check against 
        every element, moving it down while the thing 
        is bigger 
        when it is less than element, put it in that gap 
        */ 
     } 
     } 
    } 

Это вторая функция

int 
scorecmp(int j, double Score, line_t * linePtr) { 
    line_t bestmatch[TOP_SCORING_MAX]; 
    line_t line; 

    if (j == 0) { 

     bestmatch[j].score = Score; 
     bestmatch[j].index = linePtr->index; 
     bestmatch[j].buf = linePtr->buf; 

    } 
    else if (line.score > bestmatch[j-1].score) { 
     bestmatch[j].score = bestmatch[j-1].score; 
     bestmatch[j].index = bestmatch[j-1].index; 
     bestmatch[j].buf = bestmatch[j-1].buf; 
     bestmatch[j-1].score = Score; 
     bestmatch[j-1].index = linePtr->score; 
     bestmatch[j-1].buf = linePtr->buf; 
    } 
    else if (line.score <= bestmatch[j-1].score) { 

     bestmatch[j].score = Score; 
     bestmatch[j].index = linePtr->index; 
     bestmatch[j].buf = linePtr->buf; 
     } 


     printf("best match = %f\n",bestmatch[0].score); 
return 0; 
} 

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

Спасибо

Вот определение line_t

typedef struct line_t 
{ 
    char* buf; 
    int lineLength; 
    int wordCount; 
    int index; 
    double score; 
} line_t; 
+0

Разве это не тот же код, что и в предыдущем http://stackoverflow.com/questions/26030063/segmentation-fault-when-using-arrays-in-sorting-algorithm? – usr2564301

+0

@ Jongware Довольно много. Есть пара очень маленьких изменений. Вопрос другой. Это разрешено? – KittiCat

+1

Я полностью потерял то, что «массив» вы «заполняете отсортированными элементами». Вы - массив 'bestMatch' в' scorecmp' уничтожается с каждым вызовом, вы это знаете, правильно? Как написано, только один из этих элементов будет когда-либо иметь какие-либо фактические данные, которые являются [* defininate *] (http://dictionary.reference.com/browse/determinate?s=t). Если аромат проблемы [XY] (http://mywiki.wooledge.org/XyProblem) может быть более резким, чем в этом коде, мне придётся посмотреть, как это сделать. – WhozCraig

ответ

1

В коде BestMatch [] является локальным массивом. поэтому он истекает, когда каждый шаг завершен.
Согласно вашему алгоритму, bestmatch [] следует сохранить.

Для решения этой проблемы у вас есть два метода.

Простым методом является то, что вы определяете bestmatch [] для глобальной переменной.
Предпочитаемый метод заключается в том, что вы определяете bestmath [] в определенной функции, например stage3() или прокручиваете функцию вызова, и передаете bestmath [] в scorecmp().

+0

Ох! Это кажется таким очевидным сейчас! Я дам его назад и дам вам знать, что произойдет – KittiCat

+0

Это почти определенно глупая ошибка с моей стороны. redefined stage3 as: stage3 (double Score, line_t * linePtr, line_t bestmatch), и я сделал подобное для scorecmp(). Я определил bestmatch в main, где я вызываю stage3(), и мой вызов функции таков: stage3 (Score, & line, bestmatch [TOP_SCORING_MAX]). Я получаю сообщение об ошибке: «индексированное значение не является ни массивом, ни указателем» , Что я делаю не так? – KittiCat

+0

Да, это то, что я сделал (= Что-то не так с моим вызовом функции? – KittiCat

Смежные вопросы