Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491

Не могу создать структуру с указателями

14.01.2020, 15:17. Показов 1533. Ответов 13

Студворк — интернет-сервис помощи студентам
Добрый день,
Хочу создать структуру в которой память на поля выделяется динамически.
Я знаю, что создав динамический массив, можно заполнять его и увеличивать его размер например так:
C++
1
2
3
qint32 *p = new qint32;
p[0] = 0;
p[1] = 1;
Мне надо подобное сделать, чтобы p была полем сруктуры, например:
C++
1
2
3
4
5
6
template <typename T>
struct equalVal_struct {
    quint32 uvalSize;
    quint32 *p, *ind; // здесь [B]р[/B] поле структуры
    T *uval = new T;
};
Но если я создам эту структуру, то я не могу получить доступ элементам p (так как я делал ранее):
C++
1
2
3
4
5
6
int main()
{
    equalVal_struct<qint32> *outData = nullptr;
    outData->count[0] = 0; // уже здесь вылазит ошибка
    outData->count[1] = 1;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2020, 15:17
Ответы с готовыми решениями:

Как создать структуру, где будут поля с указателями на эту же структуру?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; typedef struct DoubleQueue { queue* ar; queue* al; int data; }...

Как создать 2-ое дерево со значениями 1-го? Не могу разобраться с указателями
Вот код(недоработанный): #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; struct sNode { int...

Незадача с указателями на структуру
Всем привет, у меня проблема с одним заданием. Значит звучит оно так. Надо создать массив на 10, потом сделать так, что бы каждый элемент...

13
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,406
14.01.2020, 15:24
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
Я знаю, что создав динамический массив, можно заполнять его и увеличивать его размер например так:
Может не надо так делать?

Добавлено через 2 минуты
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
outData->count[0] = 0; // уже здесь вылазит ошибка
В структуре поле count нет, вот и ошибка вылазит.

Добавлено через 1 минуту
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
equalVal_struct<qint32> *outData = nullptr;
Может так не надо тоже делать?
1
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
14.01.2020, 15:53  [ТС]
SomniPhobia, я понимаю, что это неэффективно, но для общего развития я пытаюсь довести идею до конца. Если можно, напишите, пожалуйста, как исправить ошибки чтобы реализовать замысел
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,406
14.01.2020, 16:09
Kerim_Geophysic, p и ind это контейнеры или одинарные переменные?

Добавлено через 21 секунду
uval что такое?

Добавлено через 1 минуту
Опиши что есть каждое из полей структуры.

Добавлено через 1 минуту
Количество элементов в outData известно заранее?

Добавлено через 2 минуты
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
C++
1
2
3
qint32 *p = new qint32;
p[0] = 0;
p[1] = 1;
Кто тебя научил так писать?

Добавлено через 6 минут
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
Если можно, напишите, пожалуйста, как исправить ошибки чтобы реализовать замысел
Я не знаю замысла.
0
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
14.01.2020, 17:54  [ТС]
SomniPhobia, мне кажется я очень плохо сформулировал вопрос. Давайте отвлечемся от вышенаписанного кода, так как там все плохо.

Вот моя задача:
Есть одномерный массив (или вектор) значений inData (наиболее вероятно это динамический массив), представленный любым численным типом (например int). Цифры могут повторяться в любом порядке. Необходимо написать функцию, которая будет возвращать уникальные значения этого массива (без сортировки значений) в переменной uval, тип которой, такой же как и тип inData, а также необходимо вернуть индексы всех значений из переменной inData соответствующие уникальным значениям uval.

Вот замысел для решения этой задачи (этот замысел я хочу реализовать только для собственного развития, так как он неэффективен):
Подаем массив inData в качестве входного параметра функции findIndOfEqualVal. Размер этого массива храним в переменной quint32 N.
Функция findIndOfEqualVal создает структуру, состоящую из динамических массивов quint32 *count, *ind;
ind[i][j] - это индекс inData, такой что inData[ind[i][j]] = uval[i]. Так как каждому уникальному значению uval[i] может соответствовать множество inData, то индексы ind должны быть представлены двумерным массивом, где количество строк равно количеству уникальных элементов, а количество столбцов равно количеству значений inData соответствующих одному uval[i].
Так как мы можем создать двумерный массив только прямоугольной формы (N на M), то необходимо знать сколько значений заполнено в каждой строке ind. Эту задачу решает count. То есть count[i] - это количество значений inData соответствующих одному уникальному значению uval[i].

Факторы, затрудняющие решение:
Мы не знаем сколько уникальных значений в массиве inData , мы не знаем сколько значений inData соответствуют каждому уникальному значению uval[i]. Поэтому будем использовать динамические массивы (это неэффективно, но важно для моего обучения). Хотя можно было бы предположить, что размер массива uval не превышает размера inData . Массив ind должен быть двумерным.

Моя реализация (не работает, естесственно):
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <QCoreApplication>
 
template <typename T> // СОЗДАЮ СТРУКТУРЫ ДЛЯ ХРАНЕНИЯ ДАННЫХ И ВЫВОДА РЕЗУЛЬТАТА
struct equalVal_struct {
    quint32 uvalSize;
    quint32 *count, *ind;
    T *uval = new T;
};
 
template <typename T> // РЕАЛИЗУЮ АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ
T findIndOfEqualVal(T *inData, quint32 N){
    equalVal_struct<T> outData;
    T val;
 
    for (quint32 i = 0; i < N; i++){
        val = inData[i];
        if (i != 0){
            quint32 ii = 0;
            bool trig = 0;
            while (ii < outData.uvalSize || trig == 0){
                if (val == outData.uval[ii]){
                    outData.count[ii] = outData.count[ii] + 1;
                    outData.ind[ii][outData.count[ii] - 1] = i;
                    trig = 1;
                    ii++;
                }
            }
            if (ii == outData.uvalSize-1 && trig == 0){
                outData.uvalSize = outData.uvalSize + 1;
                outData.count[ii + 1] = 1;
                outData.ind[ii + 1][0] = i;
                outData.uval[ii + 1] = val;
            }
        } else {
            outData.uvalSize = 1;
            outData.count[0] = 1;
            outData.ind[0] = 0;
            //outData.uval = val;
 
        }
    }
    return outData; // хочу вернуть заполненную структуру
}
 
int main() // СОЗДАНИЕ НАЧАЛЬНОГО МАССИВА И ТЕСТ КОДА
{
    qint32 inData[] = {2, 7, 5, 2, 3, 6, 2, 7, 2, 9, 3, 8, 2, 3, 1, 6, 7, 5, 4, 6}; // создаю данные для теста
    outData = findIndOfEqualVal(inData, 20); // 20 - размер массива inData
}
Помогите, пожалуйста разобраться, как в моем случае использовать шаблон структуры equalVal_struct и шаблон функции findIndOfEqualVal(), чтобы в функции main() получить структуру outData содержащую указанные поля. И как создать эти динамические массивы в структуре...
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
14.01.2020, 18:33
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
C++
1
2
3
qint32 *p = new qint32;
p[0] = 0;
p[1] = 1;
Что ты сделал:


1. Оператором new выделил где-то в памяти место для ОДНОГО qint32, и поместил адрес этого места в переменную p
2. Используя p как указатель на массив (а не на как указатель на ОДИН элемент) записал 0 в первый элемент массива.
3. Используя p как указатель на массив записал 1 во второй элемент массива. НО!!! Нам выделили место только для ОДНОГО элемента. На том месте, где ты считаешь что есть второй элемент, расположены какие-то другие данные.

Правильно делать так:

C++
1
2
qint32 *p = new qint32;
*p = 123;
C++
1
2
3
4
5
const size_t N = 10;
qint32 *p = new qint32[N];
for(size_t i = 0; i < N; ++i) {
  p[i] = i*10;
}
2
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
14.01.2020, 18:42  [ТС]
AlexVRud, спасибо за разъяснение!
А если я не знаю размер массива p и в процессе работы функции массив может увеличиваться?
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
14.01.2020, 19:03
Совсем не знать размер массива не получиться. Обрабатывающая функция должна получить не только массив, но и его размер.
Например foo(int *xs, int size) или bar(const std::vector<int> &xs) в последнем случае std:: vector хранит и данные и размер внутри себя
1
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
14.01.2020, 19:08
Цитата Сообщение от AlexVRud Посмотреть сообщение
Совсем не знать размер массива не получиться.
Ну почему же?) Можно перебирать пока система не даст сигнал не читаемой памяти)

Добавлено через 35 секунд
Только при этом надо придумать способ фильтрации мусора
0
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
14.01.2020, 19:10  [ТС]
AlexVRud, мне кажется я понимаю, что когда я передаю в функцию в качестве параметра массив, то я тем или иным способом должен передать и его размер.
Но внутри функции (в моем случае внутри структуры), разве я не могу создать создать переменную (поле) указывающую на двумерный динамический массив, размер которого может изменяться в процессе работы этой функции?
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
14.01.2020, 19:48
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
Но внутри функции (в моем случае внутри структуры), разве я не могу создать создать переменную (поле) указывающую на двумерный динамический массив, размер которого может изменяться в процессе работы этой функции?
Зачем придумывать велосипед? std::vector
2
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
15.01.2020, 01:29  [ТС]
AndryS1, С векторами стало полегче, спасибо
Остался один вопрос, как вернуть структуру типа T? В коде ниже я использую вектора, но только размер одномерных векторов я смог увеличивать. Увеличение размера двумерных векторов я вроде бы понял (надо в пашбэк записывать не число, а вектор), но применительно к моей задаче возникают трудности видимо (и ладно).
Подскажите, пожалуйста, что изменить в коде ниже, чтобы из функции findIndOfEqualVal() вернуть структуру outData?
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <QCoreApplication>
#include <QVector>
 
template <typename T> // СОЗДАЮ СТРУКТУРЫ ДЛЯ ХРАНЕНИЯ ДАННЫХ И ВЫВОДА РЕЗУЛЬТАТА
struct equalVal_struct {
    quint32 uvalSize;
    QVector<quint32> count;
    QVector<QVector<quint32> > ind;
    QVector<T> uval;
};
 
template <typename T> // РЕАЛИЗУЮ АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ
void findIndOfEqualVal(T *inData, quint32 N){
    equalVal_struct<T> outData;
    T val;
 
    for (quint32 i = 0; i < N; i++){
        val = inData[i];
        if (i != 0){
            quint32 ii = 0;
            bool trig = 0;
            while (ii < outData.uvalSize || trig == 0){
                if (val == outData.uval[ii]){
                    outData.count[ii] = outData.count[ii] + 1;
                    outData.ind[ii][outData.count[ii] - 1] = i;
                    trig = 1;
                    ii++;
                }
            }
            if (ii == outData.uvalSize-1 && trig == 0){
                outData.uvalSize = outData.uvalSize + 1;
                outData.count.push_back(1);
                outData.ind[ii + 1][0] = i;
                outData.uval.push_back(val);
            }
        } else {
            outData.uvalSize = 1;
            outData.count.push_back(1); // вот здесь стало нормально работать
            outData.ind[0][0] = 0; // по аналогии можно было бы и здесь делать, но столкнулся с некоторыми проблемами. Отложил это дело
            outData.uval.push_back(val);
 
        }
    }
}
 
int main() // СОЗДАНИЕ НАЧАЛЬНОГО МАССИВА И ТЕСТ КОДА
{
    qint32 inData[] = {2, 7, 5, 2, 3, 6, 2, 7, 2, 9, 3, 8, 2, 3, 1, 6, 7, 5, 4, 6};
    findIndOfEqualVal(inData, 20);
}
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,991
15.01.2020, 08:03
Лучший ответ Сообщение было отмечено Kerim_Geophysic как решение

Решение

Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
чтобы из функции findIndOfEqualVal() вернуть структуру outData

C++
1
2
3
4
5
6
7
8
template <typename T>
equalVal_struct<T> findIndOfEqualVal(const T *inData, quint32 N)
{
    equalVal_struct<T> outData;
    ...
    ...
    return outData;
}
Добавлено через 3 минуты
и вроде переменная quint32 uvalSize; больше не нужна. А если и нужна - нужно инициализировать
2
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
15.01.2020, 18:16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
А если и нужна - нужно инициализировать
Можно и без инициализации, тогда на форуме актива будет больше)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2020, 18:16
Помогаю со студенческими работами здесь

Не могу создать структуру _SHELLEXECUTEINFO для использования в функции ShellExecuteEx_
Понадобилось мне использовать функцию ShellExecuteEx, но у меня не получилось правильно сделать структуру SHELLEXECUTEINFO. Подскажите...

Инициализировать структуру указателями на строки
Добрый вечер, у меня задача - достать дескриптор принтера и отправить ему на печать файл .bmp. Дескриптор у меня получить удается, но...

Как создать структуру-список, поля которой — ссылка на такую же структуру
Суть вопроса в том, как создать структуру-список, поля которой - ссылка на сл. элемент(такую же структуру) и ссылка на объект, относящийся...

Не могу разобраться с указателями
Здраствуйте все вот короче мне задали задачки на Си написать вот они собствено : 1.Даны два массива, упорядоченных по возрастанию: А и B....

Си, не могу разобраться с указателями
Здравствуйте, проблема с функцией sort, компилятор ругается на указатели, не могу разобраться. #include &lt;stdio.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru