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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать массив в функцию(*) 
:(
    Опции темы
GanZaleZ
Дата 19.11.2003, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



попробуй передать

int i[2][2];

f(i[2]);

поидее веть имя массифа яфляеца указателем на перфый элемент , а элементы перфого масива яфляюца указателями на вторые масифы ! smile.gif каламбур полнейший но работать фроде как должно smile.gif
А такая на фид простенькая задачка smile.gif У мя щас компилятора под рукой нету поэтому проферить немогу smile.gif

PM MAIL   Вверх
Ars
Дата 20.11.2003, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
элементы перфого масива яфляюца указателями на вторые масифы

Неверное представление о статических массивах. Двумерный статический массив на самом деле - одномерный, но его логически можно представить как двумерный. А если функция считает, что ей передали указатель на массив указателей, она возможно и отработает без эксцепшона, но все равно неправильно


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
GanZaleZ
Дата 20.11.2003, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну это ясево что он одномерный smile.gif федь если бы был четырехмерный то это не значить что он и в памяти по четырехмерному распологаеца smile.gif
PM MAIL   Вверх
Ars
Дата 21.11.2003, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Ну это ясево что он одномерный  федь если бы был четырехмерный то это не значить что он и в памяти по четырехмерному распологаеца 
biggrin.gif
Ну простите за неточность... Я имел ввиду, что он располагается в памяти одним непрерывным куском


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Freeman
Дата 1.12.2003, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может понравиться, все равно я не долго думал smile.gif)

#include <iostream.h>
void f(int **h, int a, int b)
{
int *s;
s=new int[a*b];
s=(int *)h;

for(int i=0; i<a; i++)
for(int j=0; j<b; j++)
cout << *(s + i*b + j) << ' ';
}

void main()
{
int a[2][4]={{1,2,3,4},{10,20,30,40}};

f((int**)a, 2, 4);
}
PM MAIL   Вверх
Freeman
Дата 1.12.2003, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



smile.gif


Это сообщение отредактировал(а) Freeman - 1.12.2003, 03:40
PM MAIL   Вверх
Ars
Дата 1.12.2003, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
int *s;
s=new int[a*b];
s=(int *)h;

Что это? wow.gif


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Freeman
Дата 1.12.2003, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Ars @ 1.12.2003, 10:44)
Цитата
int *s;
s=new int[a*b];
s=(int *)h;

Что это? wow.gif

Ну как что , создание динамического массива общей размерностью a*b, чтобы компилятор знал размер памяти на которую указывает s или h, это точно работает проверял
PM MAIL   Вверх
Ars
Дата 1.12.2003, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



С таким же успехом будет работать и следующий код, зато без утечек памяти smile.gif
Код
#include <iostream.h>
void f(int **h, int a, int b)
{
for(int i=0; i<a; i++)
for(int j=0; j<b; j++)
cout << *((int *)h + i*b + j) << ' ';
}

void main()
{
int a[2][4]={{1,2,3,4},{10,20,30,40}};

f((int**)a, 2, 4);
}



--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Freeman
Дата 2.12.2003, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну ладно согласен , будет работать, но важна идея smile.gif smile.gif
PM MAIL   Вверх
Hroft
Дата 8.12.2003, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



по-моему, неплох такой вариант:

#include <iostream>

void f(int **a,int n,int m)
{
std::cout<<a[0]<<std::endl;
for (int i=0;i<n;++i) {
for (int j=0;j<m;++j) {
std::cout<<a[i][j]<<" ";
}
std::cout<<std::endl;
}
}

typedef int *pint;

int main(int argc, char* argv[])
{
const int n = 3;
const int m = 2;
int i1[n][m] = {{1,2},{3,4},{5,6}};
int **i2 = new pint[n];
int **i3;
int i = 0;
for (i=0;i<n;++i) {
i2[i] = new int[m];
for (int j=0;j<m;++j) {
i2[i][j] = (n-1)*i + j + 1 + 100;
}
}
i3 = new pint[n];
for (i=0;i<n;++i) {
i3[i] = i1[i]; // скопировать только указатели, а не значения,
// так что невелика потеря времени и памяти
}
f(i2,n,m); //dynamic
f(i3,n,m); //static
return 0;
}
PM MAIL ICQ   Вверх
Mellorn
Дата 11.12.2003, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот вы все используете такую весч!
void tratata(int ** array) - сколько помню себя кодющим "**" было указателем на указтель.. это ведь не двойной массив... (во всяком случае мой компилятор матерится почем зря)

_________________________
С уважение Мэл. прошу обьясните мне эту фичу с ** =)
PM MAIL   Вверх
Mellorn
Дата 11.12.2003, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



P.S ->
Цитата
Неверное представление о статических массивах. Двумерный статический массив на самом деле - одномерный, но его логически можно представить как двумерный. А если функция считает, что ей передали указатель на массив указателей, она возможно и отработает без эксцепшона, но все равно неправильно

Полностью согласен потому и задал вопрос вышк
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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