IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Указатель как тип (синтаксис), С++Builder
сообщение
Сообщение #1


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Есть кусок кода из делфёвой проги:
Posref = ^Position; //Тип: указатель на позицию
Lref = ^Leader; // Тип: указатель на заголовочный узел перехода
Tref = ^Trailer; //Тип: указатель на дугу
//Описание типа заголовочного узла перехода
Leader=Record
Key : Integer; // Имя заголовочного узла
Trail1 : Tref; //Указатель на список входящих дуг
Trail2 : Tref; //Указатель на список исходящих дуг
Next : Lref // Указатель на следующий узел в списке заголовочных узлов
end;
//Описание типа дугового узла
Trailer = Record
Id : Posref; //Указатель на ту позицию, в/из которой входит/выходит дуга
Count : Integer; //Количество дуг, связывающих эту позицию с переходом
Next : Tref //Указатель на следующую дугу
end;
//Описание типа позиции
Position = Record
Key : Integer;
Fishka : Byte;
Next : Posref;
end;


Как можно что-то аналогичное сделать?
Больше всего интересует проблема первых строк.
typedef *Leader LRef

не проходит (запятой ему не хватает, видите ли... но с запятой же получится совсем не то, что мне нужно?..)
Если это как-то делается, то остальное почти не изменится (ну, будет struct Leader и т.д.), а если нет - вообще непонятно....
Потому что если убрать первые 3 строки, а внутри структур заменить
Trail2 : Tref

на
Trailer *Trail1

пишет, что тип не указан.
Если эти структуры поменять местами, чтобы везде упоминались только описанные выше - говорит, что "too many types".
В общем, это... Хелп, плз.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Не знаю, что в Builder-е, но чистый C в виде TC3.0 компилирует вот это без ошибок:

typedef struct TLeader {
int Key;
struct TTrailer *Trail1, *Trail2;

struct TLeader *Next;
} Leader;

typedef struct TTrailer {
struct TPosition *Id;
int Count;
struct TTrailer *Next;
} Trailer;

typedef struct TPosition {
int Key;
unsigned char Fishka;
struct TPosition *Next;
} Position;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


все. Архангельскому не верю напрочь. mega_chok.gif
Второй раз пробую разобраться с вопросом по его книжке (точнее, по приведенным там примерам).

спасибо большое!

З.Ы. Position, Leader и Trailer - это переменные соответствующего типа? Если мне где-то еще надо объявлять переменные такого типа, то писать, например,
struct TLeader L1

?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Не обязательно...
struct TLeader L1 совершенно эквивалентно Leader L1, а зачем набирать больше? smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


запуталась.
Leader - это что? переменная типа TLeader? как мы тогда можем объявлять L1 такого типа?
и почему тогда пишется внутри структуры
struct TPosition *Next;

?
или здесь тоже можно и так, и так?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Юля, не путай описание и определение типа, это может привести к очень плохим результатам, особенно в С/С++. Что мы делаем здесь:
typedef struct TLeader {
int Key;
struct TTrailer *Trail1, *Trail2;

struct TLeader *Next;
} Leader;
?

Делаем для типа struct TLeader { ... } новое имя: Leader, правда?
Точно так же, как и
typedef unsigned char byte;
определяет новое имя byte для типа unsigned char

Теперь, почему нельзя пользоваться таким определением:
typedef struct TLeader {
int Key;
Trailer *Trail1, *Trail2;

Leader *Next;
} Leader;
потому, что к тому моменту, как компилятор обрабатывает эту запись, тип Trailer еще не определен, и тип Leader тоже (не встретилась еще завершающая описание точка с запятой). Чтобы можно было показать компилятору, что это будет указатель на структуру, используется предварительное описание (чувствуешь разницу, да?) - указателя на структуру. Все остальное для компилятора неважно, он зарезервирует 4 байта под указатель на структуру, и когда этот тип будет определен (ниже по тексту), свяжет его с этим указателем.

wacko.gif
С, что поделаешь...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


понятно. больше не буду путать smile.gif
спасибо огромное.
буду на выходных писать новый вариант этой <надоевшей> имитации сети Петри.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


откомпилировалось только в таком варианте:
typedef struct TPosicion {
int Key;
unsigned char Fishka;
struct TPosicion *Next;
} Posicion;

typedef struct TLeader {
int Key;
struct TTrailer *Trail1, *Trail2;
struct TLeader *Next;
} Leader;

typedef struct TTrailer{
struct TPosicion *Id;
int Count;
struct TTrailer *Next;
} Trailer;

то есть после изменения порядка и имени TPosition на TPosicion


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Ну, возможно просто конфликт имен (в Builder-е нет структуры TPosition, случайно?)

Обрати внимание, что структура TTrailer все-же определена ниже, чем используется ее описание, так что скорее всего - именно совпадающие имена послужили причиной отказа компилироваться... yes2.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


опять запуталась. в следующем месте...
void WorkPetri (Leader *m, int KolPer)
{
bool fl_loc,fl_all;
Leader *Perehody = new Leader;
Posicion *Posicii = new Posicion;
Trailer *Dugi = new Trailer;
do
{
Perehody = m; <----если я правильно понимаю, то одному указателю присваиваем значение другого
fl_all = 0;
for (int i=1;i++;i<=KolPer)
{
fl_loc = 1;
Dugi = *Perehody->Trail1; <---[C++ Error] Unit1.cpp(56): E2034 Cannot convert 'TTrailer' to 'TTrailer *'
.....


а на

Dugi = Perehody->Trail1;

соглашается.

Что такое эти Perehody? Указатель? Тогда разве не надо разыменовывать - мы же обращаемся к полю того объекта, на который он указывает.... То есть в Делфи эта строка выглядела
Dugi:=Perehody^.Trail1;


Возникла мысль, что написанное он воспринимает как разыменование указателя, хранящегося в поле.
Но на
Dugi = (*Perehody)->Trail1;

ругается не меньше:
[C++ Error] Unit1.cpp(56): E2288 Pointer to structure required on left side of -> or ->*


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
Что такое эти Perehody? Указатель? Тогда разве не надо разыменовывать - мы же обращаемся к полю того объекта, на который он указывает....
Нет... В С++ для обращения к полю структуры есть 2 способа:

Dugi = Perehody->Trail1;  // Если Perehody - указатель на структуру
Dugi = Perehody.Trail1; // Если Perehody - переменная типа структуры

Так что разыменовывать ничего не надо...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Спасибо...

офф. Вся группа накопировала лабы, которые даже изменять не придется, из FAQа. Куда написать коллективную благодарность? smile.gif


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 20.09.2017 11:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"