Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> [C++] Передача матрицы в функцию
Vala4i
сообщение 3.06.2008 - 23:15

Still loving you...
******
орден III степеникубок за победу в конкурсах Форума
Группа: Модератор
Сообщений: 1389
Регистрация: 2.02.2004
Пользователь №: 2135


Всем доброй ночи.

Есть задача организовать наполнение нескольких разноразмерных двумерных массивов через некоторую функцию. Возник вопрос, каким образом можно передать двумерный массив в функцию в качестве параметра? Сам реализовывал данную задачу двумя способами - через указатели и через динамический массив, однако, преподаватель попросил реализовать это дело как-то под другому... Вот, сижу, ломаю голову huh.gif

В качестве примера выполнения данного задания, препод мне вручил вот такой код.
Код
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int F[15][7], K[10][9], N[3][6];

void create_matrix(int x[][10], int a, int b)
{
    for(int i=0; i<a; i++)
    {
        for (int j=0; j<b; j++)
        {
            x[i][j]=rand()%100;
            printf("%3d", x[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void main()
{
    printf("We have matrix F[15][7]\n\n");
    create_matrix(F, 15, 7);

    printf("We have matrix K[10][9]\n\n");
    create_matrix(K, 10, 9);

    printf("We have matrix N[3][6]\n\n");
    create_matrix(N, 3, 6);
}


Код не рабочий. Никак не могу понять в чём фишка.
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 3.06.2008 - 23:54

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Код не рабочий потому что не компилируется и выдает вот такую, например, ошибку:

Cannot convert 'int ( *)[7]' to 'int ( *)[10]'

?

Надо ж наверное написать было, как именно он не работает, да? smile.gif

В общем, он и не должен работать, потому что для всех матриц с количеством столбцов, не равным 10, функция не сможет правильно обращаться к элементам матрицы. Потому что там (в памяти), где у матрицы [15][7] начинается вторая строка, у матрицы [][10] есть еще три элемента первой. Поэтому в функции create_matrix(...) - если бы она работала - запись значений в матрицу F вышла бы за пределы выделенной под неё памяти, что недопустимо.
Перейти в начало страницы
 
+Цитировать сообщение
Vala4i
сообщение 4.06.2008 - 00:09

Still loving you...
******
орден III степеникубок за победу в конкурсах Форума
Группа: Модератор
Сообщений: 1389
Регистрация: 2.02.2004
Пользователь №: 2135


Цитата(Graker @ 4.06.2008 - 00:54) *
Код не рабочий потому что не компилируется и выдает вот такую, например, ошибку:

Cannot convert 'int ( *)[7]' to 'int ( *)[10]'


Да, именно так. Собственно, я и сам понимаю по какой причине данный код не работает, но суть в другом. Существует ли вообще какой-нить другой простой способ передачи матрицы в функцию (без указателей)? Реализацию через указатели препод не принимает, и даёт в качестве образца реализации не рабочий код, который преведён выше. Прям не знаю, крыша чтоли поехала...
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 4.06.2008 - 00:32

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Код
void create_matrix(int x[], int a, int b)
{
    for(int i=0; i<a; i++)
    {
        for (int j=0; j<b; j++)
        {
            x[i*b+j]=rand()%100;
        }
    }
}

(printf-ы не забудьте)

Вызов:
Код
        int F[10][10];
        create_matrix(F[0],10,10);


Примерно так. На самом деле, если вдуматься - здесь тоже применяется адрес (адрес первого элемента матрицы F), но поскольку звездочек нет, значит и явного применения указателей нет smile.gif

Сообщение отредактировано Graker - 4.06.2008 - 00:33
Перейти в начало страницы
 
+Цитировать сообщение
NotLiquid
сообщение 3.02.2009 - 20:05

в вечном поиске
*******

Группа: Участник
Сообщений: 8163
Регистрация: 24.11.2007
Пользователь №: 21977


А еще можно объявить матрицы глобальными и тогда - идите в пень ваще, товарищ преподаватель))
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 3.02.2009 - 20:47

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Цитата(NewJesus @ 3.02.2009 - 20:05) *
А еще можно объявить матрицы глобальными и тогда - идите в пень ваще, товарищ преподаватель))

Ты когда-нибудь слышал о таком понятии как некропостинг? smile.gif
Перейти в начало страницы
 
+Цитировать сообщение
NotLiquid
сообщение 3.02.2009 - 20:53

в вечном поиске
*******

Группа: Участник
Сообщений: 8163
Регистрация: 24.11.2007
Пользователь №: 21977


Упс... А то не слышать) Просто я как-то привык, что на первой странице обычно свежие темы висят) А тут затишье такое, я на дату последнего поста не посмотрел) Сорри)
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 25.04.2024 - 09:32