#c #data-structures #structure #spreadsheet #typedef
#c #структуры данных #структура #электронная таблица #typedef
Вопрос:
Я хотел бы создать динамическую структуру данных, которая может читать и хранить простую электронную таблицу. Я создал одну структуру, в которой хранится ячейка, структура для одной строки, в которой я храню указатель на каждую ячейку в этой строке, и структура для всей таблицы с указателями на строки.
typedef struct cell{
int ceLen;
char *cont;
}*Cell;
typedef struct {
int clsinRow;
Cell *row;
}Row;
typedef struct {
int rwsinTab;
Row *tab;
}Table;
Я написал простой код для проверки структуры строк, но, похоже, он не работает.
char *str1[5] = {"r1c1", "r1c2", "r1c3", "r1c4", "r1c5"}; // Cells content for test purpose only
Row *r;
r->clsinRow = 5; //Num of cells in row
for(int i=0; i<r->clsinRow; i ){
Cell c = (Cell) malloc(sizeof(struct cell)); //Allocate the space for one cell
strcpy(c->cont, str1[i]);
r->row[i] = c;
}
for(int i=0; i<r->clsinRow; i ){
printf("%st", r->row[i]->cont);
}
Я не уверен, была ли эта структура реализована должным образом, и если мне лучше использовать какую-либо другую структуру данных для этой проблемы (например, связанный список или хэш-таблицу).
Спасибо за любую помощь.
Комментарии:
1. Из любопытства
clsinRow
, что это за соглашение об именовании? Почему бы и нетrow_count
? что этоclsin
означает?typedef *Cell
— указатели typedef — это (почти) всегда плохая идея, не используйте ее. Это сбивает с толку, как и в вашем случае —Cell *row;
это двойной указатель.Row *r; r->
— недействителен —r
неинициализирован.
Ответ №1:
Сначала вы не выделяете никакого места для переменной строки. Вы должны выделить память, так же, как вы делаете с ячейкой.
Но, даже если вы это исправите, с вашим strcpy есть проблема.В этот момент c-> cont , который является указателем символа, равен НУЛЮ. Итак, strcpy с трудом справляется со строкой, и она возвращает segfault.
Я бы посоветовал вам создать другую функцию, в которой вы выделяете все, что нужно выделить, и возвращаете указатель на ячейку (ячейку). Затем вы даете этот указатель на переменную c и, надеюсь, это сработает.