C: Таблица-структура данных электронной таблицы

#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 и, надеюсь, это сработает.