Вы просили замечания:)
1. Писать для определения структуры
Код:
.......
typedef struct marix_type
{
char* Name;
int Rows;
int Cols;
float* Values;
} MATRIX;
.......
ИМХО крайне не правильно. Такая запись обычно используется в купе с
Код:
} MATRIX, FAR *LPMATRIX;// - и здесь можно еще что-нить добавить,
и там она имеет смысл - мы определяем структуру marix_type, и для удобства две новых фичи - это тип и указатель на тип (MATRIX и LPMATRIX), которые на самом деле есть marix_type и marix_type*. Я очень часто так и делаю. Таким образом у нас есть MATRIX, и marix_type. И если не нужно FAR *LPMATRIX и прочей ерунды, то можно написать просто:
Код:
.......
struct MATRIX
{
char* Name;
int Rows;
int Cols;
float* Values;
};
.......
2. ИМХО, типичным признаком перехода от языков типа Паскаль к С/С++ является использование предобъявлений. В Паскале, на сколько я знаю, это было вызвано кривостью принципов, заложенных в компилятор. В С/С++ этого делать не обязательно и даже, я бы сказал, ни в коем случае не рекомендуется, так как это ухудшает читаемость кода и прочее. Переменную надо объявлять именно там, где она нужна.
Код:
MATRIX* matrix;
matrix = (MATRIX*)malloc(sizeof(MATRIX)); // Зачем так сложно?
...............
// Когда можно проще и нагляднее -
MATRIX* matrix = (MATRIX*)malloc(sizeof(MATRIX));
// При этом в первом случае выполняется инцилизация переменной, а затем ее использование, а во втором - только инициализация (см. описание С/С++).
...............
// А вот это
void show_matrix(MATRIX_LIST* matrix_list)
{
char name[10];
MATRIX* matrix;
int i, j;
printf("indicate the name of variable:\n> ");
gets(name);
matrix = search_matrix(matrix_list, name);
if (!matrix)
{
puts("Variable not found!");
return;
}
printf("%s:\n", matrix->Name);
printf("%d x %d\n", matrix->Rows, matrix->Cols);
for(i=0; i<matrix->Rows; i++)
{
for(j=0; j<matrix->Cols; j++)
printf(" %.4f", matrix->Values[i * matrix->Cols + j]);
putchar('\n');
}
}
............
// можно свести к следующему
void show_matrix(MATRIX_LIST* matrix_list)
{
printf("indicate the name of variable:\n> ");
char name[10];
gets(name);
MATRIX* matrix = search_matrix(matrix_list, name);
if (!matrix)
{
puts("Variable not found!");
return;
}
printf("%s:\n", matrix->Name);
printf("%d x %d\n", matrix->Rows, matrix->Cols);
for(int i=0; i<matrix->Rows; i++)
{
for(int j=0; j<matrix->Cols; j++)
printf(" %.4f", matrix->Values[i * matrix->Cols + j]);
putchar('\n');
}
}
Но это так, лирика.
3. Если вы делаете динамическое добавление/удаление - то почему бы не сделать связанный список для хранения матриц. Тогда не прийдется постоянно память выделять/удалять, а просто удаляем/добавляем что-то и переписываем связи.
Код:
typedef struct tagMATRIX_LIST_ITEM
{
tagMATRIX_LIST_ITEM* m_pPrevItem;
tagMATRIX_LIST_ITEM* m_pNextItem;
LPMATRIX m_pMatrix;
} MATRIX_LIST_ITEM, FAR *LPMATRIX_LIST_ITEM;
struct MATRIX_LIST
{
int m_nItemCount;
LPMATRIX_LIST_ITEM m_pHeadItem;
LPMATRIX_LIST_ITEM m_pTailItem;
};
и к этому правда нужно добавить функции работы со списком, типа AddTail/AddHead, RemoveTail/RemoveHead, GetAt/SetAt, RemoveAll, GetCount и т.д.
Код:
LPMATRIX_LIST_ITEM AddHead(MATRIX_LIST* list, LPMATRIX matrix)
{
list->m_nItemCount++;
LPMATRIX_LIST_ITEM new_item = new MATRIX_LIST;
new_item->m_pPrevItem = NULL;
new_item->m_pNextItem = list->m_pHeadItem;
new_item->m_pMatrix = matrix;
list->m_pHeadItem->m_pPrevItem = new_item;
list->m_pHeadItem = new_item;
return new_item;
}
bool RemoveHead(MATRIX_LIST* list)
{
if (!list->m_nItemCount)
return false;
list->m_nItemCount--;
LPMATRIX_LIST_ITEM old_item = list->m_pHeadItem;
list->m_pHeadItem = old_item->m_pNextItem;
if (list->m_pHeadItem)
list->m_pHeadItem->m_pPrevItem = NULL;
delete old_item;
return true;
}
int GetCount(MATRIX_LIST* list)
{
return list->m_nItemCount;
}
и т.д.