2012-02-28 4 views
0

У меня есть массив, который теперь статичен. Это операции, которые я делаю с ним. Во-первых, я создаю двумерный массив. Затем я заполняю его, используя циклы. И затем я отправляю его на работу, где есть также циклы, которые используются. Здесь я бы хотел опубликовать некоторый пример кода, который похож на мой.Отправить динамический массив для функции C++

bool picture[20][20]; //here's my array right now. Pretty ugly. Just for testing. 
for (int y=0;y<Height;y++) 
{ 
    for (int x=0;x<Width;x++) 
    { 
     if (treshold<middle) 
     { 
      picture[x][y]=1; 
     } 
     else 
     { 
      picture[x][y]=0; 
     } 
    } 
} 
//Here's an example of filling an array 

leftk = left(picture,widthk, heightk); //That's how I use a function 

int left(int picture[200][200],int row,int col) 
{ 
    for (int x = 0; x <=row-1; x++) 
    { 
     for (int y = 0; y <=col-1 ;y++) 
     { 
      if (picture1[x][y]==1) 
      { 
       return x; 
      } 
     } 
    } 
} 
//And that's the function itself 

Поэтому здесь мне нужно переключить свой массив на динамический. Вот как я объявляю свой динамический массив

bool** picture=new bool*[size]; 
    for(int i = 0; i < size; ++i) 
     picture[i] = new bool[size]; 

//size is just a variable. 

Что касается статически заявленных циклов, все очень просто. Отправка этого массива в качестве параметра для работы.

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

Кстати, упаковка класса была бы немного запутанной здесь, я думаю.

ответ

4

функции, такой как:

Process2DArray(int **pArray, int rowCount, int colCount) 

должно хватить потребности в предположении сво 2D массив, который эксплуатируется на. Кроме того, рассмотрите использование std::vector<std::vector<int>> вместо многомерного массива, выделенного вручную. Такой подход поможет предотвратить утечки. Второй подход также позволяет вам иметь зубчатые массивы.

+0

Это зависит от того, как был определен массив. Обычно я предпочитаю обертывать его в классе, потому что в противном случае нет простого решения. –

+0

@JamesKanze: Лично я бы обернул его в класс или структуру, если это необходимо в нескольких местах или часто используется в программе. В противном случае для одного места используется 'vector >' будет делать хорошо, как вы думаете? –

+0

Хорошо, спасибо, но я уже говорил, что упаковка в классе будет неудобной. Более того, массив используется только один раз, поэтому я надеюсь, что я уйду из классов. Первый способ, который вы показали, кажется довольно простым, но нуждается в некотором объяснении. Во-первых, я отправлю свой статический код C прямо сейчас, чтобы лучше описать проблему. Затем я опубликую объявление своего массива. Надеюсь, это тоже поможет. Но, к сожалению, мне нужна твоя помощь. Действие отправки массива и его получение в функции все еще недостаточно ярко. – user1131662

1

У вас есть несколько вариантов:

  1. массив массивов. Например, для int бы int **a, которые должны быть в состоянии держать n массивы new int *[n], затем с for через них и инициализировать их a[i] = new int[elems_per_line]
  2. «упакованы» 1D массив int *a = new int[n * elems_per_line], где элемент (I, J) - 0- основанный фактически a[i * elems_per_line + j].
  3. вы можете уточнить точку 1 и иметь двумерную матрицу «курчавую» - с линиями различной длины, но вам понадобится массив для хранения каждой длины.

Надеюсь, это поможет.

+0

Большое спасибо. Я почти ничего не слышал о первом. Мне кажется, это довольно сложно, извините. Второй - довольно простой. Я даже пытался его использовать. Но все те же проблемы с функцией. Я никогда не слышал о последнем. Поэтому, если я не найду идеальное решение, я прочитаю об этом еще – user1131662

2

Обычное решение состоит в том, чтобы обернуть массив в классе; C не обрабатывает массивы очень хорошо, а C++ не имеет реальной поддержки для 2D-массивов в его библиотеке. Таким образом, можно определить как:

class Array2D 
{ 
    std::vector<double> myData; 
    int myColumnCount; 
    int myRowCound; 
    // ... 
}; 

с аксессорами, превращающие два индекса, используя i * myColumnCount + j или:

class Array2D 
{ 
    std::vector<std::vector<double> > myData; 
    // ... 
}; 

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

+0

К сожалению, у меня есть пять массивов для управления, поэтому эти методы могут быть немного «большими». Поэтому я надеюсь найти решение, которое будет проще и меньше. Но, тем не менее, спасибо за вашу поддержку, я буду учитывать этот метод. – user1131662

+0

Я не уверен, что вы подразумеваете под «большим». Использование 'std :: vector' вместо' double * 'добавит немного, но обычно только приблизительно эквивалент 2 или 3 указателей. Независимо от размера массива. –

+0

Прошу прощения, но я новичок в C++. Поэтому std :: vector ничего не значит для меня.Конечно, я могу прочитать об этом, но если есть какие-то другие способы (кроме классовой упаковки), было бы замечательно – user1131662

 Смежные вопросы

  • Нет связанных вопросов^_^