Форум программистов, компьютерный форум CyberForum.ru

Указатель на строку массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.60
ol4ik
 Аватар для ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
14.05.2011, 20:57     Указатель на строку массива #1
Попалось на глаза задание:
Написать функцию get_arr, которая предназначена для заполнения значениями двумерных массивов произвольной длины. Функция имеет два аргумента
а) arr - указатель на первую строку массива;
б) len - число элементов в строке.
Вот пытаемся разобрать,как можно с помощью указателя на строку заполнить массив?Объясните,если не трудно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 21:05     Указатель на строку массива #2
Цитата Сообщение от ol4ik Посмотреть сообщение
Попалось на глаза задание:
Написать функцию get_arr, которая предназначена для заполнения значениями двумерных массивов произвольной длины. Функция имеет два аргумента
а) arr - указатель на первую строку массива;
б) len - число элементов в строке.
Вот пытаемся разобрать,как можно с помощью указателя на строку заполнить массив?Объясните,если не трудно.
Если память под двухмерный массив не была выделена одним куском, то никак.
Если была, и неизвестно количество строк в массиве, то никак.
Если известно количество строк и память выделена одним куском, то можно просто скопировать указатель и увеличивать его для каждого добавления, пока он не дойдет до значения произведения длины строки на длину массива строк.
ol4ik
 Аватар для ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
14.05.2011, 21:14  [ТС]     Указатель на строку массива #3
Jtalk, количество строк и столбцов задаётся пользователем,а потом под массив с таким количеством столбцов и строк выделяется память,так что мне не совсем понятно,что значит "не одним куском"
и непонятно,что значит "копировать указатель"?
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 21:31     Указатель на строку массива #4
Цитата Сообщение от ol4ik Посмотреть сообщение
Jtalk, количество строк и столбцов задаётся пользователем,а потом под массив с таким количеством столбцов и строк выделяется память,так что мне не совсем понятно,что значит "не одним куском"
и непонятно,что значит "копировать указатель"?
Вот это одним куском
C
1
int ** a = (int**)malloc(sizeof(int)*height*width);
А вот это нет
C++
1
2
3
int ** a = new int*[10];
for (int i = 0 ; i < 10 ; i++)
    a[i] = new int[10];
Выделять память первым способом - костыль и извращение, но это единственный способ работать с двухмерным массивом, если нет доступа к нему непосредственно (вы в условии написали, что дан указатель на первую строку - соответственно, без указателя на массив указателей на строки доступ к остальным строкам можно получить только если они выделены в непрерывной области памяти).

А вот новая редакция условия - где количество строк и столбцов задается явно и есть доступ непосредственно к этому массиву - уже решается элементарно.
ol4ik
 Аватар для ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
14.05.2011, 21:42  [ТС]     Указатель на строку массива #5
Jtalk, ну это было бы логично предположить,раз уж для начинающих)
так что с указателем делать?оо
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 21:53     Указатель на строку массива #6
Цитата Сообщение от ol4ik Посмотреть сообщение
Jtalk, ну это было бы логично предположить,раз уж для начинающих)
так что с указателем делать?оо
Там не было указано, что для начинающих. %)
Задание сформулировано очень туманно. Как бы обычный способ заполнения массива - присваивание значения типа
C++
1
a[i][j] = value;
Но что нужно в задании я, если честно, не совсем понимаю.
ol4ik
 Аватар для ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
14.05.2011, 21:59  [ТС]     Указатель на строку массива #7
Цитата Сообщение от Jtalk Посмотреть сообщение
Там не было указано, что для начинающих. %)
моя ошибка +)
ну значит просто логично :Р

Цитата Сообщение от Jtalk Посмотреть сообщение
Как бы обычный способ заполнения массива
уж про это можно было и не говорить)
как массив инициализируется и ежу понятно

Цитата Сообщение от Jtalk Посмотреть сообщение
Но что нужно в задании я, если честно, не совсем понимаю.
что нужно в задание-то как раз написано,а вот как это сделать +)

нужны идеи
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 22:03     Указатель на строку массива #8
Раз в функцию не передаются значения, значит она должна запросить их ввод.
ol4ik
 Аватар для ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
14.05.2011, 23:04  [ТС]     Указатель на строку массива #9
Jtalk, ну так весь смысл в том,чтобы в функции заполнить массив .-.

Добавлено через 54 минуты
Это была задача моей подруги и она с ней справилась
вот код,если кому понадобится
C++
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
26
27
28
29
30
31
32
33
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
 
void mas(int**, int,int);
//----------------------
//const int n1=5, n2=4;
void main()
{clrscr();
int x[6][6]; //y[20];
int i,j,n1,n2,**pp,*p;
//-----------------------------------
 printf("vvedite razmernost n1 n2\n");
 scanf("%d %d",&n1,&n2);
 p=&x[0][0];
 **pp=*p;
mas(pp,n1,n2);
getch();
}
 
void mas(int **x, int n1, int n2)
{int i,j;
 
 for (i=0; i<n1; i++)
 for (j=0; j<n2; j++)
 { printf("vvod x[%d][%d]\n",i,j);
  scanf("%d", &x[j]);}
   for (i=0; i<n1; i++)
 for (j=0; j<n2; j++)
 { printf("x[%d][%d]=%d\n",i,j,x[j]);  }
 
return ;
 }
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
15.05.2011, 01:19     Указатель на строку массива #10
Цитата Сообщение от ol4ik Посмотреть сообщение
Jtalk, ну так весь смысл в том,чтобы в функции заполнить массив .-.
По поводу приведенного кода:

Если ввести размерность 10х10 будет весело.
А нет, ошибся, оно с любыми значениями SIGSEGV выбросит.


C++
1
 **pp=*p;
Копируем в первый элемент неинициализированного двухмерного массива первый элемент статического массива. И получаем access violation.


Для void-функций return писать не обязательно.


Массив задается статически, с фиксированными границами. А в условии размерность его не оговорена. Фэйл.


Подключен заголовочный файл потоков ввода/вывода C++, но используется I/O из C. Причем плюсовые хидеры std не содержат в своем названии расширение. Хидеры с расширением устарели поди еще до моего рождения.

C++
1
p=&x[0][0];
Это вообще эпик. Статические массивы приводятся к указателям автоматически.


Решил потренировать мозг и вспомнить молодость:
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * @brief Array filling routine
 * @param height of array needed
 * @param width of array needed
 * @return pointer to 2-D array that has been filled or NULL if height or width
 * are invalid
 *
 * Please take note that you should clear array's memory by yourself.
 */
int**
input(int height, int width)
{
    // Arguments control
    if (height <= 0 || width <= 0)
        return NULL;
 
    // Memory allocating
    int** array = new int*[height];
    for (int i = 0 ; i < height ; i++)
        array[i] = new int[width];
 
    // Items input
    using std::cout;
    using std::cin;
    using std::endl;
    using std::flush;
 
    cout<<"Let us start!"<<endl;
 
    for (int i = 0 ; i < height ; i++)
        for (int j = 0 ; j < width ; j++)
        {
            cout<<"Input number with indexes "<<i<<" "<<j<<": "<<flush;
            cin>>array[i][j];
        }
 
    // Well done
    return array;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2011, 01:29     Указатель на строку массива
Еще ссылки по теме:

Приведение любого двумерного массива к типу указатель на указатель C++
C++ Работа с строкой (указатель на строку)
Вернуть указатель на строку C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ol4ik
 Аватар для ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
15.05.2011, 01:29  [ТС]     Указатель на строку массива #11
Jtalk, я ту задачу даже не проверяла,потому что у меня Visuаl C++,а она через Turbo C++ делает или что-то вроде того

но я ей дала код и скопировала замечания
ей,наверное,понадобится оо"
Yandex
Объявления
15.05.2011, 01:29     Указатель на строку массива
Ответ Создать тему
Опции темы

Текущее время: 08:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru