2 / 2 / 0
Регистрация: 16.07.2010
Сообщений: 55
1

Описать массив Plane размерности 10

17.11.2010, 12:57. Показов 1276. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую. Имеется небольшой вопрос по Си.
Нужно описать две структуры: Point (содержит три double-переменные: X, Y и Z) и Plane (содержит три переменные Point).
После чего нужно описать массив Plane размерности 10, к примеру.

Делаю так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Point
{
    double X;
    double Y;
    double Z;
};
 
struct Plane
{
    Point* points[3];
};
 
struct Plane* Planes[10];
 
// ...
 
Planes[0] = (Plane*) malloc(sizeof(Plane));
Но лезет туева хуча ошибок, вплоть до "'Plane' undeclared". Как записать правильно? Нужен массив указателей на структуры Plane, а структура Plane собственно должна содержать массив указателей на структуру Point.

===

На Си особо никогда не кодил (только C++), сча появилась необходимость, а многого не знаю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2010, 12:57
Ответы с готовыми решениями:

Описать структуру с именем Plane
здраствуйте у меня усть проблемка с стректурами у меня усть структура содержащая информацию о трех...

Дан массив Х размерности n, сформировать массив Y той же размерности
Дан массив Х размерности n.Сформировать массив Y той же размерности,элементы которого вычисляются...

Описать методы для работы с матрицей размерности MxN
Помогите пожалуйста Описать методы для работы с матрицей размерности MxN. Размерность не...

Описать методы для работы с матрицей размерности MxN
Описать методы для работы с матрицей размерности MxN. Размерность не превосходит10x10. Первый метод...

15
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.11.2010, 13:00 2
C
1
(struct Plane *)
C
1
sizeof(struct Plane)
1
2 / 2 / 0
Регистрация: 16.07.2010
Сообщений: 55
17.11.2010, 13:11  [ТС] 3
Дописал, но ругани все-равно много.

Где ругаеццо (компилю MinGW кстати, забыл совсем сказать):
Строка 10 (в приведенном мною куске): syntax error before "Point"
Строка 10: warning: no semicolon at end of struct or union
Строка 17: error: invalid application of `sizeof' to incomplete type `Plane' (уже после дописанного struct).
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.11.2010, 13:14 4
в 6 и 11 строке ; убрать
0
2 / 2 / 0
Регистрация: 16.07.2010
Сообщений: 55
17.11.2010, 13:18  [ТС] 5
Ничего не изменилось
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.11.2010, 13:25 6
C
1
struct Point
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.11.2010, 13:30 7
в си надо перед типом добавлять struct

C
1
2
3
4
struct Plane
{
        struct Point* points[3];
};
либо пользоваться typedef

C
1
2
3
4
5
6
typedef struct _Point
{
        double X;
        double Y;
        double Z;
} Point;
это вам не плюсы
собственно это особенность того как си понимает типы
1
2 / 2 / 0
Регистрация: 16.07.2010
Сообщений: 55
17.11.2010, 13:33  [ТС] 8
Цитата Сообщение от accept Посмотреть сообщение
C
1
struct Point
В
C
1
2
3
4
struct Plane
{
    struct Point points[3];
};
?
Откомпилило вроде, спасибо

Без ";" кстати пишет, что "two or more data types in declaration of 'Planes'".

Далее вопрос: правильным будет обращение Planes[0].points[0].X, при условии выделения памяти для Planes[0]? Там ее вообще нужно выделять?
Пытаюсь считать туда значение из стандартного потока ввода как scanf("%fl", &(Planes[i].points[0].X)); Материццо "error: request for member `points' in something not a structure or union".

===

Alex_x_x, спасиб за пояснение Уже да, понял, что так просто из C++ в C не прийти
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.11.2010, 13:36 9
Цитата Сообщение от Warship
Без ";" кстати пишет, что "two or more data types in declaration of 'Planes'".
не надо там ;
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.11.2010, 13:37 10
Planes массив из 10 указателей
Planes[0] можно делать, а вот Planes[0].points[0] без выделения памяти уже нельзя
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.11.2010, 13:45 11
C
1
2
3
struct Plane {
    struct Point *points[3];
}
по условию там массив указателей на точки

Добавлено через 2 минуты
C
1
scanf("%fl", &(Planes[i].points[0].X));
C
1
scanf("%lf", &Planes[i]->points[0]->X);
Добавлено через 4 минуты
Цитата Сообщение от accept Посмотреть сообщение
не надо там ;
а, точно, показалось мне
объявление структуры считается оператором, а операторы завершаются ;
0
2 / 2 / 0
Регистрация: 16.07.2010
Сообщений: 55
17.11.2010, 13:56  [ТС] 12
Всем огромное спасибо
Теперь оно компилится без проблем совершенно.

Но, есть еще одна непонятнка (надеюсь, что уже последняя): оно не некорректно как-то читает число из стандартного потока. Читаю его как scanf("%lf", &Planes[i]->points[0]->X);, сразу после чего делаю вывод printf("x1: %.1lf\n", Planes[i]->points[0]->X); Вот тут выводит "0.0", что странно, ибо ввожу другое. В чем может быть дело?

Вообще, код моего приложеньица:
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
#include <stdio.h>
 
struct Point
{
    double X;
    double Y;
    double Z;
};
 
struct Plane
{
    struct Point* points[3];
};
 
int iPlanesCount;
struct Plane* Planes[10];
 
// Точка входа в приложение.
int main()
{
    int i;
    
    printf("Enter the number of planes: ");
    scanf("%i", &iPlanesCount);
    printf("\n");
    
    printf("Enter planes points coordinates.\n");
    printf("Format: (x1, y1, z1, x2, y2, z2, x3, y3, z3)\n\n");
    
    for(i = 0; i < iPlanesCount; i++)
    {
        Planes[i] = (struct Plane*) malloc(sizeof(struct Plane));
        Planes[i]->points[0] = (struct Point*) malloc(sizeof(struct Point));
        Planes[i]->points[1] = (struct Point*) malloc(sizeof(struct Point));
        Planes[i]->points[2] = (struct Point*) malloc(sizeof(struct Point));
        
        printf("Plane %i:", i);
        scanf("%fl", &Planes[i]->points[0]->X);
        printf("x1: %.1lf\n", Planes[i]->points[0]->X);
    }
    
    printf("\n");
    
    system("PAUSE");
    
    return 0;
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.11.2010, 14:00 13
%lf и только для scanf
для printf используется %f как для float, так и для double
0
2 / 2 / 0
Регистрация: 16.07.2010
Сообщений: 55
17.11.2010, 14:11  [ТС] 14
Убрал, но ничего не изменилось.
1
Заблокирован
17.11.2010, 14:13 15
по точнее
0
2 / 2 / 0
Регистрация: 16.07.2010
Сообщений: 55
17.11.2010, 14:52  [ТС] 16
Если точнее:
После запуска приложени появляется запрос на ввод количества плоскостей (Enter the number of planes). Вводим 5, к примеру.
Видим надписи, побуждающие ввести координаты точек:
Enter planes points coordinates.
Format: (x1, y1, z1, x2, y2, z2, x3, y3, z3)

Ну и появляется запрос на ввод точек первой плоскости (там одна сча для теста, читается как scanf("%fl", &Planes[i]->points[0]->X)). Вводим к примеру 5.4. После ввода, как видно по коду, идет запись этого числа в компоненту X первой точки первой плоскости А далее - вывод этой компоненты (printf("x1: %f\n", Planes[i]->points[0]->X)). Выводит как 0.000000, в этом и проблема.

Добавлено через 32 минуты
Затупил я там в общем и перепутал символы в строке типов параметров scanf (%fl написал). Переработал уже сегодня, в общем.

Всем огромное спасибо за пояснения по структурам
0
17.11.2010, 14:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2010, 14:52
Помогаю со студенческими работами здесь

Описать методы для работы с матрицей размерности MxN
Доброго времени суток, товарищи-программисты. Возникла проблема с задачей. Описать методы для...

Описать методы для работы с матрицей размерности MxN
Описать методы для работы с матрицей размерности MxN. Размерность не превосходит10x10. Первый метод...

Описать методы для работы с матрицей размерности MxN
Размерность не превосходит 10x10. Первый метод — для формирования элементов матрицы случайным...

Описать методы для работы с матрицей размерности MxN
Описать методы для работы с матрицей размерности MxN. Размерность не превосходит 10x10. Первый...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru