Как уже упоминалось в другом постере, есть опечатка, но даже после исправления она не будет компилироваться из-за определения matrix.MSpace.
Давайте начнем с makeRIDMatrix ().Вы объявили автоматическую (стековую) переменную типа «матрица».В конце функции вы возвращаете этот объект.Хотя это допустимо, это не рекомендуется.Если структура большая, вы будете копировать много данных без необходимости.Лучше передать указатель на матрицу в makeRIDMatrix () и сделать makeRIDMatrix () заполнить содержимое.
Тест во внутреннем цикле против i, но должен быть против j.
Далее давайте посмотрим на определение «матрица».Определение «MSpace» является беспорядком и даже не скомпилируется.Даже если это произойдет, поскольку вы не определили длину строки, компилятор не сможет рассчитать смещение для любого данного элемента в массиве.Вам нужен двумерный массив без указания длины строки, но вы не можете сделать это в C. Вы можете сделать это на других языках, но не на C.
Я мог бы отметить гораздо больше, но яупустил бы реальную точку.Суть в следующем:
C - это не Java.
(Это также не один из интерпретируемых языков, таких как JavaScript, PHP, Python, Ruby и т. Д.)
Вы не получаете динамически расширяемые массивы;вы не получаете автоматическое распределение памяти;вы не получаете сборщик мусора из не привязанной памяти.
Вам нужно что-то вроде этого:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct {
char* name;
int MID;
unsigned int MRows;
unsigned int MCols;
long *MSpace;
} matrix;
void makeRIDMatrix(matrix *pmx, char* name, int MID,
unsigned int MRows, unsigned int MCols) {
int i, j;
long *MSpace = malloc(sizeof(*MSpace)*MRows*MCols);
if (MSpace == NULL) {
return;
}
pmx->name = name;
pmx->MID = MID;
pmx->MRows = MRows;
pmx->MCols = MCols;
pmx->MSpace = MSpace;
srandom((unsigned int)time(NULL));
for (i=0; i<MRows; i++) {
for (j=0; i<MCols; j++) {
long int r = random() % 101L;
*(MSpace++) = r;
}
}
}
inline long * item_addr(const matrix *pmx,
unsigned int row, unsigned int col) {
if (pmx == NULL || pmx->MSpace == NULL
|| row >= pmx->MRows || col >= pmx->MCols) {
return NULL;
}
return &(pmx->MSpace[row * pmx->MCols + col]);
}
long get_item(const matrix *pmx, unsigned int row, unsigned int col) {
long *addr = item_addr(pmx, row, col);
return addr == NULL ? 0L : *addr;
}
void set_item(matrix *pmx,
unsigned int row, unsigned int col,
long val) {
long *addr = item_addr(pmx, row, col);
if (addr != NULL) {
*addr = val;
}
}
int main(void) {
matrix m;
makeRIDMatrix(&m, "test", 1, 10, 10);
return 0;
}
Обратите внимание на несколько вещей здесь.Во-первых, для эффективности я заполняю массив, как если бы он был одномерным.Все последующие операции получения / набора элементов массива должны выполняться через функции получения / установки для безопасности.
Во-вторых, скрытая неприятность: makeRIDMatrix () использовала malloc () для выделения памяти - но она собираетсябыть работой вызывающей функции (или ее преемников) только для освобождения () выделенного указателя, когда он закончится.
В-третьих, я изменил переменные row / cols на unsigned int - нет смысла определятьмассив с отрицательными индексами!
В-четвертых: небольшая проверка ошибок.Например, makeRIDMatrix () не знает и не заботится о том, являются ли значения параметров разумными (например, указатель матрицы не проверяется на NULLness).Это упражнение для студента.
В-пятых, я исправил использование случайных чисел - по моде.Еще одно упражнение для студента: почему это так, как я сделал это не хорошая практика
1029 * Тем не менее - все это спорно?.Вам нужно найти себе хороший учебник по Си или хороший онлайн-курс и поработать с примерами.Код, который вы здесь привели, показывает, что вы пробиваете вес выше своего веса, и вам нужно развить еще несколько С-мышц, прежде чем войти в это кольцо!