Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

структуры

Помогите начинающему программисту!

Проблема заключается в следующем: есть файл prepr.c -- предназначеный для получения
исходных данных. В prepr.h объявляю структуры:

...............................................
struct ele
{
int i, j, k;
int si, sj, sk;
int material;
}elem[MAX_NODES*2] ;

struct mat{
int NKxx, NKyy;
double Kxx[MAX_TABL], Kyy[MAX_TABL];
double TKxx[MAX_TABL], TKyy[MAX_TABL];
int NDENS, NC;
double DENS[MAX_TABL], C[MAX_TABL];
double TDENS[MAX_TABL], TC[MAX_TABL];
int NQ;
double Q[MAX_TABL];
double TQ[MAX_TABL];
double U, Te, te;
}mater[MAX_MATERIALS];
.............................................

Подключаю файл prepr.h к prepr.c и объявляю 2 экземпляра структуры:

............................
struct ele elem[MAX_NODES*2];
struct sid side[MAX_NODES*3];
............................

в которые помещаются данные. Но происходит вот какая непонятная для меня вещь:
адреса &mater[num].Kxx[0] и &elem[602].material совпадают! т.е. поместив данные
в elem[602].material я перазапишу mater[num].Kxx[0] и наоборот.
Кроме того не только у этих двух членов одинаковые адреса, а и у других элементов
т.к. изменение значения для одного поля одной структуры приводит к изменению
значения поля уже другой структуры.

В чем ошибка?

Ответить   Mon, 17 Apr 2006 08:52:42 +0300 (#538866)

 

Ответы:

Я вообще-то тоже начинающий сишник и поэтому деброво разбираю
синтаксис. Но имхо у тебя наезжает одно на другое. Особенно, если у
тебя #define MAX_NODES 301, то по-моему крайний элемент elem[601], а
не elem[602]

Номер выпуска : 5256
Возраст листа : 940 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/538896
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Tue, 18 Apr 2006 01:01:16 +0500 (#538896)

 

Здравствуйте, Max.

Вы писали 17 апреля 2006 г., 9:52:42:

Здесь ты уже объявляешь elem - массив структур ele, размером (MAX_NODES * 2)

Здесь аналогичная ситуация..

вообще удивлен что у тебя это компилируется - если все так как ты написал,
то должен быть конфликт имен (если все это объявляется в глобальной области видимости)
если же
struct ele elem[MAX_NODES*2]; - объявляется в стеке, то это объявление перекрывает
объявление сделанное
в заголовочном файле

Возможно они были по очереди размещены в стеке, и по стечению обстоятельств mater[num].Kxx[0]
оказался размещен
по тому же адресу, где когда-то был размещен elem[602].material. Наверное тебе
стоит разобраться что и где ты объявлял,
и в какой области видимости. Тогда эти чудеса сами исчезнут..

Ответить   Yuri Vasiyarov Mon, 17 Apr 2006 23:32:58 +0400 (#538908)

 

Инициализировал структуры:

struct ele elem[MAX_NODES*2] = {0};
struct mat mater[MAX_MATERIALS] = {0};

и проблема исчезла!

Ответить   Fri, 28 Apr 2006 11:55:26 +0300 (#543273)