С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
#1

Работа со структурами - C++

04.06.2013, 15:56. Просмотров 1937. Ответов 50
Метки нет (Все метки)

Только изучаю С++ (раньше довольно неплохо программил на Делфи) и столкнулся с вопросом.
Допустим есть две структуры:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct ABC_CONT_STATE
    {                          
        BYTE Symb, Fr;                  
        struct ABC_CONT* Successor;
    } _PACK_ATTR;                   
 
 
static struct ABC_CONT
{                 
    BYTE NmStat, Flag;                   
    WORD SummFreq;                         
    struct ABC_CONT_STATE *Stat;
    struct ABC_CONT* Sufix;                    
} _PACK_ATTR* MaxContext;
 
struct ABC_CONT_STATE * p;
Что означает следующее обращение к переменной "р":

C++
1
p[0].Fr = p[-1].Fr;
И заодно непонятно, что означает инкремент этой переменной:

C++
1
(++p)->Fr; // увеличение на единицу элемента Fr?
или

C++
1
p++; // А тут что увеличивается на единицу, все элементы?
Заранее всем спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2013, 15:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа со структурами (C++):

Работа с структурами - C++
#include <cstdlib> #include <iostream> using namespace std; struct struc{ char* a; int x; }

Работа со структурами - C++
Имеется вот такая задача: Файл, содержащий даты. Каждая дата - это структура, помещенная в отдельную запись. Состав структуры: ...

Работа со структурами - C++
Помогите написать программу подобного рода: Работа со структурами. Программа должна содержать функции, необходимые для выполнения...

Работа со структурами - C++
Известны данные о численности населения и площади 10 государств. Определить государство с максимальной плотностью населения. P.S. ...

Работа со структурами. - C++
Здраствуйте! Текст задания : Создать программу, позволяющую вводить элементы массива структур (размерность массива не более 20...

Работа со структурами - C++
Цель работы: научиться объявлять структуру и работать с ее по-лями Помогите пожалуйста. Нужно вот такую программку написать. ...

50
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 15:12  [ТС] #31
Для закрепления материала. Попробую под Вашим чутким руководством перевести структуру с С++ в Delphi
Итак, исходная структура:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct ABC_CONT_STATE
    {                          
        BYTE Symb, Fr;                  
        struct ABC_CONT* Successor;
    } _PACK_ATTR;                   
 
 
static struct ABC_CONT
{                 
    BYTE NmStat, Flag;                   
    WORD SummFreq;                         
    struct ABC_CONT_STATE *Stat;
    struct ABC_CONT* Sufix;                    
} _PACK_ATTR* MaxContext;
Теперь результат на Delphi:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type
PABC_CONT = ^ABC_CONT;
PABC_CONT_STATE = ^ABC_CONT_STATE;
 
ABC_CONT = packed record
  NumStat: BYTE;
  Flag: BYTE;
  SummFreq: WORD;
  Stat: PABC_CONT_STATE;
  Sufix: PABC_CONT;  
end;
TABC_CONT = ABC_CONT;
 
ABC_CONT_STATE = packed record
Symbol: BYTE; 
Freq: BYTE; 
Successor: PABC_CONT; 
end;
TABC_CONT_STATE = ABC_CONT_STATE;
В этом всё меня смущает расположение оператора "*". Почему здесь звёздочка возле названия структуры,
C++
1
2
3
...
struct ABC_CONT* Successor; 
...
а вот здесь звёздочка возле названия переменной?
C++
1
2
3
...
ABC_CONT_STATE *Stat; 
...
На дельфи это будет так:
Pascal
1
2
Successor: PABC_CONT;
Stat: PABC_CONT_STATE;
или так:
Pascal
1
2
Successor: PABC_CONT;
Stat: ^ABC_CONT_STATE;
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 15:35 #32
Цитата Сообщение от fominov Посмотреть сообщение
В этом всё меня смущает расположение оператора "*".
Ни на что не влияет, хоть посередине. Кому как нравится. Но код странный.
0
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
06.06.2013, 12:25  [ТС] #33
Ещё небольшой вопрос по структурам. Допустим объявлены переменные:
C++
1
ABC_CONT *Stat, *curr;
Затем идёт такое арифметическое действие
C++
1
2
Stat->NmStat=curr->NmStat+(curr->SummFreq > 11*(curr->NmStat+1));
curr->NmStat= 2*(2*curr->NmStats)+curr->Flag;
Правильно ли я понимаю первую операцию (в синтаксисе Делфи)?

Pascal
1
2
 if curr.SummFreq > 11*(curr.NmStat+1) then
Stat.NmStat:=curr.NmStat+curr.SummFreq;
А вторая строка в любом случае выполняется или только если
Pascal
1
curr.SummFreq > 11*(curr.NmStat+1)
0
Kuzia domovenok
2060 / 1905 / 174
Регистрация: 25.03.2012
Сообщений: 6,557
Записей в блоге: 1
06.06.2013, 12:31 #34
Цитата Сообщение от fominov Посмотреть сообщение
Правильно ли я понимаю первую операцию (в синтаксисе Делфи)?
Нет, конечно! Обе строки выполняются одна за другой. Где ты видишь if ?!
Короче, я смотрю ты даже основ Си не знаешь. Зачем пытаешься мутить что-то с указателями? Бери книгу по Си/Си++ и читай её по-порядку и с самого начала!
0
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
06.06.2013, 12:52  [ТС] #35
Я вижу вот это сравнение:
C++
1
curr->SummFreq > 11*(curr->NmStat+1)
поэтому решил, что если есть сравнение, то должна быть конструкция if...then
Иначе что означает знак ">" ?

Я книгу по С++ читал и там где про сравнение, сказано, что знак ">" означает больше?
Что уже что-то поменялось?
0
Kuzia domovenok
2060 / 1905 / 174
Регистрация: 25.03.2012
Сообщений: 6,557
Записей в блоге: 1
06.06.2013, 14:23 #36
Цитата Сообщение от fominov Посмотреть сообщение
знак ">" означает больше?
> Это не просто знак, это оператор.
А любой оператор возвращает значение (результат).
Так что почитай ещё раз книжку по С/С++, особенно обращай внимание на операторы.
0
SatanaXIII
Супер-модератор
Эксперт С++
5641 / 2676 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
06.06.2013, 14:46 #37
Цитата Сообщение от Kojt Посмотреть сообщение
p - указатель на память, если указать сдвиг -1, то обратится ХЗ куда, не надо так делать (точнее не следует так делать пока не разобрался что к чему)
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Глупости. Если программист знает, что делает. Если p указывает на элемент некоего массива структур и этот элемент не первый, то почему бы не обратиться к p[-1]?
Кстати. При динамическом объявлении массива определенного типа некоторые компиляторы складируют в p[-1] размер этого массива.
0
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
06.06.2013, 14:48  [ТС] #38
Почитай, почитай...

Вот и почитайте (MSDN):
Оператор > (Справочник по C#)
Visual Studio 2012
Во всех числовых типах и типах перечислений определен оператор сравнения "больше" (>), который возвращает значение true, если первый операнд больше второго, в противном случае возвращается значение false.

А Вы думаете я не знал, что он возвращает значение (true/false)?

А конструкция if a > b then в случае, ели а > b возвратит не тоже самое true/false? Зачем запутывать меня?
Объясните толком смысл вот этого арифметического выражения:
C++
1
Stat->NmStat=curr->NmStat+(curr->SummFreq > 11*(curr->NmStat+1));
0
SatanaXIII
Супер-модератор
Эксперт С++
5641 / 2676 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
06.06.2013, 14:52 #39
C++
1
+(curr->SummFreq > 11*(curr->NmStat+1))
==
C++
1
+1 || +0
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 16:44 #40
Цитата Сообщение от fominov Посмотреть сообщение
Правильно ли я понимаю первую операцию (в синтаксисе Делфи)?
Pascal
1
2
if curr.SummFreq > 11*(curr.NmStat+1) then
Stat.NmStat:=curr.NmStat+curr.SummFreq;
fominov, вы форумом не ошиблись? Тут - С++. Я уже писал, что код странный, а вы его ещё пытаетесь на другой язык переводить.
Цитата Сообщение от fominov Посмотреть сообщение
А Вы думаете я не знал, что он возвращает значение (true/false)?
Машина оперирует числами (это для нас true/false), поэтому true/false имеют числовое представление.
Вот что стандарт пишет:
Each of the operators < (less than), > (greater than), <= (less than or equal to), and >=
(greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false)
The result has type int.
0
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
06.06.2013, 16:46  [ТС] #41
Форумом я точно не ошибся.
А кто сказал, что код простой? Да, он странный. Так поэтому я и задаю вопросы, что если бы это был Делфи, я бы его может и без посторонней помощи разобрал. А тут С++, основные моменты которого я думал, что для себя уяснил. Но когда столкнулся с описанными выше структурами и выражениями, решил обратиться за помощью.
Если я правильно понял из всех философских (и не только) ответов на мой вопрос, то выражение:
C++
1
Stat->NmStat=curr->NmStat+(curr->SummFreq > 11*(curr->NmStat+1));
нужно понимать так:
Pascal
1
Stat.NmStat:=curr.NmStat+(curr.SummFreq or (11*(curr.NmStat+1)));
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 16:56 #42
Цитата Сообщение от fominov Посмотреть сообщение
Форумом я точно не ошибся.
Тогда кому этот вопрос?
Цитата Сообщение от fominov Посмотреть сообщение
Правильно ли я понимаю первую операцию (в синтаксисе Делфи)?
Тут кто-то должен знать синтаксис Делфи?
Цитата Сообщение от fominov Посмотреть сообщение
А кто сказал, что код простой?
Сложный и странный - разные вещи.

Цитата Сообщение от fominov Посмотреть сообщение
нужно понимать так:Код Pascal
1 Stat.NmStat:=curr.NmStat+(curr.SummFreq or (11*(curr.NmStat+1)));
Форумом не ошиблись?
0
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
06.06.2013, 17:05  [ТС] #43
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут кто-то должен знать синтаксис Делфи?
Форумом не ошиблись?
Следуя Вашей логике я не могу задать этот вопрос и в ветке посвящённой Делфи, потому что такой же как Вы человек ответит: "Тут кто-то должен знать синтаксис С++? Форумом не ошиблись?"

Что мне его в теме РНР задавать?
0
chizz
981 / 496 / 54
Регистрация: 19.03.2013
Сообщений: 3,091
Записей в блоге: 18
Завершенные тесты: 1
06.06.2013, 17:08 #44
У вас
Цитата Сообщение от fominov Посмотреть сообщение
(curr->SummFreq > 11*(curr->NmStat+1)
вернет boolean, а потом вы булеан складываете с curr->NmStat...

Ерунда какая-то
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 17:21 #45
Цитата Сообщение от fominov Посмотреть сообщение
Следуя Вашей логике я не могу задать этот вопрос и в ветке посвящённой Делфи, потому что такой же как Вы человек ответит: "Тут кто-то должен знать синтаксис С++? Форумом не ошиблись?"
Логика другая. Правильно ставить вопрос: не то, как это выглядит в синтаксисе Делфи, а что это значит в С++ (как это понимать). Типа: что означает данная конструкция? На любом форуме это поймут правильно.
0
06.06.2013, 17:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 17:21
Привет! Вот еще темы с ответами:

Работа со структурами - C++
Сегодня преподаватель огорошил известием что к завтрашнему дню надо сдать лабораторную по Работе со структурами. Было бы хорошо. НО он...

Работа со структурами - C++
У меня есть структура, содержащая фамилии учеников и их оценки по 3 предметам. Как мне посчитать средний балл каждого студента и вывести...

Работа со структурами - C++
Ввести в компьютер информацию о сотрудниках : фамилия,имя,возраст. Напечатать имена сотрудников,у которых возраст больше 28 лет

работа со структурами - C++
#include&lt;conio.h&gt; #include&lt;iostream.h&gt; #include&lt;string.h&gt; main() { int n=0, i, zapros, flag=0; char s; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.