Как я могу перемещать двухмерный array integers в функцию void, чтобы мочь работать внутри функции как будто это был array unidimensional?

Я нуждаюсь в том, чтобы переместить двухмерный array integers в функцию void, чтобы мочь работать внутри функции как будто это был array unidimensional. После, что он сделал с array в этой функции, должно сохраняться в array bidimensinal. Мне ясно достаточно, что для этого должны использовать указатели, но на данный момент я очень новый и не точно, как они идут. Моя идея состоит в том, чтобы помещать здесь то, что я сделал, и который кто-то сказал мне (если он такой любезный) porqué эта, плохо и как упорядочивать это.

Это был бы function.cpp

 #include
 #include
 #include
 #include
 #include "header.h"
   void squared_map_creation(int* map, int length)
{
   int counter = 0;
   while (counter < length*length)
   {
    map[counter] = counter;
    counter++;
   }
}

И это header.h

void squared_map_creation(int*, int length);

Выполнив программу, array проходит по функции и выходит как будто совсем не, я вижу, что я изменил никакой стоимости когда-нибудь, ни даже внутри array. Моя цель состоит coseguir функция в том, чтобы он сделал мне все элементы отличных array между собой, в случае функции, которую я создал, они были бы 0 до 99, и двухмерный array был бы должен оставаться таким:

0   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
............................
............................
.............................
...........................99

Большое спасибо :)

Это код, который называет функцию:

https://drive.google.com/open? id=0B8KEzejRagk8VWJLb182dkNpOGM

1
задан 28.01.2017, 16:10
1 ответ

В C ++ (и страховка, что в C también) мульти-пространственные договоренности estÃ: n расквартированные солдаты в память приложенного способа, asà - что conversi¦n нескольких размеров в dimensi¦n возможный и безопасный.

я не нашел secci¦n estÃ: ndar C ++ , которые показывают мой предыдущий afirmaci¦n, но останься impl¦-citamente конфирмантом в следующем замечании (traducci¦n - m¦ - в):

8.3.4 Договоренности

...

  1. продолжает за Собой норму, состоящую в мультипространственных договоренностях. Если E - договоренность n - размеры ранга i × j × ... × k, тогда E, использованный в expresi¦n, закрепленном в conversi¦n я упорядочиваю - a-puntero (4.2) serÃ: конвертируемый в указатель в договоренность ( n -1) размеры с рангом j × ... × k. Если оператор * применен к этому указателю способа impl¦-встреча или expl¦-назначает встречу как результат sub-indizar, результат - указатель в договоренность ( n -1) размеры, которые в свою очередь serÃ: конвертируемый немедленно в указатель.
  2. [ Пример : давайте считать

    int x[3][5];
    

    Aquà - x - договоренность 3 × 5 целых чисел. Когда x aparecie в expresi¦n, обращен в указатель в (трех первых) договоренность целых чисел пяти элементов. В expresi¦n x[i], который - эквивалентный *(x+i), x обращен во-первых в указатель как describiÃ; тогда x+i обращен в тип x, который подразумевает умножать i на длину объекта, на который указатель указывает, espec¦-ficamente пять объектов целого типа. Результат прибавляется и неадреса применяются, чтобы возвращать договоренность (пяти целых чисел), которая в свою очередь обращена в указатель в первого целых чисел. Если есть другой dimensi¦n, тот же процесс применяется снова; в этом coasi¦n результат - целое число. - конец примера ]

Как описываются операции, чтобы соглашаться на элементы мульти-пространственной договоренности, понятно, что вся память приложена и как следствие могут отнестись к мультипространственной договоренности как один из единственного dimensi¦n.

Перемещая договоренности в функции.

, выполнив программу, array сходит за funci¦n и выходит как будто совсем не, я вижу, что изменил ningún стоимость в ningún момент

, Ты совершил ошибку t¦-пик новичка в мире указателей. Когда funci¦n получает указатель, что funci¦n estÃ: получая это копия из указателя, asà - что изменения aplicarÃ: n на копии, не на оригинале. Чтобы изменять первоначальный указатель ты должен перемещать указатель в указатель или ссылку на того же самого:

void squared_map_creation_pointer_2_pointer(int** map, int length)
{
    int counter = 0;
    while (counter < length*length)
    {
        (*map)[counter] = counter;
        counter++;
    }
}

В versi¦n указатель - a-puntero, мы нуждаемся дай снабжать ссылками указатель map (использовать оператор unario *) однажды чтобы соглашаться на контент первоначальные (он не копирует ее), ahà - который использовал instrucci¦n (*map)[counter] = counter;. Я лично предпочитаю versi¦n со ссылкой:

void squared_map_creation_reference_2_pointer(int*& map, int length)
{
    int counter = 0;
    while (counter < length*length)
    {
        map[counter] = counter;
        counter++;
    }
}

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

int main()
{
    int datos[10][10] {{}};
    int *begin = *datos;

    // La llamada puntero-a-puntero necesita obtener la direccion
    // del puntero al inicio del arreglo.
    squared_map_creation_pointer_2_pointer(&begin, 10);

    // En la llamada referencia-a-puntero se puede pasar el puntero
    // directamente, sin operaciones adicionales.
    squared_map_creation_reference_2_pointer(begin, 10);

    return 0;
}

Альтернатива с шаблонами.

ты Можешь использовать шаблоны C ++ для того же prop¦sito:

template <std::size_t LENGTH>
void squared_map_creation(int (&map)[LENGTH][LENGTH])
{
    std::size_t counter = 0;
    int* begin = *map;
    while (counter < LENGTH*LENGTH)
    {
        begin[counter] = counter;
        counter++;
    }
}

В этом случае funci¦n может быть названным as¦-:

int main()
{
    int datos[10][10] {{}};

    squared_map_creation(datos);

    return 0;
}

funci¦n получает ссылку на договоренность двух размеров, тип parÃ: метра map - int (&)[10][10], что как уже о нем упомянули - типа ссылка (&) на договоренность двух размеров, оба 10 элементов ([10][10]) из целых чисел (int); ввиду того, что это ссылка, не требуются добавочные операторы, чтобы перемещать договоренность funci¦n; шаблон берется за то, чтобы приходить к заключению tamaño договоренности и поэтому также не необходимо происходить с funci¦n tamaño.

2
ответ дан 24.11.2019, 11:23
  • 1
    Wow, большое спасибо. В конце концов я использовал что-то сходное с шаблоном, случай состоит в том, что уже оно я функционирует хорошо, но мне кажутся интересными все demá s выборы – Skyway 31.01.2017, 22:44

Теги

Похожие вопросы