Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
strannik15
0 / 0 / 2
Регистрация: 06.05.2015
Сообщений: 9
#1

Реализация ссылки на массив чисел в вызываемом модуле

14.05.2015, 16:33. Просмотров 829. Ответов 9
Метки нет (Все метки)

К примеру, если в main() создан динамический массив чисел.
Он передаётся в качестве входного параметра функции, которая вызывается из другого модуля.
В самом модуле, нужно сделать этот массив ссылкой, чтобы изменение внутри функции модуля
преобразовало значения передаваемого числа.
Как это реализовать грамотно.

C++
1
2
3
4
5
6
7
int main(void) {
int *Numbers = new int[10];
 
ModuleNameSpace::Function(Numbers);
 
return 0;
}
C++
1
2
3
4
void Function(int* (&theNumbers) ) // Так правильно?
{
 /* ... */
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2015, 16:33
Ответы с готовыми решениями:

Где в модуле объявить динамический массив?
Здравствуйте. Объясните пожалуйста, как объявляется массив в классе. Допустим...

Как поставить поставить точку останова в вызываемом из библиотеки модуле?
Уважаемые Гуру! В режиме отладки Visual Studio возникает задача...

Картинки как ссылки в модуле
здравствуйте, как можно разместить в модуле картинки - ссылки?

Реализация метода класса в другом модуле
Имеется Unit1 с формой Form1 типа TForm1. У типа TForm1 описан метод procedure...

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

9
xEmpire
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
14.05.2015, 16:46 #2
Numbers = адрес первого элемента массива.
Зачем вам амперсант?
0
strannik15
0 / 0 / 2
Регистрация: 06.05.2015
Сообщений: 9
14.05.2015, 17:01  [ТС] #3
Амперсанд я хочу использовать не как адрес, а как ссылку на число.
Только пока не пойму как.
0
xEmpire
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
14.05.2015, 22:21 #4
Лучший ответ Сообщение было отмечено strannik15 как решение

Решение

C++
1
int *Numbers = new int[10];
- указатель на массив типа int.
Numbers содержит адрес первого элемента динамического массива, размерностью 10 ед.
Разыименовав указатель вы получите доступ к элементу, адрес которого хранит указатель.
C++
1
2
3
4
5
void Function(int* array, int size); 
.
.
.
ModuleNameSpace::Function(numbers, 10);
Если бы numbers был бы массивом, хранящимся в стеке, а не в куче, то нужно было бы писать
C++
1
ModuleNameSpace::Function(&numbers, 10);
1
strannik15
0 / 0 / 2
Регистрация: 06.05.2015
Сообщений: 9
15.05.2015, 21:02  [ТС] #5
Эксперементируя, я заметил, что массив в куче в gcc(g++) версии 4.9.2 20150212 (Red Hat 4.9.2-6) после нормальных значений
хранит в себе какой-то непонятный мусор. Это явный баг и теперь надо быть осторожней в циклах, более строго следя за тем
аргументом, который, по идее, должен быть последним, а по факту, таковым не является.
0
DrOffset
7962 / 4628 / 1125
Регистрация: 30.01.2014
Сообщений: 7,526
15.05.2015, 21:09 #6
Цитата Сообщение от strannik15 Посмотреть сообщение
Эксперементируя, я заметил, что массив в куче в gcc(g++) версии 4.9.2 20150212 (Red Hat 4.9.2-6) после нормальных значений хранит в себе какой-то непонятный мусор.
После последнего элемента? Это нормально.
Код покажи.
0
strannik15
0 / 0 / 2
Регистрация: 06.05.2015
Сообщений: 9
15.05.2015, 21:20  [ТС] #7
Названия файлов не соответствует содержанию. Следствие очень долгих экспериментов.
main.cpp
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
#include <iostream>
#include <locale.h>
#include "StringToChars.h"
 
 
using namespace std;    // Стандартное пространство имён.
 
 
int main(void) {
    setlocale(LC_ALL, "ru_RU.utf8");    // Устанавливаем нужную кодировку и русский язык.
  
    int Data = 0;
    StringToCharsNameSpace::FunctionOneInt(Data);
    cout << Data << endl;
    
    int *Datas;
    StringToCharsNameSpace::FuntionInts(Datas);
    for (int x = 0; x < 10; x++) // Тут надо строго определяться с границей массива,
      // т.к. в g++ компилятора GCC версии 4.9.2 20150212 (Red Hat 4.9.2-6)
      // к концу массива прикрепляется какой-то мусор.
      // сравнение с '\0' тут не катит, т.к. эквивалентно 0.
    {
      cout << (Datas[x]) << endl;
    };
  
  return 0;
}
StringToChars.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef StringToCharsH
#define StringToCharsH
 
namespace StringToCharsNameSpace {
 
 
  void FunctionOneInt(int &theDataInt);
  
  void FuntionInts(int *&theDatas );
  
}
 
#endif
StringToChars.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "StringToChars.h"
#include <iostream>
 
namespace StringToCharsNameSpace {
  
  using namespace std;
  
  
  void FunctionOneInt(int &theDataInt)
  {
    theDataInt = 4;
  }
  
  void FuntionInts(int *&theDatas )
  {
    for (int i = 0; i < 10; i++)
    {
      theDatas[i] = i*i + 1;
      cout << '\t' << theDatas[i] << endl;
    };
  }
  
};
Это пример нормальной программы, но как только в последнем файле убрать контроль до 10 элементов и поставить
другой способ "определения конца массива" начинается выдача "лишних" результатов.
0
DrOffset
7962 / 4628 / 1125
Регистрация: 30.01.2014
Сообщений: 7,526
15.05.2015, 21:46 #8
Цитата Сообщение от strannik15 Посмотреть сообщение
но как только в последнем файле убрать контроль до 10 элементов и поставить
другой способ "определения конца массива" начинается выдача "лишних" результатов.
Другого способа не существует.
Никакой мусор не прикрепляется, он там сразу есть . За границей массива может быть что угодно. И это не особенность GCC, и уж тем более не баг.
Проверка на ноль в конце годится только для С-строк. Причем это искусственное требование, обусловленное принятыми соглашениями. По факту никто не запретит сделать массив символов без нулевого символа в конце.

Добавлено через 1 минуту
strannik15, кстати память-то в этом коде ты нигде не выделяешь.
0
strannik15
0 / 0 / 2
Регистрация: 06.05.2015
Сообщений: 9
16.05.2015, 08:26  [ТС] #9
А откуда берётся эта дополнительная информация у массивов?
Или просто программа читает какую-то произвольную память, не связаннную, непосредственно с самим массивом?
0
DrOffset
7962 / 4628 / 1125
Регистрация: 30.01.2014
Сообщений: 7,526
16.05.2015, 12:33 #10
Цитата Сообщение от strannik15 Посмотреть сообщение
А откуда берётся эта дополнительная информация у массивов?
Куча - это область памяти, в которой размечаются блоки. Отвечает за это менеджер памяти. Блок, который ты запросил, помечается как занятый и возвращается указатель на его начало. Следовательно, если ты зашел за выделенный размер, ты можешь попасть в другой занятый отрезок или в незанятую никем память.
1
16.05.2015, 12:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2015, 12:33

Сохранение ссылки на созданный в общем модуле документ в реквизите другого документа: Объект не найден.
Всем привет! Dethmontt, не сердитесь, пожалуйста.:- Новая беда. Я в общем...

Китайские иероглифы в вызываемом окне
В функции вызова диалога выбора папки, надписи на диалоге вылазят иероглифами...

Пространство имён вызывающего модуля в вызываемом
Товарищи. А можно как-нибудь получить доступ к переменным импортирующего...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru