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

Как по указателю на массив, получить весь массив?

25.03.2023, 13:00. Показов 1584. Ответов 24
Метки нет (Все метки)

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

Есть массив и указатель на массив

C++
1
2
3
4
5
6
7
8
9
10
    
GLfloat vertices[] = {
           -0.5, -0.5, 0.0,
            0.5, -0.5, 0.0,
            0.0, 0.5, 0.0
    };
 
GLfloat* vert;
 
vert =  vertices;
Сейчас указатель vert указывает на первый элемент массива.

Как по указателю получить весь массив?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.03.2023, 13:00
Ответы с готовыми решениями:

как корректно выводить массив, если не заполнил весь массив
Пишу класс полином, взял размер массива как static const, но не могу найти выход чтоб при выводе выводил только заполненную часть а не до...

Как записать Имена Листов в массив, а потом вне цикла вывести весь массив.
Здравствуйте, очень надеюсь на вашу помощь, не получается в цикле произвести запись Имени Листа в массив, а потом вне цикла вывести весь...

Массив: Отсортировать полученный массив 3 способами: по строкам, по столбцам( возр.), 3) и весь массив
Помогите, пожалуйста ,решить задачу. Очень нужно. Задан массив (4*6). Элементы задаются по правилу: если j>3, то Aij=i+j, иначе...

24
 Аватар для Наталья8
620 / 378 / 67
Регистрация: 09.03.2016
Сообщений: 4,070
25.03.2023, 13:08
Ни как. Надо иметь переменную в которой будет его размер...

Добавлено через 1 минуту
Для строковых массивов есть нуль терминатор.
0
0 / 0 / 0
Регистрация: 20.11.2018
Сообщений: 43
25.03.2023, 13:11  [ТС]
Размер можно получить

C++
1
int sz = sizeof(vert);
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
25.03.2023, 13:13
Цитата Сообщение от ps12 Посмотреть сообщение
Как по указателю получить весь массив?
Никак, приведение к указателю - одностороннее.
Если знаете размер, можно сделать приведение типа.

C++
1
2
3
4
5
6
7
8
9
10
    using GLfloat = float;
    GLfloat vertices[] = {
           -0.5, -0.5, 0.0,
            0.5, -0.5, 0.0,
            0.0, 0.5, 0.0
    };
 
    GLfloat (*vert)[9] = reinterpret_cast<GLfloat(*)[9]>(&vertices);
    for(auto v : *vert)
        cout << v << ' ';
Добавлено через 36 секунд
Цитата Сообщение от ps12 Посмотреть сообщение
int sz = sizeof(vert);
Вы получите размер указателя.
0
0 / 0 / 0
Регистрация: 20.11.2018
Сообщений: 43
25.03.2023, 13:21  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
    GLfloat vertices[] = {
        -0.5, -0.5, 0.0,
            0.5, -0.5, 0.0,
            0.0, 0.5, 0.0
    };
 
    
    GLfloat* verts;
 
    verts = vertices;
 
    const int s = sizeof(verts);    //Отладчик показывает s = 8
Забыл указать, что это Visual studio 2022

Добавлено через 54 секунды
Ступил
8 это видимо размер указателя.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
25.03.2023, 13:35
Цитата Сообщение от SmallEvil Посмотреть сообщение
GLfloat (*vert)[9] = reinterpret_cast<GLfloat(*)[9]>(&vertices);
Какой то сонный у меня пример, что бы получить указатель на массив, никакого приведения не нужно.
C++
1
    GLfloat (*vert)[9] = &vertices;
Оно нужно если приводить указатель на первый элемент.
C++
1
2
    GLfloat * v = vertices;
    GLfloat (*vert)[9] = reinterpret_cast<GLfloat(*)[9]>(v);
В любом случае, берите явный указатель на массив, или связка (указатель. размер).
0
0 / 0 / 0
Регистрация: 20.11.2018
Сообщений: 43
25.03.2023, 13:38  [ТС]
Вот это не понял

C++
1
GLfloat (*vert)[9] = reinterpret_cast<GLfloat(*)[9]>(&vertices);
Мне надо получить массив из указателя, а не из массива.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.03.2023, 13:42
ps12, ключевой вопрос - зачем? Какую проблему решаете?
0
0 / 0 / 0
Регистрация: 20.11.2018
Сообщений: 43
25.03.2023, 13:48  [ТС]
Объясняю подробнее.

есть структура и вектор

C++
1
2
3
4
5
6
7
    struct vert {
        unsigned int objID;
        GLfloat* verticles;     //Указатель на массив
        int vert_size;            //Размер массива
    };
 
    std::vector <vert> objList;    //Вектор

Мне надо в цикле закидывать массив в видеокарту с помощью процедуры

C++
1
2
 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
В третий параметр надо передавать весь массив, а не только первый элемент.
0
фрилансер
 Аватар для Алексей1153
6466 / 5680 / 1131
Регистрация: 11.10.2019
Сообщений: 15,124
25.03.2023, 13:51
Цитата Сообщение от ps12 Посмотреть сообщение
int vert_size;            //Размер массива
а это для красоты ? ))
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.03.2023, 13:54
Лучший ответ Сообщение было отмечено ps12 как решение

Решение

Цитата Сообщение от ps12 Посмотреть сообщение
В третий параметр надо передавать весь массив, а не только первый элемент.
Цитата Сообщение от ps12 Посмотреть сообщение
//Размер массива
Если это размер массива verticles (в "штуках" типа GLfloat), то
C++
1
2
vert const & v = objList[i];
glBufferData(GL_ARRAY_BUFFER, v.vert_size * sizeof(GLfloat), v.verticles, GL_STATIC_DRAW);
0
0 / 0 / 0
Регистрация: 20.11.2018
Сообщений: 43
25.03.2023, 13:55  [ТС]
Это все заполняется при создании строки вектора

C++
1
2
3
4
5
    vert v;
    v.objID = 0;
    v.verticles = vertices;
    v.vert_size = sizeof(vertices);
    objList.push_back(v);
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.03.2023, 13:56
Цитата Сообщение от ps12 Посмотреть сообщение
v.vert_size = sizeof(vertices);
Тогда убери умножение на sizeof(GLfloat) из моего поста.
0
0 / 0 / 0
Регистрация: 20.11.2018
Сообщений: 43
25.03.2023, 14:00  [ТС]
C++
1
2
vert const & v = objList[i];
glBufferData(GL_ARRAY_BUFFER, v.vert_size * sizeof(GLfloat), v.verticles, GL_STATIC_DRAW);
Сработало!
Спасибо!
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.03.2023, 14:02
Цитата Сообщение от ps12 Посмотреть сообщение
Сработало!
Не-не-не! Не гони лошадей. Вот тут:
Цитата Сообщение от ps12 Посмотреть сообщение
C++
1
2
3
4
5
    vert v;
    v.objID = 0;
    v.verticles = vertices;
    v.vert_size = sizeof(vertices); 
    objList.push_back(v);
Что такое vertices?
0
0 / 0 / 0
Регистрация: 20.11.2018
Сообщений: 43
25.03.2023, 14:14  [ТС]
Массив, указан в первом посте

C++
1
2
3
4
5
    GLfloat vertices[] = {
        -0.5, -0.5, 0.0,
            0.5, -0.5, 0.0,
            0.0, 0.5, 0.0
    };
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.03.2023, 14:17
Цитата Сообщение от ps12 Посмотреть сообщение
Массив, указан в первом посте
Тогда умножение на sizeof(GLfloat) будет ошибкой, у тебя уже размер в байтах. Правильно так:
C++
1
2
vert const & v = objList[i];
glBufferData(GL_ARRAY_BUFFER, v.vert_size, v.verticles, GL_STATIC_DRAW);
И еще один важный момент: где объявлен массив vertices, в глобальной области или внутри функции?
0
0 / 0 / 0
Регистрация: 20.11.2018
Сообщений: 43
25.03.2023, 14:23  [ТС]
Пока внутри функции, но я его перенесу либо в private либо public.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.03.2023, 14:25
Цитата Сообщение от ps12 Посмотреть сообщение
Пока внутри функции, но я его перенесу либо в private либо public.
Тогда после завершения этой функции ты не имеешь права использовать указатели, сохраненные в objList. Они "протухнут".
Но если ты вызываешь glBufferData в той же функции (точнее, в том же или вложенном в него блоке), то эта функция скопирует данные в память GPU, все норм.
0
0 / 0 / 0
Регистрация: 20.11.2018
Сообщений: 43
25.03.2023, 14:28  [ТС]
Вектор тоже будет либо private, либо public
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2023, 14:28
Помогаю со студенческими работами здесь

Дан массив, состоящий из 15 элементов целого типа. Получить новый массив, как разность между элементами исходного массив
Дан массив, состоящий из 15 элементов целого типа. Получить новый массив, как разность между элементами исходного массива и его среднего...

Почему нельзя присвоить указатель на динамический массив указателю на массив:
здравствуйте. Не подскажете, почему нельзя присвоить указатель на динамический массив указателю на массив: int (*p); int arr=new...

Создать массив указателей. Присвоить каждому указателю значение элемента массива. Вывести на экран массив с использовани
Создать массив указателей. Присвоить каждому указателю значение элемента массива. Вывести на экран массив с использованием указателей. на...

Введенные значения из формы запоминаются в массив только в первый элемент, а не в весь массив
public void operator_Click(object sender, EventArgs e) { Button op = (Button)sender; ch.Text = &quot;...

Переписать в массив А2 весь массив А1, если в А1 найдется возрастающая последовательность не менее чем из 4 чисел
задать массив А1 с помощью генератора случайных чисел. Переписать в массив А2 весь массив А1, если в А1 найдется возрастающая...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru