powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача массивов в функции
25 сообщений из 73, страница 1 из 3
Передача массивов в функции
    #38539510
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Хотел динамическое выделять памяти для массивов вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	int* array;
	int array_i, array_j;
	cout << "Enter array count:";
        cout << "i:"; cin >> array_i;
        cout << "j:" ; cin >> array_j;
        cout << endl;
	
        array = new int[array_i,array_j];



Теперь как можно отправить этого массива в функции?
Мой вариант так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
#include <iostream>
using namespace std;

void add_mas(int mas[][], int mas1[][]);

int main()
{
	int* array;
        int* array1;
	int array_i, array_j;

	cout << "Enter array count:";
        cout << "i:"; cin >> array_i;
        cout << "j:" ; cin >> array_j;
        cout << endl;
	
        array = new int[array_i,array_j];
        array1 = new int[array_i,array_j];
	
	for (int i=0; i<=array_i; i++)
	{
		for (int j=0; j<=array_j; j++)
		{
			array[i,j] = 1;
			array1[i,j] = 2;
		}	
    }
    
    add_mas(array, array1);
    
    return 0;
}

void add_mas(int mas[][], int mas1[][])
{
	// операция с массивами
}


Как можно правильно организовать эту задачу? И еще как можно организовать возвращение массивов из функции?
Заранее спасибо!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539597
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

Так у тебя всё правильно написано, в чём проблема-то ?

Хотя двумерные массивы не будут так легко работать, на сколько я помню.
Т.е. в функции тебе придётся вычислять смещения в массиве руками.
Ну, и если размерности массивов переменные, тебе нужно передавать и их.
Так что я бы объявлял функцию так:

Код: plaintext
1.
void add_mas( int mas[], size_t m, size_t n, int mas1[], size_t m1, size_t n1 );
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539644
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
Я ценю вашего мнении, но в этом случае функция не примут аргумент, так как определена одномерный массив, а отправляется двухмерный массив.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539665
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

При передаче массивов любой размерности реально передаётся только указатель на первый элемент передаваемого массива.
И при этом ему пофигу какая там размерность массива.

Кстати, ты бы указал дополнительно, какой язык ты используешь -- C или C++...
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539666
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя я могу про массивы что-то путать, поверь, очень редко в С++ используются многомерные массивы.
Я перепроверю.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539669
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
Да конечно, многомерные массивы может редко используются. Но это не значит, что на мой задачи нет решения!.
P.S. Использую С++, компилятор Dev C++.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539670
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlimkulovMasterZiv,
Да конечно, многомерные массивы может редко используются. Но это не значит, что на мой задачи нет решения!.В С++ предпочитают использовать объекты хранящие списки (list, vector и подобные). Массивы напрямую предпочитают не использовать вообще.

AlimkulovP.S. Использую С++, компилятор Dev C++.Это у тебя текстовый редактор Dev C++. А компилятор скорее всего GNU C++ из пакета MinGW.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539683
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlAlimkulovMasterZiv,
Массивы напрямую предпочитают не использовать вообще.

Я с Вами не соглашаюсь!
Массивы - это полезный тип данных, используемый в различных ситуациях.

AlimkulovP.S. Использую С++, компилятор Dev C++.Это у тебя текстовый редактор Dev C++. А компилятор скорее всего GNU C++ из пакета MinGW.
Да именно так!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539801
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

вся штука в том, что у тебя создается видимость, что ты работаешь с двухмерными массивами.

вот ты пишешь

Код: plaintext
1.
new int[array_i,array_j];



а на самом деле эта запись означает

Код: plaintext
1.
new int[array_j];



далее ты пишешь

Код: plaintext
1.
array[i,j] = 1;


а на самом деле это

Код: plaintext
1.
array[j] = 1;


мистика? нисколько, всего лишь оператор запятая.

Итого, все твои потуги тщетно провалились.

Но, ты всегда можешь работать с одномерными массивом как многомерным:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        int* array;
	int array_i, array_j;
	cout << "Enter array count:";
        cout << "i:"; cin >> array_i;
        cout << "j:" ; cin >> array_j;
        cout << endl;
	
        array = new int[array_i * array_j]; //  выделили память под двумерных массив
	
	for (int i=0; i<array_i; i++) // здесь обрати внимание на условие выхода!!!
	{
		for (int j=0; j<array_j; j++) // здесь обрати внимание на условие выхода!!! 
		{
			array[ i*array_j + j ] = 1;
		}	
        }
        delete [] array;



Ну, а чтобы выделить память под одномерный массив имитирующий двухмерный в функции, ничего особенного придумывать не надо:

Код: plaintext
1.
2.
3.
4.
void create_array(int* &array, int array_i, int array_j) {
       array = new int[array_i * array_j];
}
 



Удачи!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539859
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,
насколько я понимаю, вы можете объявить указатель на первый элемент массива , и работать с ним. То есть может отправлять указатель в функцию, и далее работать со значениями массива по принципу *(PA+i). Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции.
В данном ответе я не уверен наверняка, но его прокомментируют, и вы будете знать прав ли я или нет
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539862
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, насколько я понял, объявление массива, например:
Код: plaintext
1.
int a[10]


значит, что вы объявили int* a(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт).
Потому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы. И вообще, может быть не стоит в качестве принимаемых параметров использовать массивы, если есть указатели. Или точнее сказать: так как есть указатели, мощнейший и чудеснейший инструмент C.

Все эти рассуждения касаются C, но мне почему-то кажется что C++ недалеко ушёл.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539867
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryкак мне кажется, массив это такое вымышленное понятие, несколько
искусственное, вообще ошибка, если кто-то говорит о них
А что ты имеешь в виду, набирая слово "массив"? Давай согласуем термины, а то может
оказаться, что мы говорим о разных вещах. Вот для меня "массив" это несколько однотипных
переменных, расположенных в памяти одна за другой. А для тебя?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539872
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для меня массив, это прежде всего указатель, который хранит адрес нулевого элемента, считывание данных будет происходить в объёме типа указателя, также определена операция *(A+i),i=0,1,..,n n belongs Z которая позволяет считывать значения в памяти через размерность типа указателя. В языке С.

Возможно, я неправильно сформулировал что-то, но общий принцип по которому я считаю правильно давать определение массива понятен.

Определения по типу " .. это несколько однотипных переменных, расположенных в памяти одна за другой " мне кажутся вымышленными, с одной стороны правильными, но некорректными. В языке С.

Все рассуждения получены в качестве логических размышлений из K&R.

PS

Несколько однотипных переменных это
Код: plaintext
1.
int a,b,c,d,e;


судя по логике, запись
Код: plaintext
1.
int a[10];



должна либо на уровне препроцессора, что навряд ли конечно, либо на уровне транслятора/компилятора преобразовываться к виду
Код: plaintext
1.
int a0,a1,a2,a3,..,a9;



Вот в таком случае это будет несколько однотипных переменных, но в данном случае далеко не факт что они будут расположены в памяти одна за другой. Потому мне кажется, что ваше утверждение, может быть некорректным и не до конца правильным.
Или всё же я ошибаюсь ?
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539874
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и очевидно что такие преобразования
Код: plaintext
1.
int a0,a1,a2,a3,..,a9;



в С не происходят.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539879
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
Солтер Н.А. и Клепер С.Дж. (С++ для профессионалов) написали, как корректно выделить память для двумерного массива:
Код: plaintext
1.
2.
3.
4.
5.
6.
int x,y;

int** myArray = new int*[x]; //Выделяем для первой размерности массива

for (int i=0; i<x; i++)
    myArray[i]=new int[x];     //Выделяем для i-го подмассива.


Это код, мне кажется самый корректный!
На основании это, я написал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
int main()
{
    int array_i; //Количество строк
	int array_j; //Количество columns
	
	cout << "Enter array count:";  
        cout << "i:"; cin >> array_i; //Ввод Количество строк
        cout << "j:" ; cin >> array_j; //Ввод Количество столбцов
        cout << endl;
        
	//Инициализация массива
	int *myArray[array_i]; //Выделяем для первой размерности массива
		
	for (int i=0; i<array_i; i++)
	   myArray[i]=new int[array_j]; //Выделяем для i-го подмассива.
	   
        // Присваивание значение     
	for (int i=0; i<array_i; i++) 
	  for (int j=0; j<array_j; j++) 
		{
			myArray[i][j] = j;       // Присваивание значения для каждого ячейки массива  
		}	
    
       //Печать массива
       cout << "Array:" << endl;
       for (int i=0; i<array_i; i++)
	{
	  for (int j=0; j<array_j; j++)
	      cout << myArray[i,j] << "  ";
	  cout << endl;
	}
   return 0;
   //Конец main
}


У меня вот такой результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Enter array count:
i:5
j:5
Array:
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0

--------------------------------
Process exited with return value 0
Press any key to continue . . .



Почему идет печать именно адрес памяти ячейки? Не понятно вообще!
Здесь С++ FAQ написали, что полностью отказаться надо от использования массивов-указатели в стиле С. Но новичок в мире С++ как я, не понимая массивов, как освоит других технологий С++?.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539880
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,
Мне не очень нравится ваш цикл, где происходит присваивание.
И в конце, на мой взгляд, правильно написать :

Код: plaintext
1.
2.
3.
4.
5.
6.
       for (int i=0; i<array_i; i++)
	{
	  for (int j=0; j<array_j; j++)
	      cout << [color=green]*[/color]myArray[i,j] << "  ";
	  cout << endl;
	}
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539881
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
for (int i=0; i<array_i; i++)
{
for (int j=0; j<array_j; j++)
cout << *myArray[i,j] << " ";
cout << endl;
}
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539882
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Происходит печать адреса, потому что элемент myArray[i,j] является указателем. Для того чтобы получить значение по адресу необходимо использовать операцию *myArray[i,j].

K&R(p 95)
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539884
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
Да Вы правы!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//Печать массиву
    for (int i=0; i<array_i; i++)
	{
	  for (int j=0; j<array_j; j++)
	      cout << *myArray[i,j] << "  ";
	  cout << endl;
	}


Теперь результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Enter array count:
i:5
j:5
Array:
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0

--------------------------------
Process exited with return value 0
Press any key to continue . . .


Как можно осуществлять присваиванию!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539885
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скачал K&R (3-е издание 2003). Вот читаю главу 5 (Указатели и массивы). Постараюсь понят!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539928
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov, SashaMercury, ну что за фантазии на вольную тему.
Вам же выше Анатолий Широков написал, что myArray[i,j] это бессмысленная операция.
Она эквивалентна myArray[j], а так как у вас в myArray хранятся указатели на подмассивы, то соответственно
Код: plaintext
1.
cout << myArray[i,j] 

печатает адрес j-го подмассива.
И по той же причине, добавление разыменования * не поможет
Код: plaintext
1.
cout << *myArray[i,j] 


Оно будет печатать только нулевые элементы j-го подмассива.

Правильный код адресации такого массива такой
Код: plaintext
1.
cout << myArray[i][j] 



Таким образом резюмируя - если у вас в коде встречается конструкция array[a, b], то это замаскированный баг стопроцентной жирности.
Если не понятно почему - перечитывать учебники по основам С/С++ пока не придет понимание .
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539931
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:(
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539941
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
мне стыдно конечно, что я сразу не заметил, но

Alimkulov Почему идет печать именно адрес памяти ячейки? Не понятно вообще!


Вопрос был почему адреса, я на этот вопрос и ответил, а на то как он обращается к элементам массива(неверно индексирует) внимания не обратил :C
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540160
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции.


ты ошибаешься.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540181
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, насколько я понял, объявление массива, например:
Код: plaintext
1.
int a[10]


значит, что вы объявили int* a


че за бред? int* 4 байта, int [10] - 40.
есть разница?


(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт).

ИМЯ массива, а не объявление массива.


Потому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них,

это только кажется. а когда кажется, надо креститься, тогда нечисть сгинет...

без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы. И вообще, может быть не стоит в качестве принимаемых параметров использовать массивы, если есть указатели.

вот это единственное нормальное замечание в посте. только есть одно но: в параметрах функции массив и указатель это одно и то же.
...
Рейтинг: 0 / 0
25 сообщений из 73, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача массивов в функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]