Сохранение локальной переменной
Есть некая функция.
{
return &t;
}
Результат ~ я имею указатель на пустое место, ибо локальная переменная t была деконструирована по завершению функции.
А мне по заданию необходимо использовать этот указатель.
Ограничения:
параметр функции нельзя заменить на int& или int*.
нельзя выделять новую память.
[ например return memcpy(malloc(sizeof(int)),&t,sizeof(int)) ]
нельзя объявлять статические переменные
[ static int f = t ; return &f ; ]
И вот в чем дело: надо каким-то образом заблокировать удаление(деструктуризацию) из памяти локальной переменной t, оставив за ней память.
Тогда и из возвращенного указателя я смогу получить значение.
...
vector<int> mas1;
int num;
for(int i=0;i<n;i++){
cin>>num;
mas1.push_back(num);
}
// допустим ввели массив 1 5 5 5 5
for(int i=0;i<mas1.size();i++)
if (mas1 == 5)
{mas1.erase(mas1.begin() + i); }
for(int i=0;i<mas1.size(); i++){
cout<<mas1<<" ";
};
// выводит 1 5 5
// хотя должен вывести только 1.
// в чем дело?
Есть некая функция.
{
return &t;
}
Результат ~ я имею указатель на пустое место, ибо локальная переменная t была деконструирована по завершению функции.
А мне по заданию необходимо использовать этот указатель.
Ограничения:
параметр функции нельзя заменить на int& или int*.
нельзя выделять новую память.
[ например return memcpy(malloc(sizeof(int)),&t,sizeof(int)) ]
нельзя объявлять статические переменные
[ static int f = t ; return &f ; ]
И вот в чем дело: надо каким-то образом заблокировать удаление(деструктуризацию) из памяти локальной переменной t, оставив за ней память.
Тогда и из возвращенного указателя я смогу получить значение.
Верни из функции не ссылку а значение.
то есть
{
.............
.............
return iParam;
}
Зы: что, задание прям так и звучит?
...
vector<int> mas1;
int num;
for(int i=0;i<n;i++){
cin>>num;
mas1.push_back(num);
}
// допустим ввели массив 1 5 5 5 5
for(int i=0;i<mas1.size();i++)
if (mas1 == 5)
{mas1.erase(mas1.begin() + i); }
for(int i=0;i<mas1.size(); i++){
cout<<mas1<<" ";
};
// выводит 1 5 5
// хотя должен вывести только 1.
// в чем дело?
Дело в том что при каждом удалении размер вектора уменьшается на 1, следовательно mas1.size() после каждого удаления возвращает значение на 1 меньше, в результате цикл проходит меньше итераций чем тебе хотелось бы, решением послужит код типа:
if (mas1 == 5)
{
mas1.erase(mas1.begin() + i);
i=0;
}
Есть некая функция.
Это действительно такое задание или способ реализовать что-то. Если второе, то это не самый удачный способ.
Можно помучиться и действительно оставить эту переменную там, где она есть, чтобы на нее можно было указывать. Но стоит ли это делать?
Можно помучиться и действительно оставить эту переменную там, где она есть, чтобы на нее можно было указывать. Но стоит ли это делать?
Возможно вы правы. Дело в том, что если данный объект не удасться зафиксировать в памяти, то мне придется производить на 2 дейтсвия больше.
1) Выделить память под размер объекта.
2) Побитово скопировать объект в выделенную память
(gtype var) - передаваемый параметр.
И самое главное, ведь это уже было сделано автоматически при передаче параметра в функцию( т.е под объект была выделена память и он был скопирован). А после выхода из функции процессор еще и будет вынужден осводить память где находилась var.
Как вы понимаете, это пагубно скажется на скорости. Когда объектов 10000000 это еще ничего.
Но вот если 10^9(10,11) то хоть на стенку лезь.
А всего-то нужно запретит автоматическое освобождение памяти, где хранится переменная(gtype var)
А всего-то нужно запретит автоматическое освобождение памяти, где хранится переменная(gtype var)
Мда. Вообще, если вы хотите обработать такое количество объектов, то сомневаюсь, что это вас спасет.
А вообще я пока не совсем могу понять, зачем получать адрес переменной, которую вы передали в функцию? Расскажите в чем собственно состоит задача, и, возможно, найдется более элегантное решение.
Спасет.
Вот тут та и подвох - адрес точной копии.
Задача: реализовать максимально скоростной динамический массив C#. Т.е. сооветственно массив должен уметь сужаться и расширятся по торебованию.
Лучшему создателю - 2хЗачет+1хЭкзамен(5)+Уважуха.
Все сокурсники принялись описывать что-то типа класса с 2 массивами, из которых второй по требованию расширяется, затем все элементы первого перезаписываются во второй ну и т.д.
Я же рашил использовать unmanaged C++ std::vector.
Но вектор не может хранить managed структуры.
Поэтому он хранит указатели на данные объекты.
generic<typename gtype>
public ref class Vector
{
protected:
System::Type ^TY; //Получаем тип для извлечения managed объектов
vector<void*> *Vec; //Храним наши указатели
public:
Vector(System::Type ^TYPE) { TY=TYPE; Vec = new vector<void*>(); }
public:
INL void clear() { Vec->clear(); }
INL Boolean empty() { return Vec->empty(); }
INL int size() { return Vec->size(); }
INL void push_back(gtype var)
{ //Вот сдеся лишнее выделение памяти
Vec->push_back(memcpy(malloc(sizeof(gtype)),&var,sizeof(gtype)));
//В идеале было бы заменить его Vec->push_back((PVOID)&var)
}
INL void pop_back() { Vec->pop_back(); }
INL void insert(int pos, gtype var)
{ //И сдесь
if(pos<Vec->size())
{
Vec->insert(Vec->begin()+pos,memcpy(malloc(sizeof(gtype)),&var,sizeof(gtype)));
}
}
INL void erase (int pos) { if(pos<Vec->size()) Vec->erase(Vec->begin()+pos); }
INL gtype back() { return (gtype)Marshal::PtrToStructure((IntPtr)Vec->back(),TY); }
INL PVOID back(PVOID __null) { return Vec->back(); }
INL gtype front() { return (gtype)Marshal::PtrToStructure((IntPtr)Vec->front(),TY); }
INL PVOID front(PVOID __null) { return Vec->front(); }
INL gtype at(REG int pos) { return (gtype)Marshal::PtrToStructure((IntPtr)Vec->at(pos),TY); }
INL PVOID at(REG int pos,PVOID __null) { return Vec->at(pos); }
};
}
Всю остальную работу за вас сделает компилятор, оптимизировав код.
Всю остальную работу за вас сделает компилятор, оптимизировав код.
Вы должно быть имеете ввиду:
{
Vec->push_back((void*)var);
}
error C2440: 'type cast' : cannot convert from 'cli::interior_ptr<Type>' to 'void *'
Компилятор не понимает что var это адресс реального объекта. Он считает что var - это объект. А на самом деле объект - это var*.
Кроме того, в этом случае мы размещаем в векторе не указатель на копию, а указатель на исходник - что неправильно.
Лучшему создателю - 2хЗачет+1хЭкзамен(5)+Уважуха.
{
int n = 3;
return PAS(n);
}
Мужик, сила не в неуправляемом коде, забей на vector. Делай гибрид связанного списка и массива средствами C#: узлом списка может быть не только одно значение, но и несколько.
Мужик, сила не в неуправляемом коде, забей на vector. Делай гибрид связанного списка и массива средствами C#: узлом списка может быть не только одно значение, но и несколько.
Дело в том, что С++ я 2 года изучаю, а С# только 2 мес. Потому и пытаюсь все к С++ привязать.
За совет спасибо.