Не получается динамически увеличить массив структур "Отрезок" "Прямоугольник" - C (СИ)
Формулировка задачи:
Делая следующее задание наткунлся на проблему
Код выглядит так:
Ошибка как я понял происходит при попытке увеличит массив в этой функции:
Определить структуры: отрезок (задан длиной) и прямоугольник (задан 2-мя отрезками). Реализовать функции:
1. для инициализации динамического прямоугольника по двум отрезкам.
2. search() - поиск прямоугольников подобных заданному в статическом массиве прямоугольников (результат поместить в динамический массив прямоугольников).
3. Печать информации о прямоугольнике
Создать два динамических прямоугольника (данные вводить с клавиатуры), определить прямоугольник с большей площадью. Определить статический массив прямоугольников, используя датчик случайных чисел и функцию. Найти все прямоугольники, подобные первому в статическом массиве.
Листинг программы
- // bdz1.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <stdio.h>
- #include <time.h>
- #include <windows.h>
- #include <clocale>
- #include <cmath>
- #define LEN 10
- #define LLL 10
- struct line
- {
- int L;
- };
- struct rect
- {
- struct line l1;
- struct line l2;
- };
- struct rect T[1];
- struct rect* init()
- {
- const int leng = LLL;
- static struct rect R[leng];
- for(int i = 0; i < leng; i++)
- {
- R[i].l1.L=(int)(rand()%LEN);
- R[i].l2.L=(int)(rand()%LEN);
- }
- return(R);
- }
- void printR(struct rect R[], int l = LLL)
- {
- for(int i = 0; i < l; i++)
- printf("Прямоугольник %i\t%ix%i\n",i,R[i].l1.L,R[i].l2.L);
- }
- void search(struct rect R[], struct rect S, struct rect *T, int &k)//sdgfdgfgfgh
- {
- for(int i = 0; i < LLL; i++)
- {
- if((R[i].l1.L/R[i].l2.L == S.l1.L/S.l2.L) ||
- (R[i].l2.L/R[i].l1.L == S.l2.L/S.l1.L))
- {
- T = (struct rect*) realloc (T, (k+1) * sizeof(struct rect));
- T[k] = R[i];
- k++;
- }
- }
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- setlocale(0,"Russian");
- srand (time(0));
- struct rect R1;
- struct rect R2;
- printf("Первый прямоугольник: введите длинну 1-ой: ");
- scanf("%d", &R1.l1.L);
- printf("Первый прямоугольник: введите длинну 2-ой: ");
- scanf("%d", &R1.l2.L);
- printf("Второй прямоугольник: введите длинну 1-ой: ");
- scanf("%d", &R2.l1.L);
- printf("Второй прямоугольник: введите длинну 2-ой: ");
- scanf("%d", &R2.l2.L);
- if(R1.l1.L * R1.l2.L > R2.l1.L * R2.l2.L)
- printf("\nПервый прямоугольник больше\n\n");
- else if(R1.l1.L * R1.l2.L < R2.l1.L * R2.l2.L)
- printf("\nВторой прямоугольник больше\n\n");
- else
- printf("\nПрямоугольники равны\n\n");
- static struct rect *RR = init();
- printR(RR);
- int k = 0;
- search(RR,R1,T,k);
- printR(T, k);
- return 0;
- }
Листинг программы
- struct line
- {
- int L;
- };
- struct rect
- {
- struct line l1;
- struct line l2;
- };
- struct rect T[1];
- ...
- void search(struct rect R[], struct rect S, struct rect *T, int &k)//sdgfdgfgfgh
- {
- for(int i = 0; i < LLL; i++)
- {
- if((R[i].l1.L/R[i].l2.L == S.l1.L/S.l2.L) ||
- (R[i].l2.L/R[i].l1.L == S.l2.L/S.l1.L))
- {
- T = (struct rect*) realloc (T, (k+1) * sizeof(struct rect));
- T[k] = R[i];
- k++;
- }
- }
- }
Решение задачи: «Не получается динамически увеличить массив структур "Отрезок" "Прямоугольник"»
textual
Листинг программы
- struct rect* init()
- {
- const int leng = LLL;
- static struct rect* R = malloc(sizeof(struct rect) * leng);
- for(int i = 0; i < leng; i++)
- {
- R[i].l1.L=(int)(rand()%LEN);
- R[i].l2.L=(int)(rand()%LEN);
- }
- return(R);
- }
Объяснение кода листинга программы
В данном коде выполняется инициализация массива структур Отрезок
Прямоугольник
динамически, то есть во время выполнения программы.
- Объявляется константа
leng
(вместо неё может быть любое другое имя, но в данном случае используется LLL), которая определяет размер массива. - Выделяется память под массив структур
Отрезок
Прямоугольник
с помощью функции malloc (вместо неё можно использовать calloc, тогда все элементы массива будут инициализированы нулями). - В цикле происходит заполнение массива структур
Отрезок
Прямоугольник
. Для этого используется генератор случайных чисел, который выдаёт случайное число от 0 до LEN (включительно). - Функция возвращает указатель на первый элемент массива.
Пользователь может вызвать функцию init для инициализации массива структур
Отрезок
Прямоугольник
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д