Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 16

Без использования typedef все работает. При добавлении typedef — более 100 ошибок

23.04.2014, 22:01. Показов 3016. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа, с описанием структуры и функций, работающими с ней. Без использования typedef все работает. При добавлении typedef - более 100 ошибок. Первая из которых: "error C2365: Rectangle: переопределение; предыдущим определением было "функция"".
Вот неработающий код. Что делать?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <math.h>
 
typedef struct Rectangle_t {
    float x1; /* абсцисса- */
    float x2; /* абсцисса+ */
    float y1; /* ордината- */
    float y2; /* ордината+ */
} Rectangle;
 
float Perimeter(Rectangle R) { /*Периметр*/
    float P;
    P=fabs(2*(R.x1-R.x2))+fabs(2*(R.y1-R.y2));
    return P;
}
 
Rectangle Shell(Rectangle R1, Rectangle R2) { /*Прямоугольная оболочка*/
    Rectangle Shell;
    Shell.x1=min(R1.x1, R2.x1);
    Shell.x2=max(R1.x2, R2.x2);
    Shell.y1=min(R1.y1, R2.y1);
    Shell.y2=max(R1.y2, R2.y2);
    return Shell;
}
 
Rectangle Mid(Rectangle R1, Rectangle R2) { /* "Средний" прямоугольник*/
    Rectangle Mid;
    Mid.x1=0.5*(R1.x1 + R2.x1);
    Mid.x2=0.5*(R1.x2 + R2.x2);
    Mid.y1=0.5*(R1.y1 + R2.y1);
    Mid.y2=0.5*(R1.y2 + R2.y2);
    return Mid;
}
 
int Own(float X, float Y, Rectangle R) { /*Принадлежность точки прямоугольнику*/
    return(X>=R.x1 && X<=R.x2 && Y>=R.y1 && Y<=R.y2)?1:0;
}
 
int Inclusion(Rectangle R1, Rectangle R2) { /*Включение 2 прямоугольника в 1 */
    return(R1.x1<=R2.x1 && R1.x2>=R2.x2 && R1.y1<=R2.y1 && R1.y2>=R2.y2)?1:0;
}
 
int Similarity(Rectangle R1, Rectangle R2) { /*Подобие 1 прямоугольника 2 */
    float A, B;
    A=(fabs(R1.x1-R1.x2))/(fabs(R2.x1-R2.x2));
    B=(fabs(R1.y1-R1.y2))/(fabs(R2.y1-R2.y2));
    return(A==B)?1:0;
}
 
void main() {
 
    SetConsoleOutputCP(1251);
    Rectangle *R; /*Прямоугольники, заданные пользователем*/
    Rectangle F; 
    int i, j, k, /*счетчики*/ N /*размерность массива*/, A=0, q=0;
    float maxP=0;
 
    Rectangle Square; /*Построение квадрата*/
    Square.x1=0;
    Square.x2=1;
    Square.y1=0;
    Square.y2=1;
 
    printf("Задайте количество прямоугольников (не менее 2): \n"); /*Определение длины массива*/
    scanf("%i", &N);
 
    if (N<2) /*Проверка корректности*/
    {
        N=2;
        printf("\nКоличество автоматически увеличено до 2.\n\n");
    }
 
    R=(Rectangle*)malloc(N*sizeof(Rectangle)); /*Выделение памяти*/
 
    error: for (i=0;i<N;i++) /*Построение прямоугольников*/
    {
        printf("Задайте габариты %i прямоугольника (-x, +x, -y, +y):\n", i+1);
        scanf("%f%f%f%f", &R[i].x1,&R[i].x2,&R[i].y1,&R[i].y2);
        if(R[i].x1>=R[i].x2 || R[i].y1>=R[i].y2) /*Проверка корректности*/
        {
            printf("Введенные данные некорректны. Попробуйте еще раз.\n");
            goto error;
        }
    }
 
    for (i=0;i<N;i++) /*Часть 1)*/
    {
        for (j=0;j<N;j++) 
        {
            if(i==j) /*Исключение сравнения прямоугольника с самим собой*/
                j++;
            if(j==N)
                continue;
            A=Inclusion(R[i],R[j]); /*Проверка включения прямоугольника j в прямоугольник i*/
            if (A==1) /*Если да, то посчитать периметр и сравнить его с максимальным*/
            {
                A=Perimeter(R[i]);
                if (maxP<A)
                {
                    maxP=A;
                    q=i; /*Запомнить номер прямоугольника*/
                }
            }
            else /*Если нет, то проверить принадлежность вершин*/
            {
                A=0;
                A+=Own(R[j].x1, R[j].y1, R[i]);
                A+=Own(R[j].x1, R[j].y2, R[i]);
                A+=Own(R[j].x2, R[j].y1, R[i]);
                A+=Own(R[j].x2, R[j].y2, R[i]);
                if(A==2) /*Если содержит 2 вершины, то посчитать периметр и сравнить его с максимальным*/
                {
                    A=Perimeter(R[i]);
                    if (maxP<A)
                    {
                        maxP=A;
                        q=i; /*Запомнить номер прямоугольника*/
                    }
                }
 
            }
                 
        }
    }
 
 
    if(maxP==0)
        printf("1) Среди заданных прямоугольников нет такого, который бы содержал 2 и более вершин из набора\n");
    if(maxP!=0)
        printf("1) Прямоугольник под номером %i из набора имеет 2 и более вершин из набора. Его периметр = %.2f\n", q+1, maxP);
 
    i=-1; /*Это нужно для корректной работы цикла*/
    q=0;
 
    printf("2) Прямоугольные оболочки прямоугольников, чей 'средний' прямоугольник равен квадрату:\n");
 
    for (k=0;k<N;k++) /*Часть 2)*/
    {
        for (j=0;j<N;j++) 
        {
            while(j<=k && j<N)
            j++;
            if(j==N)
            continue;
            i++;
            F=Mid(R[k], R[j]); /*Построение "среднего" прямоугольника*/
            A=Similarity(F, Square); /*Проверка его подобия квадрату*/
            if(A==1)
            {
                F=Shell(R[k],R[j]); /*Построение прямоугольной оболочки, если уловие выполнено*/
                printf("Прямоугольная оболочка для %i и %i прямоугольников (-x, +x, -y, +y):\n(%.2f, %.2f, %.2f, %.2f)\n", j+1, k+1, F.x1, F.x2, F.y1, F.y2);
                q++;
            }
        }
    }
 
    if(q==0)
        printf("Таковых нет.\n");
 
    free(R);
 
    getchar();getchar();
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.04.2014, 22:01
Ответы с готовыми решениями:

Не работает typedef
Приветствую. Предполагаю что ошибка дурадская, но найти ее не могу #define MAX_SIZE_NAME 30 #define NUMBER_OF_MARK 4 typedef...

Typedef void F(); typedef для типа функции через идентификатор
Здравствуйте цитата из typedef MSDN в интернете мне удалось нарыть только один конкретный пример: class A { typedef void F(); ...

Логика использования typedef
Всем привет! Постоянно в чужих кодах встречаю подобные конструкции: typedef enum _eOAuthHttpRequestType { eOAuthHttpInvalid =...

6
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
23.04.2014, 22:19
а зачем тебе нужен этот typedef? я всегда без него делаю и все норм... по моему это какая то бесполезная фигня
0
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 16
23.04.2014, 22:43  [ТС]
Потому что преподаватель сказал, что нужно использовать typedef. Это лабораторная работа.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
23.04.2014, 23:59
Лучший ответ Сообщение было отмечено Regencul как решение

Решение

Цитата Сообщение от GetHelp Посмотреть сообщение
по моему это какая то бесполезная фигня
Это очень даже фигня полезная. Она позволяет определять новые, нужные тебе типы и работать с ними без фигни типа struct ... Впрочем, это дело вкуса и привычек. Но мне странно, почему штуку типа FILE я пишу без всякой приблуды, а MYTYPE должен еще сопровождать struct-ом.
Плюс, уметь пользоваться typedef совершенно необходимо, хотя бы, чтоб понимать чужие программы.
Цитата Сообщение от Regencul Посмотреть сообщение
Что делать?
Видимо, твой Rectangle уже где-то определен. И чтоб не возиться с всякими namespace, назови его Rectan или MyRect, и будет счастие тебе.
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
24.04.2014, 00:09
Цитата Сообщение от Regencul Посмотреть сообщение
Первая из которых: "error C2365: Rectangle: переопределение; предыдущим определением было "функция"".
а почему до конца не приводишь ошибку????
вот она
>c:\users\noutdns\documents\visual studio 2008\projects\testbit\testbit\testbit.cp p(11) : error C2365: Rectangle: переопределение; предыдущим определением было "функция"
1> c:\program files\microsoft sdks\windows\v6.0a\include\wingdi.h(3667 ): см. объявление 'Rectangle'
ясно говорится что в файле wingdi.h уже определена функция Rectangle
__gdi_entry WINGDIAPI BOOL WINAPI Rectangle(__in HDC hdc, __in int left, __in int top, __in int right, __in int bottom);
или отключи <windows.h>который тянет за собой wingdi.h
или воспользуйся советом Байт, и переобзови свой Rectangle например на MyRectangle
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.04.2014, 00:44
Цитата Сообщение от ValeryS Посмотреть сообщение
и переобзови
О, это великое искусство, давать сущностям правильные имена! Особенно, когда твоими сущностями пользуются миллионы. Попав в мир Borland, я был подавлен тем, что имена всех классов, что в примерах, что встроенных, начинаются на букву 'T'. И сколько времени, сил и ума потребовалось на отделение этих TWindow от TMyWindow! А вот Qt сразу взял меня в плен. Все, что ихнее - начинается на 'Q'. Это так умно и удобно! Видно, что делом занимались неглупые ребяты.
О том, какие ребяты занимались Виндовозом, я думаю, говорить не стоит...
1
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 16
24.04.2014, 11:57  [ТС]
Дело в том, что в задании написано, что нужно описать тип именно с таким именем... Потому мысли "переименовать" не появилось. Спасибо! Теперь все работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2014, 11:57
Помогаю со студенческими работами здесь

Как работает typedef?
Не совсем ясно как работает typedef. Я правильно понял, что Node идет как синоним для struct node, потом List идет как синоним для Node * ...

Как работает оператор typedef
как работает оператор typedef если есть у кого сам код то пришлите,интересно:)

Не работает typedef с шаблонным классом
доброго времени суток форумчане есть функция с консольной менюшкой, в нее приходит аргумент, определяющий который тип использовать ...

Все проекты перестали компилироваться, ошибка: typedef UINT_PTR KSPIN_LOCK
Работаю в VC++6.0. Вчера все было нормально, а сегодня ситуация: при компиляции любого проекта компилятор находит ошибку в файле winnt.h,...

Ошибка при компиляции Dev C++ 'typedef void* pthread_t'
Здравствуйте. Нужно установить программу D-ITG через Dev C++. Установил версию 5.10, открываю проект, запускаю компилятор и выдает ошибку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru