С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/190: Рейтинг темы: голосов - 190, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 15.12.2016
Сообщений: 55

Как последовательно перебрать элементы структуры?

30.07.2017, 13:49. Показов 38151. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть структура

C++
1
2
3
4
5
6
7
8
9
10
struct {
        char structs[10];
        char vnesh[6];
        char vnutr[6];
        char mnt[3];
        char razddata[10];
        char pkey[6];
        char n[2];
 
    }tags;
Как циклом перебрать все элементы? Пытался вот так, но не получается.

C++
1
2
3
4
for(int i = 0; i < 6; i++){
tags[i];
 
    }
Компилятор ругается на tags[i]; - пишет:

[BCC32 Error] db2.h(331): E2094 'operator+' not implemented in type 'struct' for arguments of type 'int'
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.07.2017, 13:49
Ответы с готовыми решениями:

Как последовательно перебрать все записи в таблице, получая значения поля или полей?
Здравствуйте! Имеются объекты: ТблПромежуточная ТблВыполненныеРаботы с полями : ДатаВыполнения ИДРаботы ...

Как перебрать поля структуры?
возможно ли это в с++ ? (c# - GetFields)

Как перебрать циклом элементы меню?
Есть пункт меню &quot;Кодировка при сохранении&quot;, в нем есть подпункты 3 подпункта (но может быть 20 и более). Как сделать так, чтобы при...

7
 Аватар для proghelp4you
62 / 62 / 34
Регистрация: 09.07.2017
Сообщений: 475
30.07.2017, 14:22
ruccich, доступ к элементам структуры осуществляется только по имени, в цикле перебрать не получится.
C++
1
2
3
4
5
6
7
tags.structs;
tags.vnesh;
tags.vnutr;
tags.mnt;
tags.razddata;
tags.pkey;
tags.n;
1
1 / 1 / 0
Регистрация: 15.12.2016
Сообщений: 55
30.07.2017, 16:33  [ТС]
Цитата Сообщение от proghelp4you Посмотреть сообщение
доступ к элементам структуры осуществляется только по имени, в цикле перебрать не получится.
Спасибо за ответ. Это есть очень плохо. придётся использовать массив, переписывать код.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
30.07.2017, 19:56
Сделай все данные одного размера - сможешь обойти элементы циклом (используя union)
1
1615 / 1181 / 552
Регистрация: 08.01.2012
Сообщений: 4,558
30.07.2017, 21:23
хранить указатели в той же структуре

Добавлено через 18 минут
C++
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
struct tags
{
    char structs[10];
    char vnesh[6];
    char vnutr[6];
    char mnt[3];
    char razddata[10];
    char pkey[6];
    char n[2];
    char *p[7];
    tags()
    {
        *p=structs;
        p[1]=vnesh;
        p[2]=vnutr;
        p[3]=mnt;
        p[4]=razddata;
        p[5]=pkey;
        p[6]=n;
    }
};
void main(int argc,char **argv)
{
    tags t;
    char s[2]="";
    for(int i=0; i<7; i++)
    {
        *s='A'+i;
        strcpy(t.p[i],s);
    }
    for(int i=0; i<7; i++) 
        cout<<t.p[i]<<endl;
1
1 / 1 / 0
Регистрация: 15.12.2016
Сообщений: 55
31.07.2017, 04:57  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Сделай все данные одного размера - сможешь обойти элементы циклом (используя union)
Как использовать union? Пример кода можно?
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
31.07.2017, 06:18
а поля структуры нуль-терминированные строки?

можно же привести структуру к указателю на char и обращаться к полям
как-то так например:
C++
1
2
3
4
5
char* ptr = (char *)&tags;
char substr[6];
// второе поле структуры
strncpy(substr, ptr + 10, 6);
// что-то делаем с substr

если нуль-терминированные строки, то и перебрать можно, напечатать:
C++
1
2
3
4
5
6
7
char* ptr = (char *)&tags;
for (int i = 0; i < sizeof(tags); i++,ptr++)
{           
    printf("%c", *ptr);
    if (*ptr == '\0')
        printf("\n");
}

если сделать поля равными по размеру, то можно и так кастануть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct  {
    char structs[10];
    char vnesh[10];
    char vnutr[10];
    char mnt[10];
    char razddata[10];
    char pkey[10];
    char n[10];
 
}tags;
 
 
 
char(&ptr)[7][10] = *(char(*)[7][10])(&tags);
 
for (int i = 0; i < 7; i++)
{           
  printf("%s\n", ptr[i]);
}
2
2 / 2 / 0
Регистрация: 02.11.2019
Сообщений: 45
22.02.2022, 23:44
Гуглите X Macros. Странная вещь, но полезная.
Можно делать так:
C++
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
#include <iostream>
 
#define STRUCT_FIELDS \
    X(int, i) \
    X(float, f) \
    X(const char*, c)
 
struct S {
    #define X(type, name) type name;
        STRUCT_FIELDS
    #undef X
};
 
template<typename T> void f(const T& t, const char* name)
{
    std::cout << name << " = " << t << std::endl;
}
 
void printStruct(const S& s) {
    #define X(type, name) f(s.name, #name);
        STRUCT_FIELDS
    #undef X
}
 
int main(int argc, char* argv[]) {
    S s;
    s.i = 1;
    s.f = 10.1;
    s.c = "s";
 
    printStruct(s);
}
Результат работы программы:

i = 1
f = 10.1
c = s
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.02.2022, 23:44
Помогаю со студенческими работами здесь

Как перебрать все элементы QFileSystemModel ?
Есть два вопроса: 1) *.cpp modelFilesystem = new QFileSystemModel; modelFilesystem-&gt;setRootPath(&quot;/home/boris/Progzz/Test&quot;); ...

Как перебрать все элементы array?
Добрый день. При компиляции вот такого кода: DirectoryInfo^ info=gcnew DirectoryInfo(path); array&lt;FileInfo^&gt;^...

Как перебрать в цикле все элементы Dictionary
Итак, имеем: foreach (kl k in Dictionary) {} где Dictionary возвращает список, а k элемент типа...

Как перебрать все элементы многомерного массива C#
Как перебрать все элементы многомерного массива C# private static Array GetArray(int dimention, int size = 10, int min = 0, int...

Как перебрать все дочерние элементы body?
Сам думал и искал, ничего лучше не нашёл чем $(body.childNodes).each. Почему не работает и как перерать все дочерние элементы body?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru