Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Указатель теряет свой адрес  (Прочитано 9375 раз)
0 Пользователей и 1 Гость смотрят эту тему.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 25-05-2005 13:45 » 

В функцию передаю массив pattern[4][4]
В VC6.0 при пошаговом исполнении я могу посмотреть его адрес. Ну так вот этот адрес в определенный момент изменяется на
0х00000001, хотя с массивом никаких действий не производилось. В чем дело и как мне это побороть
Вот сама функция
Код:
long** multarray(long triangle[3][3], long pattern[][4])
{


long temptriang[3][4];
long itogtriang[4][4];


int j;
for(int i=0;i<3;i++)
for( j=0;j<3;j++)
temptriang[i][j]=triangle[i][j];

for(i=0;i<4;i++)
temptriang[i][3]=1;

/// Вот здесь теряется  (изменяется адрес массива pattern[4][4])
for(i=0;i<4;i++)
for(j=0;j<4;j++)
itogtriang[i][j]=0;


for(int k=0;k<3;k++)
  for(i=0;i<4;i++)
  for(j=0;j<4;j++)
  {
  itogtriang[k][i]+=temptriang[k][j]*pattern[j][i];
  }
 for(i=0;i<3;i++)
 for(j=0;j<3;j++)
 triangle[i][j]=itogtriang[i][j];

 return (long **)triangle;// itogtriang[0];*/
}
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 25-05-2005 15:40 » 

Ошибку нашел УлыбаюсьУлыбаюсьУлыбаюсь.
Но возник "еще один вопрос" Улыбаюсь
я смог сделать вот это :
Код:
long **uk;
long mass[3][3];
uk=(long**)mass;
Это работает в отличие от варианта uk=mass;
Но вопросв том, как мне сделать что-то типа этого
Код:
long **uk;
long mass[3][3];
mass=uk;
Сами понимаете, что вышеизложенный код не работает, а как сделать правильно?
Записан

ещё один вопрос ...
LP
Помогающий

ru
Offline Offline

« Ответ #2 : 25-05-2005 17:21 » 

nikedeforest, не понятно зачем тебе возвращать triangle из функции. ИМХО triangle и так сохранит
все изменения которые произойдут с ним в самой функции.
« Последнее редактирование: 25-05-2005 17:23 от LP » Записан

Если эта надпись уменьшается, значит ваш монитор уносят
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 25-05-2005 17:30 » new

LP, я знаю, но Я затем этот адрес буду передавать в другую функцию и вызов этой функции будет параметром для другой. Надеюсь понятно объяснил.
Меня все таки интересует ответ на последний вопрос.
Записан

ещё один вопрос ...
LP
Помогающий

ru
Offline Offline

« Ответ #4 : 25-05-2005 19:16 » 

Цитата
LP, я знаю, но Я затем этот адрес буду передавать в другую функцию и вызов этой функции будет параметром для другой. Надеюсь понятно объяснил.
Но ведь адрес массива triangle ты можешь получить и вне функции, это будет тот же самый адрес.
Цитата
Меня все таки интересует ответ на последний вопрос.
ИМХО преобразования типов long** в long[][] и наоборот мягко говоря сомнительны.
Когда в функцию передается 2-хмерный массив, то он преобразуется в указатель на одномерный массив
т.е. long mass[3][4]  =>  long (*mass)[4]. Этот самый указатель на массив можешь спокойно возвращать
без всяких преобразований. Хотя он известен и без вызова этой функции.

Цитата
Код:
long **uk;
long mass[3][3];
uk=(long**)mass;
После этого преобразования все элементы массива mass будут трактоваться как указатели на long, если к
ним обращаться посредством uk. Т.е. каждый раз придется делать обратное преобразование (long)uk.

Цитата
long **uk;
long mass[3][3];
mass=uk;
Сами понимаете, что вышеизложенный код не работает, а как сделать правильно?
Ну если uk было полученно способом приведенном в предыдущей цитате, тогда так Ага
Код:
for(int i=0; i<3; i++)
 for(int j=0; j<3; j++)
  mass[i][j]=(long)(*(uk++));
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 25-05-2005 19:27 » 

LP, щас въеду как следует (надо вдуматься Улыбаюсь).
Цитата
Когда в функцию передается 2-хмерный массив, то он преобразуется в указатель на одномерный массив
Не знал, поэтому и сделал как писал, но если делать как ты пишешь,то функция возвращает просто указатель, т.е. long * вместо long **, я правильно понимаю?
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 25-05-2005 19:50 » 

Цитата

Ну если uk было полученно способом приведенном в предыдущей цитате, тогда так

Код:
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
  mass[i][j]=(long)(*(uk++));


Не, не то.
А почему нельзя делать так uk[i][j]? Ты не подумай, я проверил, делать так нельзя, но не понимаю почему. Я вообще - то думал, что mass[3][3] - mass-указатель напервый элемент и long **mass; затем выделяем память, получаем массив, тоже указатель на первый элемент. Разницу между ними на практике я усвоил (т.е. передача в функцию, возвращение), но в теории я этого не понимаю, вроде в обоих случаях указатель на первый элемент массива. Просвяти.
« Последнее редактирование: 14-04-2006 21:10 от Алексей1153 » Записан

ещё один вопрос ...
LP
Помогающий

ru
Offline Offline

« Ответ #7 : 25-05-2005 22:10 » 

Цитата
Я вообще - то думал, что mass[3][3] - mass-указатель напервый элемент и long **mass; затем выделяем память, получаем массив, тоже указатель на первый элемент.

Ну ты загнул :) Надеюсь я правильно тебя понял.
Все что идет далее это мое ИМХО:
Объявления long mass1[3][3] и long** mass2 далеко не одно и то же.
В первом случае выделяется память под хранение 3*3=6 элементов long, а во втором
выделяется память лишь для хранения одного указателя, который указывает на другой указатель,
который указывает на long :) Если указателю mass2 насильственно присвоить адрес первого элемента массива
(т.е. mass2=(long**)mass1) то он этот самый элемент будет трактовать как указатель на long,
а инструкция mass2[i][j] (что абсолютно аналогично *(*(mass2+i)+j)) извлечет i-й элемент массива
затем прибавит к нему j и разыменует(!!!) тут мы и получаем ошибку.

Указатель на первый элемент 2мерного массива объявляется так:
long (*p)[3]=mass;
Причем элементы 2мерного массива это не отдельные числа, а целые строки.
Напр.
long mass[4][3]={{1,2,3},
                 {4,5,6},
                 {7,8,9},
                 {10,11,12}};
p (или mass) будет указывать на первый элемент группы чисел 1 2 3,
p+1 (или mass+1) - на 4 5 6
p+2 (или mass+2) - на 7 8 9 и т.д.
Вроде так...
« Последнее редактирование: 14-04-2006 21:10 от Алексей1153 » Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines