powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка с экспортом структуры
25 сообщений из 28, страница 1 из 2
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #34110929
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E2294,E2062 это всё что пишет вам компилятор, никакого более внятного сообщения об ошибке нет ? Не верю.
Описание структуры надо выносить в h-файл, и включать его во все cpp использующие эту структуру.
...
Рейтинг: 0 / 0
Ошибка с экспортом структуры
    #34110952
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А регистр символов?
...
Рейтинг: 0 / 0
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #34111033
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
Ошибка с экспортом структуры
    #34111061
pandrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhСтруктура, не является полноценным типом данных...Почему вы так думаете? И кто же полноценен?
...
Рейтинг: 0 / 0
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #34111166
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pandrew AkhСтруктура, не является полноценным типом данных...Почему вы так думаете? И кто же полноценен?

Бывают случаи, когда при объявлении переменной типа структуры, перед именем структуры необъодимо ставить struct.
...
Рейтинг: 0 / 0
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #34111395
Papadopulos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С
Да, учиться Вам еще нужно :(
Те объявления (struct{}, typedef), которые Вы сделали, работают только внутри блока Unit1. Unit2 обо всех этих телодвижениях "не в курсе"....

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

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


Обычно екстерны прописывают в заголовочном файле модуля, в котором она сама определена. Хотя, мне кажется, что ошибка в чем-то другом.
...
Рейтинг: 0 / 0
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #34111856
Papadopulos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав, а разве имя созданной структуры не является указателем??
Приведенный вами код в Cbuilder не работает :( , синтаксис С++ видимо несколько различен.
...
Рейтинг: 0 / 0
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #34112103
Papadopulos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pandrew Papadopulosа разве имя созданной структуры не является указателем??Имя точно не является указателем.
В смысле имя переменной-структуры не является указателем?
...
Рейтинг: 0 / 0
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #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
Ошибка с экспортом структуры
    #34112313
pandrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Papadopulos - посмотрите настройки Project\Options\Advanced Compiler
Language compiance - у меня Borland.
...
Рейтинг: 0 / 0
Ошибка с экспортом структуры
    #34112368
Papadopulos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё, не парьтесь, разобрался, правильное объявление такое
Код: plaintext
extern struct arr a[];
Это если без указателей.

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


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