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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание произвольного массива 
V
    Опции темы
oceanton
Дата 20.3.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

void vvod(int matr[3][5])
{    int i; int k;
    
    for (i=0;i<3;i++)
    {    for (k=0;k<5;k++)
  cin >> matr[i][k];
    };


Как сделать, чтобы массив был произвольным, а не 3 на 5 ?

нужна матрица типа matr[stroki][stolbci] где stroki и stolbci вводил бы пользователь заранее.
PM   Вверх
archimed7592
Дата 20.3.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Код
void vvod (int **matr, size_t n, size_t m)
{
    for (size_t i = 0; i < n; ++i)
     for (size_t j = 0; j < m; ++j)
         cin >> matr[i][j];
}

int main(int argc, char **argv)
{
    size_t n, m;
    cin >> n >> m;
    
    int **matr = new int *[n];
    for (size_t i = 0; i < n; ++i)
        matr[i] = new int [m];
        
    vvod (matr, n, m);
    
    for (size_t i = 0; i < n; ++i)
        delete [] matr[i];
        
    delete [] matr;
    
    return 0;
}




--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
oceanton
Дата 20.3.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

int vvod(int mass,& int n)

а так для одномерного пойдет?
PM   Вверх
vinter
Дата 20.3.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Код

int vvod(int *mass, int n)


Это сообщение отредактировал(а) vinter - 20.3.2007, 14:18


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


Новичок



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

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



Код

void vvod (int **matr, size_t n, size_t m)
{
    for (size_t i = 0; i < n; ++i)
     for (size_t j = 0; j < m; ++j)
         cin >> matr[i][j];
}

я может ошибаюсь, но по моему так работать не будет


правильно вот так:
Код

void vvod (int *matr, size_t n, size_t m)
{
    for (size_t i = 0; i < n; ++i)
     for (size_t j = 0; j < m; ++j)
         cin >> matr[i*m+j];
}

PM MAIL ICQ   Вверх
oceanton
Дата 20.3.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile 

Это сообщение отредактировал(а) oceanton - 20.3.2007, 15:19
PM   Вверх
Goryachev
Дата 20.3.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

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



Цитата(seacat79 @  20.3.2007,  14:58 Найти цитируемый пост)
код C++
1:
2:
3:
4:
5:
6:

void vvod (int **matr, size_t n, size_t m)
{
    for (size_t i = 0; i < n; ++i)
     for (size_t j = 0; j < m; ++j)
         cin >> matr[i][j];
}





я может ошибаюсь, но по моему так работать не будет


всё должно работать 
PM MAIL   Вверх
seacat79
Дата 20.3.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Goryachev @  20.3.2007,  15:16 Найти цитируемый пост)
всё должно работать  



Упс, не работает!  smile 

А почему?

А потому что m[j][i] интерпретируется как *(*(m+i)+j) ( по крайней мере так написано в описании языка ). И это корректно работает, только есть компилятор знает вторую размерность массива. А если не знает, то надо умножение и сложение производить самостоятельно smile

При использовании new вообще не гарантировано, что элементы массива будут распологаться друг за другом, так что ссылаться на элементы в виде [][] не имеет никакого смысла smile.

И еще, попробуйте передать в функцию
Код

void vvod (int **matr, size_t n, size_t m)

например такой массив a[2][2] и если не трудно напишите как вы это делаете, а то я так и не смог придумать записи для преобразования int[][] в int**  smile 
 
Цитата(oceanton @  20.3.2007,  15:11 Найти цитируемый пост)
массив же двумерный
?

это не мешает ему распологаться в памяти последовательно
PM MAIL ICQ   Вверх
Goryachev
Дата 20.3.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

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



Цитата(seacat79 @  20.3.2007,  15:36 Найти цитируемый пост)
Упс, не работает!  


да нет, всё работает. С GNU компайлером

Код

#include <iostream>
void vvod(int** matr, size_t n, size_t m)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> matr[i][j];
}

int main(int argc, char** argv)
{
    int mat[2][2];
    vvod((int**)&(mat[0][0]),2,2);
    return 0;
}


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


Новичок



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

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



Цитата(Goryachev @  20.3.2007,  15:56 Найти цитируемый пост)
да нет, всё работает. С GNU компайлером


Если речь идет о том, что компилируется тогда да

А вот насчет работать  smile 

Код

#include <iostream>
using namespace std;

void vvod(int** matr, size_t n, size_t m)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> matr[i][j];
}
int main(int argc, char** argv)
{
    int mat[2][2] = {0,0,0,0};
    vvod((int**)&(mat[0][0]),2,2);

    for(int x=0; x<2; x++)
    {
        for(int y=0; y<2; y++)
            cout<<mat[x][y]<<"\t";
        cout<<endl;
    }
    return 0;
}

У меня не работает

А под gdb вообще получаем SEGMENTATION FAULT

Это сообщение отредактировал(а) seacat79 - 20.3.2007, 16:04
PM MAIL ICQ   Вверх
Goryachev
Дата 20.3.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

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



seacat79, ты прав. Чо то я прогнал smile
Не будет работать конечно. перепутал.
Извиняюсь за недоразумение.
PM MAIL   Вверх
vinter
Дата 20.3.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(seacat79 @  20.3.2007,  15:36 Найти цитируемый пост)
например такой массив a[2][2] и если не трудно напишите как вы это делаете, а то я так и не смог придумать записи для преобразования int[][] в int**  

так и нечего придумывать! если в аргументах ** то будьте добры передавайте двойной указатель, а если надо передавать двумерный массив то и в аргументах указывайте его!

Цитата(seacat79 @  20.3.2007,  15:36 Найти цитируемый пост)
При использовании new вообще не гарантировано, что элементы массива будут распологаться друг за другом, так что ссылаться на элементы в виде

скорее даже гарантировано что не будут..

Цитата(seacat79 @  20.3.2007,  15:36 Найти цитируемый пост)
 так что ссылаться на элементы в виде [][] не имеет никакого смысла .

еще как имеет p[i][j] ~ *(*(p + i) + j)



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


Новичок



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

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



Цитата(vinter @  20.3.2007,  17:54 Найти цитируемый пост)
еще как имеет p[i][j] ~ *(*(p + i) + j)


И где это значение находится? Ответ: где-то  smile  Поэтому и написал, что использовать [][] нет никакого смысла
PM MAIL ICQ   Вверх
vinter
Дата 20.3.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(seacat79 @  20.3.2007,  18:10 Найти цитируемый пост)
И где это значение находится? Ответ: где-то    Поэтому и написал, что использовать [][] нет никакого смысла

нет, ответ: там где надо, почитай про арифметику указателей smile 



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


Архимед
****


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

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



oceanton, 
seacat79, 
Goryachev,
дружно идём сюда и читаем что такое указатель, что такое массив указателей и чем он отличается от "псевдодвухмерного" линейного массива с константными размерностями...
развели тут сплетней из-за элементарной проги...

добавить к тому, что написано по вышеуказанной ссылке могу только то, что компилятор умный и оператор [] делает разные вещи в зависимости от того, к чему он применяется...точно так же как * может применятся как для разыменования, так и для умножения smile 


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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