Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Передача двумерного массива в функцию


Автор: masinIL 15.9.2014, 17:16
Как я знаю, имя массива и указателя тождественны в С++. Из этого следует, что можно инициализировать указатель, а работать с ним, как с именем массива, добавив индекс (квадратный скобки) или смещение к имени массива и круглые скобки со звёздочкой... Но не в этом суть. Я пробовал ввести передачу в функцию двумерного массива (столбы и строки) - не вышло. Очевидно, что где-то вкралась ошибка.
Вот код:
Код cpp:
Код
#include "stdafx.h"
#include <iostream>

using namespace std;

const int size1 = 3;
const int size2 = 4;
int arr[size1[size2 = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    
void arr_fun (int arr[[size2, int size1);

void main ()
{
    arr_fun (arr[[size2, size1);
    system ("pause");
}
void arr_fun (int arr[[size2, size1)
{
    for (int i=0; i<size1; i++)
    {
        for (int j=0; j<size2; j++)
        {
    cout<<"arr["<<i<<": "<<arr[i[j<<endl;
        }
    }
}
 Хотя бы дайте общие понятия по логике передачи адреса двух- и более мерного массива в функцию, а дальше, я сам попробую написать =)

Автор: Gimfixwork 15.9.2014, 20:33
Существует несколько способов передачи двумерных массивов: это могут быть двойные указатели, структурированные массивы, представление одномерного массива как двумерного и др.

Автор: sQu1rr 15.9.2014, 21:15
Цитата(Gimfixwork @  15.9.2014,  20:33 Найти цитируемый пост)
Существует несколько способов передачи двумерных массивов

привели бы хоть один, что вы, стесняетесь?

Код

#include <iostream>

const int size1 = 3;
const int size2 = 4;

int arr[size1][size2] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

void arr_fun(int arr[][size2]);

int main() {
    arr_fun(arr);
}

void arr_fun(int arr[][size2]) {
    for (int i = 0; i < size1; ++i) {
        for (int j = 0; j < size2; ++j) {
            std::cout << "arr[" << i << ":" << j << "] = " << arr[i][j] << "\n";
        }
    }
}


masinIL, void main() - никогда

И вообще, что так люди боятся спросить англицкий гугл? http://stackoverflow.com/questions/8767166/passing-2d-array-to-function

Автор: neonnophibe 16.9.2014, 05:44
Вот примерно так это можно реализовать...

Код cpp:
Код
 const int size1 = 3;
 const int size2 = 4;
 int arr[size1[size2 = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
 int* arr_ptr[size1 = {arr[0, arr[1, arr[2};

 void arr_func (int* ptr[, int size);

int main(int argc, char* argv[)
{
    arr_func(arr_ptr, size1);
    return 0;
}

 void arr_func (int* ptr[, int size)
 {
     for (int i = 0; i < size; i++)
     {
         for (int j = 0; j < size2; j++)
         {
             int a = ptr[i[j;
             printf("%d, ", a); 
         }
         printf("\n");
     }
 }

Автор: xvr 16.9.2014, 11:50
Цитата(masinIL @  15.9.2014,  17:16 Найти цитируемый пост)
Как я знаю, имя массива и указателя тождественны в С++.

Не совсем так. В подавляющем большинстве мест имя массива автоматически преобразуется в указатель на его первый (в смысле нулевой) элемент.

В частности, это не работает там, где требуется вычислить размер массива. И в случае 2х (и более) мерных массивов это вылазит в полный рост  smile Многомерные массивы и многомерные указатели - это совсем не одно и тоже (ни в каких контекстах)


Автор: tzirechnoy 16.9.2014, 14:31
У Вас копипаста покорёжылась, с копипастьте заново -- чтобы было понятно, в какую ошыбку Вы вляпались.

Добавлено через 53 секунды
Цитата
привели бы хоть один, что вы, стесняетесь?


Он, вообще-то, привёл цэлых три. То, что Вы их не поняли -- это ужэ вашы проблемы.

Автор: sQu1rr 16.9.2014, 17:10
Цитата(tzirechnoy @  16.9.2014,  14:31 Найти цитируемый пост)
Он, вообще-то, привёл цэлых три.

Назвал

Цитата(tzirechnoy @  16.9.2014,  14:31 Найти цитируемый пост)
То, что Вы их не поняли -- это ужэ вашы проблемы. 

Грубить не обязательно. Вы по всему видимому зашли в этот пост, для того что бы оффтопить

Автор: tzirechnoy 16.9.2014, 18:23
Цитата
Назвал


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

Цитата
Грубить не обязательно.


Правильно, не грубите, никто ж не заставляет!

Автор: sQu1rr 16.9.2014, 19:41
Цитата(tzirechnoy @  16.9.2014,  18:23 Найти цитируемый пост)
 Поскольку мне, например, то, что он сказал -- вполне понятно, и многим местным спецам, подозреваю, тожэ.

Заметьте я не утверждал, что мр. tzirechnoy не понял чего-то там, я как раз таки был убежден, что вы разберетесь в том что написано. Я просто заметил, что то что написал господин Gimfixwork, может быть непонятно ОП, который не воспользовался гуглом в первый раз, и вряд ли будет сейчас.

Ошибка masinIL была в том что он передавал в функцию массив неправильно
нужно не
Код

arr_fun (arr[][size2], size1);

а так
Код

arr_fun(arr, size1);

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

Тем более, изначально вопрос звучал "Хотя бы дайте общие понятия по логике передачи адреса двух- и более мерного массива в функцию" который не подрузамевал наименование способов, которые можно как я указал выше найти в гугле. До сих пор никто так и не ответил на вопрос, мы только устраиваем тут холивар очередной smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)