Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Локальные копии переменных, С++ програмирование 
:(
    Опции темы
reddevil
Дата 4.7.2005, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.6.2005
Где: Украина. г.Днепро петровск

Репутация: нет
Всего: нет



Люди!
Есть вопрос, почему Функция, изменяет значение в масиве,
а не делает локальную копию?
вот пример:
Код

#include "stdafx.h"

using namespace std;

void resize(int []);

int _tmain(int argc, _TCHAR* argv[])
{
    int x[2]={5,10};
    
    cout<<"before in main:\n";
    cout<<"x0: "<<x[0]<<"\tx1: "<<x[1]<<endl;
    resize(x);
    cout<<"after in main:\n";
    cout<<"x0: "<<x[0]<<"\tx1: "<<x[1]<<endl;


    return 0;
}

void resize(int y[])
{
    cout<<"in resize, before resize:\n";
    cout<<"x0: "<<y[0]<<"\tx1: "<<y[1]<<endl;
    y[0]=10;
    y[1]=5;
    cout<<"in resize, after resize:\n";
    cout<<"x0: "<<y[0]<<"\tx1: "<<y[1]<<endl;
}


PM MAIL   Вверх
sergejzr
Дата 4.7.2005, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Потому что ты передал ей указатель на этот массив. Вот указатель и скопировался smile А сам массив остался там, где и был smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
reddevil
Дата 4.7.2005, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.6.2005
Где: Украина. г.Днепро петровск

Репутация: нет
Всего: нет



Если я правильно понимаю, то имя массива и есть указатель smile на него?
Тогда как объявить локальную копию, чтоб при выходе из функции массив
остался целым? smile
PM MAIL   Вверх
En_t_end
Дата 4.7.2005, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Во первых поставить квалификатор const("resize(const int y[])") - с этим компилятор убережет тебя если что... и просто в коде перед началом испольхования создать цикл присваивания типа токого:
for(unsigned long i = 0; i < sizeof(massiv); i++)
new_massiv[i] = massiv[i];
Здесь не происходит копирования адрессов, а происходит копирования значений, так как [] - это аналог разыменования *.
Этот способ так себе... потому что по-ламерски... (с приминением новых переменных)

Если в духе СИ, то можно написать так while(*massiv++ = *new_massiv++){} //ИМХО(за правильность не ручаюсь, сам пробывал раз - вроде за границы massiv не вылазиет, следовательно возрвращает эта операция значение BOOL)

PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.