Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переворот двумерной матрицы 
:(
    Опции темы
gosn1ck
Дата 14.5.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



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

[BCC32 Error] File1.cpp(37): E2340 Type mismatch in parameter 1 (wanted 'int * *', got 'int ( *)[2]')

делал переворот одномерной - всё было нормально. 

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
Код

void fun(int** mas, int n, int m)
{
  for (int i = 0; i < n/2; i++) {
    for (int j = 0; j < m/2; j++) {
      int buf;
      buf = mas[i][j];
      mas[i][j] = mas[5-i-1][2-j-1];
      mas[5-i-1][2-j-1] = buf;
    }
  }

}

void (*ptr)(int**, int, int );

int main(int argc, char* argv[])
{
  int mas[5][2];

  for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 2; j++){
      mas[i][j] = i+j;
    }
  }

  ptr = &fun;

  ptr(mas,5,2);

  for (int i = 0; i < 5; i++){
    for (int j = 0; j < 2; j++)
      cout << mas[i][j] << " ";
    cout << "\n";
  }

}
//---------------------------------------------------------------------------



PM MAIL ICQ   Вверх
bsa
Дата 14.5.2009, 14:59 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



int** и int [5][2] - это совершенно разные типы - неконвертируемые.
int **p - p - это указатель на одномерный массив указателей.
int x[5][2] - это массив состоящий из 10-ти целых.
т.е. ты должен сделать первый параметр в функции int (*p)[2] - указатель на одномерный массив из двух целых.
Как вариант, ты можешь сделать просто указатель на int, так как данные в массиве хранятся последовательно (слева-направо, сверху-вниз). А передавать ты должен будешь &mas[0][0]. Но тогда тебе придется вручную считать смещение (row*ColumnsCount + column).
PM   Вверх
gosn1ck
Дата 14.5.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsusedКод

void fun(int** mas, int n, int m)
{
  for (int i = 0; i < n/2; i++) {
    for (int j = 0; j < m/2; j++) {
      int buf;
      buf = mas[i][j];
      mas[i][j] = mas[5-i-1][2-j-1];
      mas[5-i-1][2-j-1] = buf;
    }
  }

}

void (*ptr)(int**, int, int );

int main(int argc, char* argv[])
{
  int ** pt;
  pt = new int* [5];

  for (int i = 0; i < 5; i++) {
    pt[i] = new int [2];
  }

  for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 2; j++){
      pt[i][j] = i+j;
    }
  }

  ptr = &fun;

  ptr(pt,5,2);

  for (int i = 0; i < 5; i++){
    for (int j = 0; j < 2; j++)
      cout << pt[i][j] << " ";
    cout << "\n";
  }

  for (int i = 0; i < 10; i++) {
    delete pt[i];
  }
  delete pt;

  return 0;
}
//---------------------------------------------------------------------------


так работает smile правильно ли я понял :
pt = new int* [5]; - выделяется массив укателей, так?
pt[i] = new int [2]; - а тут уже формируются нам необходимые целые, так ? smile
PM MAIL ICQ   Вверх
math64
Дата 14.5.2009, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Только в fun() вместо 5 и 2 нужно использовать n и m - а то зачем передаются эти параметры? 
PM   Вверх
gosn1ck
Дата 14.5.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



а какая разница?
PM MAIL ICQ   Вверх
Static
Дата 14.5.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: нет
Всего: 2



разница в том, что если размер ВНЕЗАПНО поменяется, то прийдется руками исправлять все 5 на 7, а 2 на 4 (например). А если использовать m и n, то размерность надо будет поменять только в начале программы...
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
gosn1ck
Дата 14.5.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



ну я до этого догадывался smile  а я уж думал, что мой процессор надорвался передавать циферку по значению smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.