Не получается динамически увеличить массив структур "Отрезок" "Прямоугольник" - 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 для инициализации массива структур
ОтрезокПрямоугольник.