Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3

Struct и всё что с этим связанно

13.06.2019, 19:28. Показов 2962. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

вот это валидная конструкция
C++
1
2
3
4
5
6
7
  struct MultiTarget {
    const char *str;  // string you're searching for
    size_t len;       // length of string you're searching for
    size_t index;     // index used by the search routine.
  } ;
MultiTarget t[1] = {{OK, strlen(OK), 0}};
int main()
а вот эта нет
C++
1
2
3
4
5
6
7
8
  struct MultiTarget {
    const char *str;  // string you're searching for
    size_t len;       // length of string you're searching for
    size_t index;     // index used by the search routine.
  } t;
t[1] = {{OK, strlen(OK), 0}};   //так не хочет
t = {OK, strlen(OK), 0};        //так тоже
int main()
только так
C++
1
2
3
4
5
6
7
  struct MultiTarget {
    const char *str;  // string you're searching for
    size_t len;       // length of string you're searching for
    size_t index;     // index used by the search routine.
  } t;
int main(){
t = {OK, strlen(OK), 0}; }
почему так происходит?

Добавлено через 5 минут
И такой вопрос
после объявления как указанно выше делаем такой вызов findMulti(t, 1);
но:
почему если я объявляю как вариант 1 то могу сделать так без ошибки компилятора
C++
1
2
3
int findMulti( struct MultiTarget *targets, int tCount) {
for (struct MultiTarget *t = targets; t < targets+tCount; ++t) {}
}
а если как вариант 3 (что на мой не проф взгляд одно и тоже, я имею ввиду объявление/инициализация) то получаю ошибку
cannot convert ‘MultiTarget’ to ‘MultiTarget*’ for argument ‘1’ to ‘int findMulti(MultiTarget*, int)’
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2019, 19:28
Ответы с готовыми решениями:

Как можно сделать такое? (Автоматическое нажатие клавиш и все что с этим связанно)
У меня возник вопрос как можно сделать чтоб программа автоматически нажимала на определенные клавиши? Например в игре GTA SAMP: Чтоб...

Vcredist x64 Visual C++ , и все что с этим связанно
Помогите пожалуйста! :( .Не могу установить vcredist (любой старый, новый,х64 или х82), при этом выдает вот такую ошибку. Так же не...

Создание графических интерфейсов и все что с этим связанно
Всем привет! Я недавно закончил обучаться С++ по множеству книг и научился делать различные консольные приложения, библиотеки классов и так...

38
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
03.07.2019, 17:51  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
нет не нужно (ну разве что вы свой аллокатор пишите)
не нужно потой же причине по которой мы не удаляем локальные переменные некой функции ? при выходе из функции все локальные перменные (кроме тех что алокейт) как бы помечяются (?) как устаревшие и могут быть (ячейки памяти всмысле) использованы для создания новых локальных переменных

свой алокатор это что ? всмысле когда я создаю структуру через new ?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
03.07.2019, 18:07
Цитата Сообщение от alexbmd Посмотреть сообщение
как бы помечяются (?) как устаревшие
Вообще-то локальные переменные находятся в программном стеке, т.е. последовательно добавляются в стек и конструируются, а по выходу из области видимости (т.е. при выходе из блока - куска программы, огороженного скобками {} ) вначале разрушаются (исполняется деструктор) а затем уходят из стека (уменьшением значения регистра/переменной, хранящей адрес конца заполненной стеком памяти, с самой же памятью ничего не происходит и содержимое этого участка памяти просто начинает считаться мусором).

Добавлено через 2 минуты
Цитата Сообщение от alexbmd Посмотреть сообщение
всмысле когда я создаю структуру через new ?
Нет, это когда напишешь свою собственную реализацию new. Точнее самый главный алгоритм, отвечающий собственно за распределение памяти в куче, и который можно будет подключить в new вместо стандартного.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13241 / 6873 / 1827
Регистрация: 18.10.2014
Сообщений: 17,420
03.07.2019, 18:20
Цитата Сообщение от alexbmd Посмотреть сообщение
почему так происходит?
Любой источник по самым азам языков С и С++ объяснит вам, что в этих языках программирования выполняемый код (statements) пишется внутри функций. Не где попало посреди файла, а внутри функций и только внутри функций.

За пределами функций могут располагаться только объявления.

В языке С++ можно еще указывать неконстантные инициализаторы в объявлениях, что позволяет в некотором смысле выносить выполняемый код за пределы функций, но опять же: это разрешается делать только в объявлениях.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
04.07.2019, 15:26  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Вообще-то локальные переменные находятся в программном стеке,
структура из 17 сообщения тоже в стеке и тоже потом деструктор и уход из стека?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
04.07.2019, 16:44
Да. Деструктор используется который по-умолчанию (т.е. ничего с объектом не делает). А так да, в 3 строке 17 сообщения создаётся массив, с конструированием 1 элемента. В 5 строке на выходе из блока у массива этот элемент разрушается и далее массив уходит из стека.
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
10.07.2019, 15:09  [ТС]
а как правильно объявить ?
C++
1
2
3
4
5
6
7
volatile struct A {};
 
struct A volatile {};
 
struct A {} volatile a;
 
struct A {} a volatile;
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
10.07.2019, 15:12
Как в строке 5. Но лучше не заниматься этим мазохизмом, а сделать

C++
1
2
struct A {};
volatile A a;
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.07.2019, 15:30
Цитата Сообщение от TRam_ Посмотреть сообщение
Как в строке 5.
И как в 7.

Добавлено через 12 минут
Цитата Сообщение от Azazel-San Посмотреть сообщение
И как в 7.
А не, бред. Тогда это уже не к типу будет относится.
Можно так:
C++
1
2
volatile struct A {};   // так нет
volatile struct A {} a; // ок
и так:
C++
1
struct A {} volatile a;
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
10.07.2019, 15:59  [ТС]
и так тоже правильно ?
C++
1
volatile struct {} a;

Цитата Сообщение от Azazel-San Посмотреть сообщение
volatile struct A {} a;
объявляя саму структуру как volatile , её мемберы тоже будут volatile ?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.07.2019, 16:49
Цитата Сообщение от alexbmd Посмотреть сообщение
её мемберы тоже будут volatile ?
нет, это не структура volatile, а ее экземпляр.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
10.07.2019, 16:54
Цитата Сообщение от alexbmd Посмотреть сообщение
и так тоже правильно ?
Так объявляешь экземпляр безымянной структуру, с таким будет потом сложно работать. volatile относится исключительно к объявленному экземпляру и его полям. На сам класс/структуру этот квалификатор не влияет никак.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
10.07.2019, 20:38  [ТС]
Спасибо.

А почему с безимянной трудно работать? Когда нет необходимости наследования, объявления новых экземпляров к примеру
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
10.07.2019, 22:50
То есть во всей программе предполагается всего 1 экземпляр данного класса? И в дальнейшем второй не может понадобиться?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
10.07.2019, 22:53
TRam_, decltype
1
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
10.07.2019, 22:56
Цитата Сообщение от alexbmd Посмотреть сообщение
А почему с безимянной трудно работать?
Потому что придётся все экземпляры данной структуры определять в одном месте - сразу после определения этой структуры до ;.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
10.07.2019, 22:56
rat0r, это из серии "создаём себе неудобства, потом героически их превозмогаем"
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13241 / 6873 / 1827
Регистрация: 18.10.2014
Сообщений: 17,420
10.07.2019, 23:27
Цитата Сообщение от gray_fox Посмотреть сообщение
Потому что придётся все экземпляры данной структуры определять в одном месте - сразу после определения этой структуры до ;.
Это не так. С появлением decltype вы можете создавать экземпляры данной структуры где угодно, если доступен образец. Да и до decltype это можно было делать там, где тип дедуктировался как параметр шаблона.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
11.07.2019, 15:26  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
То есть во всей программе предполагается всего 1 экземпляр данного класса? И в дальнейшем второй не может понадобиться?
да , если просто создается такая некая сложная глобальная перменная. без наследников , новых экземпляров и прочего. один раз создали её наверху и дальше только работает с её членами.
если я правильно вас понял в таком случае нет никаких подводных камней в безимянной структуре , да ?

Цитата Сообщение от Azazel-San Посмотреть сообщение
это не структура volatile, а ее экземпляр.
т.е. это две строки равносильны и как именно писать дело вкуса ?
C++
1
2
volatile struct {} a;
struct {} volatile a;
Добавлено через 56 секунд
спасибо за decltype. а как вы его сереньким так выделяете?
0
11.07.2019, 18:31

Не по теме:

Цитата Сообщение от alexbmd Посмотреть сообщение
а как вы его сереньким так выделяете
Тег inline в той же строке что выделение кода С++

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2019, 18:31

Все что связанно с IP адресом
расскажите пож., как определить Ip адрес, какие данные можно получить по нему о владельце и как?

Геймдев и всё, что с ним связанно
Всем привет. Учусь в 9 классе. В последнее время нравится программирование и физика. Хочется заняться геймдевом, но т.к с 6-8 класс на...

Object[] и все что с ним связанно
Доброго времени суток. Читаю файл по частям в Byte после чего это нужно занести в Object для работы уже с этим массивом. Проблема в...

После установки Windows 7 не заходит в mail.ru и все что связанно с ним
Недавно переустановил винду на 7 после обнавления железа, до этого стояла XP там майл прекрасно грузился.Стоит браузер Опера вот на нем и...

Рост и всё, что с этим связано
На основе своих наблюдений я заметил, что чем ниже рост человека - тем он вреднее и злее. Высокий же человек наоборот бывает добродушный, а...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru