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

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

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

« : 04-12-2004 14:38 » new


Почему так происходит

создаю функцию void func (long mass[3][8], long mass1[4][4])
а вот когда подставляю в качестве первого параметра переменную объявленную таким образом
long **mass;
mass=new long*[3];
for(int i=0;i<3;i++)
mass[i]=new long[8];

вываливается ошибка
cannot convert parameter 1 from 'long [3][8]' to 'long'

а если эту переменную объявить во так
long mass[3][8];
то проблем не будет.
« Последнее редактирование: 19-12-2007 18:31 от Алексей1153++ » Записан

ещё один вопрос ...
Dimka
Деятель
Команда клуба

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

« Ответ #1 : 04-12-2004 17:35 » 


1. Двумерный массив является массивом массивов. В случае, если он у тебя определён явно, компилятор однозначно понимает, что mass[i] является массивом типа long[8] и знает, как с ним работать. В случае long ** он не знает размерности массивов 1-го измерения, поэтому отказывается работать. Но это случай обратный твоему.

2. Ты пытаешься передать данные, преобразовав указатель указателя в массив. В общем случае, при инициализации массива ты мог бы потребовать выделения памяти для иных структур, тогда твой массив мог бы быть раскидан по нескольким несмежным участкам памяти. Конструкция mass[i][j] равнозначна *(*(m + i) + j), т.е. требует размещения массива целиком как непрерывного участка памяти. Поэтому компилятор "защищает" тебя от ошибок памяти, могущих возникнуть преобразования указателя в массив. Компилятор всякий массив рассматривает как указатель, но не рассматривает указатель как массив.
« Последнее редактирование: 14-04-2006 19:55 от Алексей1153 » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 04-12-2004 18:00 » 

nikedeforest,

делай так:

void func (long** mass, long** mass1) ;
Записан

nikedeforest
Команда клуба

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

« Ответ #3 : 04-12-2004 22:01 » 

не, это понятно, что так надо делать, мне причина непонятна была, думал вроде массив он и в Африке массив, оказалось, что нет Жаль
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 05-12-2004 06:33 » 

nikedeforest, потому что все массивы - одномерные Улыбаюсь А если собрать в кучу - получаются многомерные.

long** L; - это переменная типа "указатель на указатель на тип long" или  типа "указатель на на тип long*". То есть она может указывать на одномерный массив переменных типа:
long*

каждая переменная
long* Ln - это переменная типа "указатель на тип long" , то есть может указывать на массив переменных типа long.

одномерный массив одномерных массивов - получается двумерный массив
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines