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

Объяснение кода листинга программы

В данном коде выполняется инициализация массива структур Отрезок Прямоугольник динамически, то есть во время выполнения программы.

  1. Объявляется константа leng (вместо неё может быть любое другое имя, но в данном случае используется LLL), которая определяет размер массива.
  2. Выделяется память под массив структур Отрезок Прямоугольник с помощью функции malloc (вместо неё можно использовать calloc, тогда все элементы массива будут инициализированы нулями).
  3. В цикле происходит заполнение массива структур Отрезок Прямоугольник. Для этого используется генератор случайных чисел, который выдаёт случайное число от 0 до LEN (включительно).
  4. Функция возвращает указатель на первый элемент массива. Пользователь может вызвать функцию init для инициализации массива структур Отрезок Прямоугольник.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.455 из 5
Похожие ответы