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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать ссылку на массив в функцию? 
V
    Опции темы
Fighter
Дата 25.7.2006, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Код

  ...
  int matrix[20][20];
  inputmatrix(matrix, height, width);
  drawmatrix(matrix);
  ...


Как реализовать в данном случае функцию inputmatrix? 
PM MAIL   Вверх
apook
Дата 25.7.2006, 02:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Самый прстой вариант

Код

#include "stdio.h"
#include "conio.h"

void inputmatrix(int matrix[20][2], int height, int width)
{
/*
массив состоит из 20-и элементов, каждый из этих элемнтов является
массивом из двух элементов в данном случае height и width.
*/

matrix[0][0] = height;
matrix[0][1] = width;

printf("%d - height; %d - width;", matrix[0][0], matrix[0][1]);
getch();
     }


int main()
{
int matrix[20][2];

/*
можно так присваивать значения
int matrix[5][2] = {
                    { 1, 2 },
                    { 10, 20 }
                    { 30, 40 }
                    { 50, 60 }
                    { 70, 80 }
                        };

*/

//matrix передаем пустой(верней там всякий мусор) 

inputmatrix(matrix, 10, 20);
return 0;
     }


Сложнее не умею


 


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Xenon
Дата 25.7.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



+ Прописывая массив в функцие не обязательно указывать размерость. Если одномерный массив, то пишем massiv, или massiv[]. Если двумерный, то указываем последнюю размерность massiv[][MAX];  

Это сообщение отредактировал(а) XenonSk - 25.7.2006, 14:48


--------------------
user posted image  
PM MAIL   Вверх
Fighter
Дата 26.7.2006, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(XenonSk @  25.7.2006,  14:47 Найти цитируемый пост)
+ Прописывая массив в функцие не обязательно указывать размерость. Если одномерный массив, то пишем massiv, или massiv[]. Если двумерный, то указываем последнюю размерность massiv[][MAX];  


Мне нужно чтобы это еще и возвращалось в вызывающую подпрограмму.

Короче, вот аналогия на Turbo-Pascal.


Код

  uses crt;

  type mas = array [1..10] of integer;

  procedure InputArray(var m: mas; size: integer);
  var
    i: integer;
  begin
    for i := 1 to size do
    begin
      write('Введите следующий элемент массива: ');
      readln(m[i]);    
    end;       
  end;

  procedure DrawArray(m: mas; size: integer);
  var
    i: integer; 
  begin
    for i := 1 to size do
    begin
      writeln('M[',i,']= ', m[i]);
    end;
  end;

  var
  m: mas;
  n: integer;

  begin
    clrscr;
    write('Введите размерность массива: ');
    readln(n);
    InputArray(m, n);
    DrawArray(m,n);
    readkey;
  end.


Мне нужно все в точности, то же самое, этот же пример, только на С++. 
PM MAIL   Вверх
apook
Дата 26.7.2006, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Этот пример на Си


Код

#include "stdio.h"
#include "conio.h"

#define MAXSIZE 10

void IntArray(int mas[], int size)
{
int i;

for(i = 0; i <= size; i++)
     {
      printf("Введите следующий элемент массива: ");
      scanf("%d", &mas[i]);
          }

     }

void drawarray(int mas[], int size)
{
int i;

for(i = 0; i <= size; i++)
     {
      printf(" %d", mas[i]);
          }

     }

int main()
{
int mas[MAXSIZE], n;

clrscr(); //если компилятор не Borland может не работать

printf("Введите размерность массива ДО %d: ", MAXSIZE);
scanf("%d", &n);
n--;//если так не сделать то размерность будет на единицу больше чем
    //предполагалось (т.к pascal-е отсчет с единицы)
if (n > MAXSIZE) n = MAXSIZE;//на всякий случай

IntArray(mas, n);
printf("\n");
drawarray(mas, n);
printf("\n");

return 0;

    }


Возвращать что либо можно инструкцией return.
Например:

int funct()
{
int i;
i = 100;
return i;
     }

тогда в main пишем 

int x;
x = funct();


Есть так-же утилиты типа pas2cpp но они не дают 100 процентов перевода



  

Это сообщение отредактировал(а) apook - 26.7.2006, 05:41


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Fighter
Дата 26.7.2006, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну хорошо, это я попробую. Ну, а теперь давай изменим условие, и предположим что все осталось как есть, единственное что, это то, что вводится матрица. Как теперь будет выглядеть исходник? 
PM MAIL   Вверх
apook
Дата 26.7.2006, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Смутно представляю что есть матрица, это какая то совокупность величин? smile
Говори что дано и что надо получить   

Это сообщение отредактировал(а) apook - 26.7.2006, 06:08


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
apook
Дата 26.7.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не знаю то не то но что то сотворил

Код

#include "stdio.h"
#include "conio.h"
#include "malloc.h"



void IntArray(int *mas[], int nln, int ncol)
{
int i, n, y;

i = 0;
n = 0;

printf("%s%4d\t%s%3d\n-----------------------------------------------------\n", "Строк", nln,"Столбцов", ncol);

while(i < nln)
     {
      while(n < ncol)
           {
            printf("Строка [%d]      cтолбец [-%d-]: ", i+1, n+1);
            scanf("%d", &y);
            mas[i][n] = y;
            n++;
                }
      n = 0;
      printf("--------\n");
      i++; 
          }



     }


void drawarray(int *mas[], int nln, int ncol)
{
int i, n;

printf(" № |");

i = 0;
while (i < ncol)
{
printf("%5d", i+1);
i++;
     }
printf("\n-----------------------------------------------------\n");

i = 0;
n = 0;
while (i < nln)
     {
      printf(" %i |", i+1);
      while (n < ncol)
           {
            printf("%5i", mas[i][n]);
            n++;
                 }
      printf("\n");
      n = 0;
      i++;
           }

     }


int main()
{
int *mas, ncol, nln;

clrscr();
printf("\n");
printf("Введите количество строк: ");
scanf("%d", &nln);

printf("Введите количество столбцов: ");
scanf("%d", &ncol);

mas = (int *)malloc(nln * ncol * sizeof(int));
printf("\n");

IntArray(mas, nln, ncol);
drawarray(mas, nln, ncol);
return 0;

    }
  


В Borland Turbo C++ компилируется и работает без ошибок. Скомпилированная в Borland C++ 6 на третьей стоке 2 столбце вылетает с ошибкой. Динамическое выделение памяти не помогло. Может кто подскажет 
  

Это сообщение отредактировал(а) apook - 26.7.2006, 14:31


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
apook
Дата 26.7.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А на Cpp все работает
Код

#include "stdio.h"
#include "conio.h"
//#include "malloc.h"


void IntArray(int *mas[], int nln, int ncol)
{
int i, n, y;

i = 0;
n = 0;

printf("%s%4d\t%s%3d\n-----------------------------------------------------\n", "Строк", nln,"Столбцов", ncol);

while(i < nln)
     {
      while(n < ncol)
           {
            printf("Строка [%d]      cтолбец [-%d-]: ", i+1, n+1);
            scanf("%d", &y);
            mas[i][n] = y;
            n++;
                }
      n = 0;
      printf("--------\n");
      i++; 
          }



     }


void drawarray(int *mas[], int nln, int ncol)
{
int i, n;

printf(" № |");

i = 0;
while (i < ncol)
{
printf("%5d", i+1);
i++;
     }
printf("\n-----------------------------------------------------\n");

i = 0;
n = 0;
while (i < nln)
     {
      printf(" %i |", i+1);
      while (n < ncol)
           {
            printf("%5i", mas[i][n]);
            n++;
                 }
      printf("\n");
      n = 0;
      i++;
           }

     }


int main()
{
int ncol, nln;

clrscr();
printf("\n");
printf("Введите количество строк: ");
scanf("%d", &nln);

int **mas = new int*[nln];


printf("Введите количество столбцов: ");
scanf("%d", &ncol);

for(int i=0; i < nln; i++)
mas[i] = new int[ncol];
printf("\n");

IntArray(mas, nln, ncol);
drawarray(mas, nln, ncol);
return 0;

    }


Перехожу на CPP 


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
vinter
Дата 26.7.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата

В Borland Turbo C++ компилируется и работает без ошибок.

Как оно вообще могло компилится если у тебя в аргументах ф-ии двумерный массив, а обьявляешь и выделяешь память под одномерный: 
Цитата

void drawarray(int *mas[], int nln, int ncol)
int *mas
mas = (int *)malloc(nln * ncol * sizeof(int));

так что дело не в с и с++  smile  


--------------------
Мой блог
PM MAIL WWW   Вверх
GremlinProg
Дата 26.7.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Код

int stat[4][5];

void func(int(&v)[4][5]){
    printf("%d",v[0][1]);
}
 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
apook
Дата 27.7.2006, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

так что дело не в с и с++ 

user posted image 
Цитата


Код

int stat[4][5];

void func(int(&v)[4][5]){
    printf("%d",v[0][1]);
}


Это загадка что-ли? 

Короче у кода на Cpp те-же проблемы только проявляются позже
Вроде все должно работать, я не понял почему глюки 

Это сообщение отредактировал(а) apook - 27.7.2006, 12:25


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
GremlinProg
Дата 27.7.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



apook, это ответ на вопрос Fighter

Добавлено @ 13:43 
Код

void inputmatrix(int(&matrix)[20][20],int height,int width){
    ...
}
 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Fighter
Дата 28.7.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GremlinProg @  27.7.2006,  13:37 Найти цитируемый пост)
apook, это ответ на вопрос FighterДобавлено @ 13:43 код C++1:2:3:void inputmatrix(int(&matrix)[20][20],int height,int width){    ...}highlightSyntax('cpp_5MDc1M','cpp');highlightSyntax('cpp_5MDc1M','cpp'); 


Спасибо GremlinProg, все работает как нужно. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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