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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> двумерный массив, массив в фунцию 
:(
    Опции темы
intel
Дата 28.10.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.
Есть такая функция:
Код

void print(double matrix[MAX_SIZE][MAX_SIZE], int size)
{
    int i;
    for (i = 0; i < size; i++)
    {                
        int j;
        for (j = 0; j < size; j++)
        {               
            printf("%1.0f\t", matrix[i][j]);                
        }
        printf("\n");                
    } 
}

Проблема в том что если я передаю в неё массив размера size, где size меньше MAX_SIZE, то она перестаёт коректно работать, то бишь выдаёт пару значений из массива и много муссора. В этот самый мусор и есть моя проблема - откуда он?!  Подскажите, ребят

Это сообщение отредактировал(а) intel - 28.10.2009, 21:22
PM MAIL   Вверх
KuMa1104
Дата 28.10.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

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



В с++ не силен.
Но  как я понемаю масив у тебя лежит в памяти и функция читает по указаннаму адресу масив данных размером 8 баит * size.

А так как в памяти после твоего масива идёт какаято другая инфа. то компьётер читает её пока на дойдет до нужного места (начал масива + size)


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
jonie
Дата 28.10.2009, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



intel, как вызываешь показывай, и откуда буфер берешь с данными тоже


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
intel
Дата 29.10.2009, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



создаю и заполняю массив:
Код

double matrix[5][5] = { {1,2,3,4,5},
                        {6,7,8,9,10},
                        {11,12,13,14,15},
                        {16,17,18,19,20},
                        {21,22,23,24,25} };


Вот так вызываю:

Код

print(matrix,5);


Всё происходит в мэйне. Пишу на Dev-C++
PM MAIL   Вверх
Anikmar
Дата 29.10.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Так делать вообще нельзя.

По логике должно выдавать правильно первые n элементов.
Странно, что  это компилируется.

ИМХО Терпеть не могу статические массивы  smile 

Размеры массивов передаваемого и в прототипе функции должны совпадать.
PM MAIL ICQ   Вверх
andrew_121
Дата 29.10.2009, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(intel @  29.10.2009,  00:53 Найти цитируемый пост)
double matrix[5][5] =

Код

typedef std::vector<std::vector<double> > matrix;
...
void print(const matrix&);
...
matrix m(...);
...
print(m);
...


Это сообщение отредактировал(а) andrew_121 - 29.10.2009, 09:07


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 29.10.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(intel @  28.10.2009,  20:22 Найти цитируемый пост)
MAX_SIZE

чему равен?


--------------------
PM MAIL   Вверх
Cheloveck
Дата 29.10.2009, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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





--------------------
user posted image
PM Jabber   Вверх
andrew_121
Дата 29.10.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(Cheloveck @  29.10.2009,  09:09 Найти цитируемый пост)
Тема только что была 

Вот только я не понял, почему в том коде контейнеров нет?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
jonie
Дата 29.10.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Anikmar, почему это нельзя?
Код

#define MAX_SIZE 5

void print(double matrix[MAX_SIZE][MAX_SIZE], int size)
{
    int i;
    for (i = 0; i < size; i++)
    {                
        int j;
        for (j = 0; j < size; j++)
        {               
            printf("%1.0f\t", matrix[i][j]);                
        }
        printf("\n");                
    } 
}


int main(int argc, char** argv)
{

    double matrix[5][5] = { {1,2,3,4,5},
    {6,7,8,9,10},
    {11,12,13,14,15},
    {16,17,18,19,20},
    {21,22,23,24,25} };

    print(matrix,3);

    return 0;
}




все работает штатно, как и должно быть.
У автора где-то портится память очевидно?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
andrew_121
Дата 29.10.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(jonie @  29.10.2009,  09:31 Найти цитируемый пост)
почему это нельзя?

А почему не использовать контейнеры?

и:
Цитата(jonie @  29.10.2009,  09:31 Найти цитируемый пост)
double matrix[5][5] =

наверное все же так:
Код

double matrix[MAX_SIZE][MAX_SIZE] =



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Cheloveck
Дата 29.10.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(andrew_121 @  29.10.2009,  10:24 Найти цитируемый пост)
Вот только я не понял, почему в том коде контейнеров нет? 

Из-за специфики ТС. Думаю его нельзя было озадачивать контейнерами))


--------------------
user posted image
PM Jabber   Вверх
intel
Дата 29.10.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прошу прощения, Модеры, что поднимаю уже на сто раз разжёванную тему, но к сожалению после долгих хождений по форумам я так ничего и не нашёл.

Спасибо за комментарии и советы, но всётаки вопрос остаётся открытым. Постараюсь описать по подробнее.
В общем дана довольно-таки простенькая задачка: Напишите функцию, которая вычисляет детерминанту матрицы размером  N x N, где N define-константа. Функция имеет следующий прототип: 
Код
double get_det(double matrix[N][N], int size)

Побегал по форумам и пришёл к выводу, что реализовать это дело рекурсивно было бы самым изящным и наглядным способом. 
Значит так; вот что я тут накумекал: 
Создаю матрицу размером N, передаю в функцию get_det(matrix, N), которая создаёт tmp-матрицу размером (size-1)*(size-1), заполняет её значениями из переданной матрицы (без 0. строки и i. столбца) и вызывает саму себя, но уже с tmp-матрицей размером (size-1)x(size-1), size-1 и т.д. пока size > 1. 
Вот тут то и весь геморой, то бишь в прототипе размер матрицы равен N x N, а передаю (N-1) x (N-1) (первый рекурс-вызов)!!

Надеюсь ход мыслей понятен. Объяснил как мог. Господа Прогеры, может у вас есть более простое решение?, а то у меня после явы при виде статических массивов и указателей, волосы дыбом встают. Спасибо
PM MAIL   Вверх
mes
Дата 29.10.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(intel @  29.10.2009,  19:26 Найти цитируемый пост)
реализовать это дело рекурсивно...при виде статических массивов и указателей, волосы дыбом встают


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

#include <iostream>

#define $N 5

int mx[$N][$N] = { 0 };

void mxfn ( int mx[][$N], int size)
{
    if (!size) return;

    for (int i=0; i<size; ++i)
      for (int j=0; j<size; ++j)
        mx[i][j] +=1;

    mxfn (mx, size-1);
}

void mxprint  (int mx[][$N] )
{
     for (int i=0; i<$N; ++i)
     {
       for (int j=0; j<$N; ++j)
         std::cout <<mx[i][j]<< " ";

       std::cout << std::endl;
     }
}


int main(void)
{

     mxfn (mx, $N);
     mxprint (mx);

   return 0;
}



Это сообщение отредактировал(а) mes - 29.10.2009, 21:03


--------------------
PM MAIL WWW   Вверх
17dufa
Дата 30.10.2009, 14:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я подозреваю, что двумерный массив matrix[N][N] при компиляции становится одномерным. как следствие matrix[1][2] на самом деле будет matrix[1*N+2]. так как в вызываемой функции и вызывающей разные значения N получается бардак при адресации (положим в вызывающей N = 5, тогда matrix[1][2] на самом деле matrix[7], а в вызываемой N = 10 и как следствие matrix[1][2] на самом деле становится matrix[12]). не хотите контейнеров - используйте двойной указатель и динамическое выделение памяти.
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.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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