Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка с экспортом структуры / 25 сообщений из 28, страница 1 из 2
08.11.2006, 08:13
    #34110786
Papadopulos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Такая ситуация: в CBuilder 6 делаю структуру и объявляю ее в одном модуле, из другого пытаюсь обратиться к ней, а компилятор ругается :((. Ошибка ламерская но ничего не могу придумать.

вот код

Код: plaintext
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.
Unit1

struct Struct1 {
MyStruct2 Struct2;
int X;
int Y;
int pas[ 10 ]; 
};
.
.
.
Struct1 s;
typedef  Struct1 arr[ 10 ];
arr a;



Unit2

extern s
.
.
.
s.x =  123 ; // Ошибка E2294
a[ 1 ].x =  123 ; // Ошибка E2062
...
Рейтинг: 0 / 0
08.11.2006, 09:27
    #34110929
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
E2294,E2062 это всё что пишет вам компилятор, никакого более внятного сообщения об ошибке нет ? Не верю.
Описание структуры надо выносить в h-файл, и включать его во все cpp использующие эту структуру.
...
Рейтинг: 0 / 0
08.11.2006, 09:37
    #34110952
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
А регистр символов?
...
Рейтинг: 0 / 0
08.11.2006, 09:47
    #34110992
Ошибка с экспортом структуры
PapadopulosТакая ситуация: в CBuilder 6 делаю структуру и объявляю ее в одном модуле, из другого пытаюсь обратиться к ней, а компилятор ругается :((. Ошибка ламерская но ничего не могу придумать....


Странно как-то вы пишете...
1. Если "s" у Вас обозначает переменную, то формат объявления должен быть такой: extern <тип переменной> <имя переменной> . Например:
Код: plaintext
1.
extern int _fmode;
2. typedef используется для задания синонима пользовательскому типу данных.
В этой связи мне, например, непонятно, что обозначает:
Код: plaintext
1.
typedef  Struct1 arr[ 10 ];
arr a;
Вероятно, Вы хотели написать следующее:
Код: plaintext
1.
typedef  struct Struct1 arr;
arr a[ 10 ];
...
Рейтинг: 0 / 0
08.11.2006, 10:02
    #34111033
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Станислав С
2. typedef используется для задания синонима пользовательскому типу данных.
В этой связи мне, например, непонятно, что обозначает:
Код: plaintext
1.
typedef  Struct1 arr[ 10 ];
arr a;
Вероятно, Вы хотели написать следующее:

тайпдеф вводит новый тип данных. В данном случае - массив структур.

На счет синонима, не совсем верно. Структура, не является полноценным типом данных, значит следующие представления не эквиваленты:
Код: plaintext
1.
2.
3.
4.
5.
struct st1 {
   ...
};

typedef st1 st2;

Использование:
Код: plaintext
1.
2.
struct st1 _st1;
st2 _st2;
...
Рейтинг: 0 / 0
08.11.2006, 10:07
    #34111061
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
AkhСтруктура, не является полноценным типом данных...Почему вы так думаете? И кто же полноценен?
...
Рейтинг: 0 / 0
08.11.2006, 10:14
    #34111080
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Papadopulos
Код: plaintext
1.
2.
s.x =  123 ; // Ошибка E2294
a[ 1 ].x =  123 ; // Ошибка E2062

E2294 Structure required on left side of . or .
Правильно s.X=123;
E2062 Invalid indirection
компилятор не понял, что ты сказал ибо сие бред.
...
Рейтинг: 0 / 0
08.11.2006, 10:37
    #34111166
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
pandrew AkhСтруктура, не является полноценным типом данных...Почему вы так думаете? И кто же полноценен?

Бывают случаи, когда при объявлении переменной типа структуры, перед именем структуры необъодимо ставить struct.
...
Рейтинг: 0 / 0
08.11.2006, 10:42
    #34111184
Papadopulos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
С регистром в программе все правильно.
Хорошо, переделал так как Станислав сказал. Теперь получается вот что:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Unit1

struct Struct1 {
MyStruct2 Struct2;
int X;
int Y;
int pas[ 10 ]; 
};
.
.
.
typedef  struct Struct1 arr;
arr a[ 10 ];



Unit2

extern arr a; // E2141 Declaration syntax error
.


Если объявить просто вот так:

Код: plaintext
1.
2.
3.
4.
5.
extern a; 
.
.
// то получаем
a[ 1 ].X =  123 ; // Ошибка E2062 Invalid indirection   // то бишь использование указателя вместо переменной
...
Рейтинг: 0 / 0
08.11.2006, 10:53
    #34111226
Ошибка с экспортом структуры
PapadopulosС регистром в программе все правильно.
Хорошо, переделал так как Станислав сказал. Теперь получается вот что:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Unit1

struct Struct1 {
MyStruct2 Struct2;
int X;
int Y;
int pas[ 10 ]; 
};
.
.
.
typedef  struct Struct1 arr;
arr a[ 10 ];



Unit2

extern arr a; // E2141 Declaration syntax error
.


Если объявить просто вот так:

Код: plaintext
1.
2.
3.
4.
5.
extern a; 
.
.
// то получаем
a[ 1 ].X =  123 ; // Ошибка E2062 Invalid indirection   // то бишь использование указателя вместо переменной

Да, учиться Вам еще нужно :(
Те объявления (struct{}, typedef), которые Вы сделали, работают только внутри блока Unit1. Unit2 обо всех этих телодвижениях "не в курсе"....
Как Вам уже говорил в данной ветке - вынесите описания в заголовочный файл (например, в Unit1.h) и подключайте этот заголовочный файл во всех модулях, использующих Вашу структуру. Т.е. будем иметь:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Unit1.h
struct Struct1 {
MyStruct2 Struct2;
int X;
int Y;
int pas[ 10 ]; 
};
.
.
.
typedef  struct Struct1 arr;


Unit1.cpp
#include "Unit1.h"
...
arr a[ 10 ];

Unit2
#include "Unit1.h"
extern arr a[ 10 ]; //В этом месте не уверен...
...
.
...
Рейтинг: 0 / 0
08.11.2006, 11:25
    #34111395
Papadopulos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Станислав С
Да, учиться Вам еще нужно :(
Те объявления (struct{}, typedef), которые Вы сделали, работают только внутри блока Unit1. Unit2 обо всех этих телодвижениях "не в курсе"....

С видимостью у меня все в порядке, именно так как вы и предложили, Станислав.
Загвоздка в чем-то другом.

Это объявление не работает.
Код: plaintext
extern arr a[ 10 ]; //В этом месте не уверен...
...
Рейтинг: 0 / 0
08.11.2006, 11:26
    #34111402
Papadopulos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Я понял, я неправильно задал вопрос. Исправляюсь.
В общем мне нужно объявить массив структур и использовать его в разных модулях. а вот как?
...
Рейтинг: 0 / 0
08.11.2006, 11:29
    #34111413
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
PapadopulosЭто объявление не работает.
Код: plaintext
extern arr a[ 10 ]; //В этом месте не уверен...


Обычно екстерны прописывают в заголовочном файле модуля, в котором она сама определена. Хотя, мне кажется, что ошибка в чем-то другом.
...
Рейтинг: 0 / 0
08.11.2006, 12:06
    #34111612
Ошибка с экспортом структуры
PapadopulosЯ понял, я неправильно задал вопрос. Исправляюсь.
В общем мне нужно объявить массив структур и использовать его в разных модулях. а вот как?
Надо работать с указателями.
Код: plaintext
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.
Unit1.h
struct Struct1 {
MyStruct2 Struct2;
int X;
int Y;
int pas[ 10 ]; 
};
.
.
.
typedef  struct Struct1 arr;


Unit1.cpp
#include "Unit1.h"
...
arr *a;
a=new arr[ 10 ];

Unit2
#include "Unit1.h"
...
extern arr *a; 

a[ 1 ].X=...
...
Это проверил на МS VC++ 6. Работает...
...
Рейтинг: 0 / 0
08.11.2006, 12:50
    #34111856
Papadopulos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Станислав, а разве имя созданной структуры не является указателем??
Приведенный вами код в Cbuilder не работает :( , синтаксис С++ видимо несколько различен.
...
Рейтинг: 0 / 0
08.11.2006, 13:07
    #34111977
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Papadopulosа разве имя созданной структуры не является указателем??Имя точно не является указателем.
PapadopulosПриведенный вами код в Cbuilder не работаетчто значит не работает?
Papadopulos синтаксис С++ видимо несколько различен.
Различен, но не на этом уровне - ANSI С++ для этого и существует

По делу:
PapadopulosВ общем мне нужно объявить массив структур и использовать его в разных модулях. а вот как?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Unit1.h
struct Struct1 {
MyStruct2 Struct2;
int X;
int Y;
int pas[ 10 ]; 
};
.
typedef  struct Struct1 arr; // это определение бесполезное: масло-масляное

Unit1.cpp
#include "Unit1.h"
...
arr a[ 10 ];  // но проще написать Struct1 a[10];

Unit2
#include "Unit1.h"
...
extern arr a[ 10 ];  // но проще extern Struct1 a[10]; 

a[ 1 ].X=...
...

...
Рейтинг: 0 / 0
08.11.2006, 13:27
    #34112096
Papadopulos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
pandrew, ну не хочет такой код работать в билдере, не хочет.
Насчет объявления массива структур вы правы - можно как угодно объявлять - и статически и динамически и с переопределением, в Unit1 массив видится и работает. Загвоздка в объявлении массива в Unit2. Объявление в таком синтаксисе
Код: plaintext
extern arr a[ 10 ];
дает E2141 Declaration syntax error

если так объявить
Код: plaintext
extern struct arr a[ 10 ];
то ошибки нет, но в строке
Код: plaintext
a[ 1 ].X =  123 ;
ошибка E2094 'operator+' not implemented...

В мануале ничего путного не нашел, запутался я короче.
...
Рейтинг: 0 / 0
08.11.2006, 13:29
    #34112103
Papadopulos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
pandrew Papadopulosа разве имя созданной структуры не является указателем??Имя точно не является указателем.
В смысле имя переменной-структуры не является указателем?
...
Рейтинг: 0 / 0
08.11.2006, 13:50
    #34112187
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Papadopulospandrew, ну не хочет такой код работать в билдере, не хочет.
Код: plaintext
extern arr a[ 10 ];
дает E2141 Declaration syntax error
видимо забыли подсунуть декларацию, т.е. #include "Unit1.h"
Papadopulosесли так объявить
Код: plaintext
extern struct arr a[ 10 ];
то ошибки нет, но в строке
Код: plaintext
a[ 1 ].X =  123 ;
ошибка E2094 'operator+' not implemented...
так как в этой строке ничего такого(+) нет - то делаем вывод о косвенном эффекте.

А что у вас за структура MyStruct2 Struct2;???Покажите декларацию.

Я только что ввел все, закомментировав строку с MyStruct2, и все работает во всех вариантах (BCB5). Так что либо кривой BCB6 (без патчей), либо вы чего-то не договариваете.
...
Рейтинг: 0 / 0
08.11.2006, 13:59
    #34112245
Ошибка с экспортом структуры
PapadopulosПриведенный вами код в Cbuilder не работает :( , синтаксис С++ видимо несколько различен.
Вот полный текст моего тестового примера. Только что запустил его на 5-м Билдере - ошибок не обнаружено... Сидите и разбирайтесь...:)
Код: plaintext
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.
//Test1.h - Commonly used data
struct rec
 {
	int a;
	int b;
	int sum(int a,int b);
	int mul(int a,int b);
	int div(int a,int b);
};
typedef struct rec calculator;
------------------------------------------
//Test2.h - Functions in Test1.cpp
void OutText (void);
-------------------------------------------
// test.cpp : Defines the entry point for the console application.
//
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<dos.h>
#include<fstream.h>
#include<io.h>
#include<conio.h>
#include "test1.h"
#include "test2.h"

calculator *calc;

int main(int argc, char* argv[])
{
  calc=new calculator[ 2 ];
  calc[ 1 ].a= 2 ;
  calc[ 1 ].b= 0 ;
  OutText(); 
  getch();
	return  0 ;
}

int rec::sum(int a,int b)
{
	return a+b;
}
int rec::mul(int a,int b)
{
	return a*b;
}
int rec::div(int a,int b)
{
	if (b== 0 ) 
	{
		cout<<"Error: Divisor is ZERO!!!"<<endl;
		return - 1 ;
	}
	
    return a/b;
}
-------------------------------------------------------
//Test1.cpp
#include<stdio.h>
#include<string.h>
#include<dos.h>
#include<fstream.h>
#include<io.h>
#include<conio.h>
#include "test1.h"
#include "test2.h"
extern calculator *calc;

void OutText ()
{
  cout<<calc[ 1 ].sum(calc[ 1 ].a,calc[ 1 ].b)<<endl;
  cout<<calc[ 1 ].mul(calc[ 1 ].a,calc[ 1 ].b)<<endl;
  cout<<calc[ 1 ].div(calc[ 1 ].a,calc[ 1 ].b)<<endl;
}
...
Рейтинг: 0 / 0
08.11.2006, 14:10
    #34112313
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
2Papadopulos - посмотрите настройки Project\Options\Advanced Compiler
Language compiance - у меня Borland.
...
Рейтинг: 0 / 0
08.11.2006, 14:20
    #34112368
Papadopulos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Всё, не парьтесь, разобрался, правильное объявление такое
Код: plaintext
extern struct arr a[];
Это если без указателей.

Все равно благодарю всех.
А все же, имя переменной-структуры является указателем?
...
Рейтинг: 0 / 0
08.11.2006, 14:26
    #34112401
Ошибка с экспортом структуры
Papadopulos
Все равно благодарю всех.
А все же, имя переменной-структуры является указателем?
Я считаю, что нет... Точно так же как имя переменной не является указателем....
А вот имя массива (для элементов любого типа) уже является указателем на его первый элемент...
...
Рейтинг: 0 / 0
08.11.2006, 14:35
    #34112441
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
PapadopulosА все же, имя переменной-структуры является указателем?
Имя переменной типа структуры нехорошо использовать в качестве указателя на область занимаемой им памяти, но можно использовать как ссылку.
Имя массива структур действительно трактуется как адрес (указатель) первого элемента массива.
...
Рейтинг: 0 / 0
08.11.2006, 14:41
    #34112471
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с экспортом структуры
Просто хор мальчиков
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка с экспортом структуры / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]