Мне было поручено составить действующую программу выборов учащихся для защиты нашей школы (и, вероятно, для фактического использования ...).Однако я уже некоторое время сталкиваюсь с проблемой.
Моя цель - создать гибкий массив структур, поскольку я не могу использовать произвольное ограничение, также массивы имеют ограничение в 99 элементов дляя (* см. конец поста).Я использовал realloc (), но это дает abort () для недопустимого старого размера.НО, я попытался протестировать динамический массив структуры в другой программе, и он работал безупречно.Я не могу понять, что вызывает сбой другого.
Моя предвыборная программа (т. Е. Сбойная):
ПРИМЕЧАНИЕ: функция entr_cmd просто перемещает курсор вниз.экрана и печатает текст, а STREQL просто видит, совпадают ли две строки, просто макрос быстрого вызова для strcmp
struct candidate {
long lrn;
char *name;
int grade;
char *section;
char *party;
char *position;
}
**candidates,
// :: Temporary Array for storing all the candidates in the position to be voted in
**candidates_cur;
int can_c = 0;
[...]
int main() {
[...]
candidates = malloc(2 * sizeof(struct candidate *));
[...]
if(STREQL(command, "c")) {
struct candidate *c;
if(can_c > 1) {
struct candidate **tmp;
tmp = (struct candidate**) realloc(candidates, (1 + can_c) * sizeof(struct candidate *));
if(tmp != NULL) candidates = tmp;
}
candidates[can_c - 1] = malloc(sizeof(struct candidate *));
c = candidates[can_c - 1];
entr_cmd("Candidate's Name: ");
// :: This recieves the input but replaced for testing
c->name = malloc(4 * sizeof(char));
strcpy(c->name, "XXX");
can_c++;
}
[...]
Тестовая программа, которая работает без нареканий:
это генерирует случайную строку чисел для членов тестовой структуры
struct test {
char *name;
char *another;
int test;
} **arr;
int main() {
int r1;
arr = malloc(2 * sizeof(struct test *));
r1 = rand() % 45;
for(int i = 0; i < r1; i++) {
int r2 = rand() % 22;
if(i > 2) {
struct test **data;
data = (struct test**) realloc(arr, (2 + i) * sizeof(struct test*));
if(data != NULL) {
arr = data;
}
}
arr[i] = malloc(sizeof(struct test *));
struct test *t = arr[i];
t->name = malloc(r2 * sizeof(char));
t->another = malloc(r2 * sizeof(char));
t->test = r2;
for(int ii = 0; ii < r2; ii++) {
t->name[ii] = (char) (rand() % 9) + '0';
t->another[ii] = (char) (rand() % 9) + '0';
}
printf("====[%u]====\n%s\n%s\n%u\n", i, arr[i] -> name, arr[i] -> another, arr[i] -> test);
}
for(int i = 0; i < r1; i++) {
free(arr[i]->name);
free(arr[i]->another);
free(arr[i]);
}
free(arr);
getch();
}
Любая помощь будет принята с благодарностью, так как наш учитель возложил на меня большие надежды и сказал, что это будет легко просто но это доказывает обратное.
Спасибо за чтение и хорошего дня !!!
дополнительные бессмысленные: я 'Я в курсе, где мы регулярно используем TurboC ++ для программирования, но это довольно сложно сделать там, поэтому я вместо этого использовал C99 с моей настройкой neovim, чтобы я мог иметь быструю навигацию, а также большинство вещей в C99 могут работать в TurboC ++.Другими словами, я не могу по-настоящему работать с (недавним стандартом) C ++, если это так, я думаю, я бы, вероятно, сделал бы это легче