Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24

Работа со структурами

04.06.2013, 15:56. Показов 5613. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2013, 15:56
Ответы с готовыми решениями:

Работа со структурами
struct data_type { int day; int month; int year; }data_birthday; /*нужна ли здесь эта переменная или достаточно вызвать...

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

Работа со структурами
Всем доброго времени суток! Имеется следующая задача: Написал следующий код: #include <iostream> #include...

50
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 00:46  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alsav22 Посмотреть сообщение
В общем случае, если p - это адрес (указатель или имя массива), то p[i] - содержимое по этому адресу со смещением i.
Вот я так и думал. Но тогда давайте ещё раз проясним на моём примере. Итак есть указатель *р на структуру ABC_CONT_STATE. Получается p[0] - это грубо говоря указатель на параметр Symb этой структуры, а р[1] - это грубо говоря указатель на параметр Fr.

Правильно я понял?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 01:15
Цитата Сообщение от fominov Посмотреть сообщение
Правильно я понял?
Нет. Грубо говоря, указатель - это адрес. Есть указатель на структуру ABC_CONT_STATE - p (адрес в памяти). Что в этой памяти из кода не видно. Может быть всё что угодно, но указатель будет вести себя, как указатель на структуру ABC_CONT_STATE. Т.е., если сделать ++p, то арес p станет больше на размер структуры ABC_CONT_STATE.
Цитата Сообщение от fominov Посмотреть сообщение
Получается p[0] - это грубо говоря указатель на параметр Symb этой структуры, а р[1] - это грубо говоря указатель на параметр Fr.
Цитата Сообщение от alsav22 Посмотреть сообщение
В общем случае, если p - это адрес (указатель или имя массива), то p[i] - содержимое по этому адресу со смещением i.
Так как указатель p - это указатель на структуру, то смещение i будет равно размеру структуры. Тогда: p[0] - содержимое по адресу p cо смещением 0, р[1] - содержимое по адресу p cо смещением 1 (по адресу p + размер структуры в байтах).

Добавлено через 5 минут
Если p - это адрес начала массива структур, то p[0] - это первая структура, p[1] - вторая и т.д.

Добавлено через 5 минут
p[0].Symb - поле Symb первой структуры, p[0].Fr - поле Fr первой структуры, p[1].Symb - поле Symb второй структуры, p[1].Fr - поле Fr второй структуры,
1
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 10:06  [ТС]
Спасибо. Очень толково разжёванный ответ. Вы мне очень помогли.
Мне теперь осталось разобраться с р[-1], но тут наверное чисто опытным путём. Интересно, на Делфи это как бы выглядело...?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 10:37
Цитата Сообщение от fominov Посмотреть сообщение
Мне теперь осталось разобраться с р[-1]
Цитата Сообщение от fominov Посмотреть сообщение
а это готовый код из одного алгоритма шифрования. И он работает
Разобраться как работает код? При таком обращении (p[-1]) важно знать, что в памяти находится перед структурой ABC_CONT_STATE, не думаю, что для алгоритма шифрования, всё равно, что там лежит. Перед объявлением ABC_CONT_STATE ещё что-то объявлялось?
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 11:34  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Перед объявлением ABC_CONT_STATE ещё что-то объявлялось?
Разве что директива #pragma pack(1)
А в функции переменная определена так:

C++
1
2
3
4
void ABC_CONT_res(struct ABC_CONT *curr)
{
    UINT OldNU, Adder, EscFreq, i=curr->NumStat;
    struct ABC_CONT_STATE tmp, * p1, * p;
А потом идёт условный переход:
C++
1
2
if (p[0].Freq > p[-1].Freq)
        {...}
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 11:58
Из этих кусков ничего не понять. Вот здесь:
C++
1
2
3
...
struct ABC_CONT_STATE tmp, *p1, *p;
...
объявлены структура и два указателя на структуру, но указатели не привязаны ни к каким адресам (в них мусор). Дальше с ними какие-то действия:
C++
1
2
...if (p[0].Freq > p[-1].Freq)
...
Чего-то явно не хватает.
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 12:38  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
объявлены структура и два указателя на структуру, но указатели не привязаны ни к каким адресам (в них мусор).
Привязка это я так понимаю следующий код:

C++
1
2
3
4
5
p1=curr;
...
(p=pc->Stat)->Symb;
{...}
p++;
и потом, то, что я уже писал:
C++
1
if (p[0].Fr >= p[-1].Fr)
{
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 12:51
Цитата Сообщение от fominov Посмотреть сообщение
(p=pc->Stat)->Symb;
pc?
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 13:00  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
pc?
Нет, ошибка.

C++
1
(p=р1->Stat)->Symb;
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 13:13
Тогда нужно знать с каким адресом связан указатель Stat в структуре, которая передаётся в функцию. Странный код. Откуда взяли? Вот эту строку:
C++
1
(p=р1->Stat)->Symb;
можно записать так:
C++
1
p=р1->Stat;
и будет то же самое. Вопрос из первого поста:

Цитата Сообщение от fominov Посмотреть сообщение
И заодно непонятно, что означает инкремент этой переменной:
C++
1
(++p)->Fr; // увеличение на единицу элемента Fr?
Это можно записать так:
C++
1
++p;
То же самое. Зачем здесь добавляется доступ к полям, с которыми потом ничего не делается, непонятно.
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 15:12  [ТС]
Для закрепления материала. Попробую под Вашим чутким руководством перевести структуру с С++ в 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 15:35
Цитата Сообщение от fominov Посмотреть сообщение
В этом всё меня смущает расположение оператора "*".
Ни на что не влияет, хоть посередине. Кому как нравится. Но код странный.
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
06.06.2013, 12:25  [ТС]
Ещё небольшой вопрос по структурам. Допустим объявлены переменные:
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
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
06.06.2013, 12:31
Цитата Сообщение от fominov Посмотреть сообщение
Правильно ли я понимаю первую операцию (в синтаксисе Делфи)?
Нет, конечно! Обе строки выполняются одна за другой. Где ты видишь if ?!
Короче, я смотрю ты даже основ Си не знаешь. Зачем пытаешься мутить что-то с указателями? Бери книгу по Си/Си++ и читай её по-порядку и с самого начала!
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
06.06.2013, 12:52  [ТС]
Я вижу вот это сравнение:
C++
1
curr->SummFreq > 11*(curr->NmStat+1)
поэтому решил, что если есть сравнение, то должна быть конструкция if...then
Иначе что означает знак ">" ?

Я книгу по С++ читал и там где про сравнение, сказано, что знак ">" означает больше?
Что уже что-то поменялось?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
06.06.2013, 14:23
Цитата Сообщение от fominov Посмотреть сообщение
знак ">" означает больше?
> Это не просто знак, это оператор.
А любой оператор возвращает значение (результат).
Так что почитай ещё раз книжку по С/С++, особенно обращай внимание на операторы.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
06.06.2013, 14:46
Цитата Сообщение от Kojt Посмотреть сообщение
p - указатель на память, если указать сдвиг -1, то обратится ХЗ куда, не надо так делать (точнее не следует так делать пока не разобрался что к чему)
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Глупости. Если программист знает, что делает. Если p указывает на элемент некоего массива структур и этот элемент не первый, то почему бы не обратиться к p[-1]?
Кстати. При динамическом объявлении массива определенного типа некоторые компиляторы складируют в p[-1] размер этого массива.
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
06.06.2013, 14:48  [ТС]
Почитай, почитай...

Вот и почитайте (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
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
06.06.2013, 14:52
C++
1
+(curr->SummFreq > 11*(curr->NmStat+1))
==
C++
1
+1 || +0
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 16:44
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.06.2013, 16:44

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

Работа со структурами
вот такая задача: Распечатать список учеников музыкальной школы, которые учатся играть на скрипке. Указать сколько лет они занимаются...

Работа со структурами
Почему-то после того как я ввожу количество студентов программа сама завершается с кодом 0. #include &quot;stdafx.h&quot; ...

Работа со структурами
Организовать файл с указанной структурой в задании 1. Осуществить просмотр данных файла, которые соответствуют критериям отбора...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru