Russian Qt Forum
Май 06, 2024, 09:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: двухмерные массивы  (Прочитано 10144 раз)
NoX
Гость
« : Февраль 21, 2005, 00:13 »

Как передать в одну функцию двухмерный массив (динамический и статический) т.е. есть 2 массива
int array[5][5]; -статический
int ** array1; - динамический
как их передать в одну функцию т.е. void test ( и что тут должно быть написано?)
Записан
pablo
Гость
« Ответ #1 : Февраль 21, 2005, 09:51 »

напиши вот как
void function(int [][5]), 5 надо указывать обязательно.
Можно еще и так
void function(int **);
Записан
Klaim
Гость
« Ответ #2 : Февраль 25, 2005, 21:50 »

Neploho by esche kak argumenty sdelat' razmery massiva, ili hotya by odnu iz razmernostei
Записан
rjaan
Гость
« Ответ #3 : Март 08, 2005, 22:34 »

Цитата: "NoX"
Как передать в одну функцию двухмерный массив (динамический и статический) т.е. есть 2 массива
int array[5][5]; -статический
int ** array1; - динамический
как их передать в одну функцию т.е. void test ( и что тут должно быть написано?)


Допустим, что функция test_perfom производит действия над массивом src, который является двузразмерным, а результат возращает  в двухразмерный массив dst, количество возвращаемых столбцов указывается переменной сol, а строк str. Тогда первая переменная будет указателем на неопределенный размерностью двухмерный массив dst, ограниченный переменными col и dst. Вторая переменная src будет константой, т.к. передоваемый исходный двухмерный массив определен размерностью 5x6. Третья col и четвертая src переменные -- это область видимости возвращаемго двухмерного массива dst.  
   
     

Код:


int ** array_dst;

int  array_src [5][6];

static void test_perfom ( int** dst, const int** src, int col, int src );


 Я думаю, что так будет вернее...
Записан
sandy
Гость
« Ответ #4 : Июнь 28, 2005, 21:38 »

Небольшой исходник, где осуществляется передача двумерного массива в функцию через указатель. Доступ к элементам массива конечно, на первый взгляд осуществляется странновато
======================================================
#include <stdlib.h>
#include <stdio.h>

const int n=4;               // Размер матрицы

void OutputMatrix(int* m)
/* Функция вывода матрицы */
{
   printf("Квадратная матрица размерностью %d на %d:\n",n,n);
   for (int i=0;i<n;i++) {
      for (int j=0;j<n;j++)
         printf("%d ",m[i*n+j]);
      printf("\n");
   }
}

int DeterminanteMatrix(int* Matrix)
/* Функция вычисления детерминанта матрицы */
{
   int m[n][n];            // Создаем мыссив = Matrix
   for (int i=0;i<n;i++)
      for (int j=0;j<n;j++)
         m[j]=Matrix[i*n+j];   // Копируем эдементы Matrix в m

   for (int i=0; i<n; i++) {
      if (abs(m)<1E-10)
         return 0;
      for (int j=i+1; j<n; j++) {
         int d=m[j]/m;
         for (int k=i; k<n; k++)
            m[j][k]=m[j][k]-d*m[k];
      }
   }

   int D=1;
   for (int i=0;i<n;i++)
      D=D*m;

   return D;            // Возвращаем детерминант
}

void ReverseMatrix(int* m, int D)
/* Фуекция построения и вывода обратной матрицы */
{
   printf("Детерминант равен %d\n",D);
   printf("Обратная матрица:\n");

   for (int i=0;i<n;i++) {
      for (int j=0;j<n;j++)
         printf("%f ",(double)m[i*n+j]/D);
      printf("\n");
   }
}

int main()
{
   int Matrix[n][n]={{1,2,3,4},
           {2,3,4,3},
           {3,4,3,2},
           {4,3,2,1}};         // Оъявляем двумерный массив
   OutputMatrix(&Matrix[0][0]);         // Выводим матрицу на экран
   int D=DeterminanteMatrix(&Matrix[0][0]);   // Вычислеям детерминант
   if (D==0)   printf("Матрица вырождена!\n");   // Проверка матрицы
   else      ReverseMatrix(&Matrix[0][0], D);// Строим обратную матрицу
   return 0;
}
Записан
PROGrand
Гость
« Ответ #5 : Июль 09, 2005, 21:27 »

Если дело идёт с C++, то не поленитесь и создайте один раз класс для массивов (а лучше template class), какой надо размерности, в нём проверяйте границы (хотя бы в дебаговой версии). Сделав это избавитесь от утечек, overflow и т.д. да и работа побыстрее пойдёт. Если постараться, то компилятор сделает ваш класс не больше чем изначальный массив и не медленнее.
Записан
sandy
Гость
« Ответ #6 : Октябрь 05, 2005, 14:40 »

Цитата: "PROGrand"
Если дело идёт с C++, то не поленитесь и создайте один раз класс для массивов (а лучше template class), какой надо размерности, в нём проверяйте границы (хотя бы в дебаговой версии). Сделав это избавитесь от утечек, overflow и т.д. да и работа побыстрее пойдёт. Если постараться, то компилятор сделает ваш класс не больше чем изначальный массив и не медленнее.


Ну, в моем случае, пример программы с матрицами чисто учебный. Писал студенту, который еще классов не учил. Для себя же я реализовал класс Matrix построенный по учебнику Страуструпа на valarray
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 20.