#arrays #c #sorting
#массивы #c #сортировка
Вопрос:
У меня возникли некоторые проблемы с этой функцией. Его основная цель — отсортировать массив классов (ниже) в порядке убывания по количеству разделов. Вот массив классов:
CIS_CLASSES *pCls, *pLast;
CIS_CLASSES clsList[NUM_CLS] =
{
{"CIS 35A", 2, {61, 63}},
{"CIS 35B", 1, {62}},
{"CIS 41A", 3, {1, 2, 61}},
{"CIS 28", 1, {61}},
{"CIS 22C", 4, {3, 4, 61, 63}},
{"CIS 26B", 1, {61}},
{"CIS 22B", 8, {1, 2, 3, 4, 6, 61, 62, 63}},
{"CIS 29", 1, {61}},
{"CIS 22A", 8, {1, 3, 5, 6, 7, 8, 61, 63}},
};
Я также определил NUM_CLS с помощью struct:
#define NUM_CLS 9
typedef struct
{
char course[10];
int noSections;
int sections[16];
int final;
} CIS_CLASSES;`
Вот функция :
void sortDescend(CIS_CLASSES list[], CIS_CLASSES *pLast);
{
CIS_CLASSES *pCurr;
CIS_CLASSES *pWalk;
for (pCurr = list- 1; pCurr < pLast; pCurr )
{
CIS_CLASSES temp = *pCurr;
pWalk = pCurr - 1;
while (pWalk >= 0 amp;amp; temp.final > pLast->list[pWalk].final)
{
pLast->list[pWalk 1] = pLast->list[pWalk];
pWalk--;
}
pLast->list[pWalk 1] = temp;
}
}
}
Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке: нет элемента с именем ‘list’ в ‘CIS_CLASSES’. Но я не понимаю, почему? и как я могу заставить ее работать? Пожалуйста, дайте мне знать, если я что-то упустил!
Комментарии:
1. Каковы ваши намерения с этим выражением:
pLast->list[pWalk]
?2. Ваш параметр
CIS_CLASSES list[]
равен, а затем вы определяетеpCurr = list- 1
, но нет смысла вычитать 1 из массива. Даже если бы это имело смысл, это дало бы вам указатель на некоторую память ПЕРЕД началом массива (память, которую вы не должны трогать). Затем вы определяетеpWalk = pCurr - 1;
так, что pWalk теперь является указателем на какую-то другую память ПЕРЕД началом массива (память, которую вы не должны трогать). Затем вы используете этот указатель pWalk в качестве индекса массива. Но указатели не являются индексами массива, поэтому эта часть неверна. Я не уверен, что вы на самом деле хотели сделать…
Ответ №1:
Глядя на вашу структуру, я не вижу list
там элемента:
typedef struct
{
char course[10];
int noSections;
int sections[16];
int final;
} CIS_CLASSES;
Поэтому
pLast->list[pWalk].final
должен произойти сбой.
Ответ №2:
Пожалуйста, попробуйте сделать следующее.
void sortDescend(CIS_CLASSES pInput[], CIS_CLASSES **pOutput);
{
// pOutput should be declared in your main function as the following
// CIS_CLASSES **pOutput = (CIS_CLASSES **)malloc(NUM_CLS * sizeof(PVOID));
// copy pointer arrays of CIS_CLASSES list elements
for(int i=0; i<NUM_CLS; i )
{
pOutput[i] = amp;pInput[i];
}
// bubble sort
for (int i=0; i<NUM_CLS-1, i )
{
for (int j=i 1; j<NUM_CLS; j )
{
CIS_CLASSES temp = *pCurr;
if(pOutput[i]->noSection < pOutput[j]->noSection)
{
pCurr = pOutput[i];
pOutput[i] = pOutput[j];
pOutput[j] = pCurr;
}
}
}
// You can access the descending sorted list item like pOutput[index]->course, ...
}
Ответ №3:
Спасибо всем! Я обновил свой код до этого :
void sortDescend(CIS_CLASSES list[], CIS_CLASSES *pLast);
{
CIS_CLASSES *pCurr;
CIS_CLASSES *pWalk;
for (pCurr = list 1; pCurr < pLast; pCurr )
{
CIS_CLASSES temp = *pCurr;
pWalk = pCurr - 1;
while (pWalk >= 0 amp;amp; strcmp(temp.course, pWalk->course) > 0)
{
*(pWalk 1) = *pWalk;
pWalk--;
}
*(pWalk 1) = temp;
}
}
}