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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Deep_sea
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 9
#1

Разобраться в функции - C++

15.08.2012, 16:23. Просмотров 1087. Ответов 20
Метки нет (Все метки)

Здравствуйте! Имеем функцию на C. Не могу разобраться в строках 17-19 и 30-32. Возможно ли в C++ реализовать их более понятно или хотя бы поясните, как эту функцию перенести в C++, компилятор ругается на строки 19 и 32?

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
40
41
42
43
44
45
//  Функция запрашивает необходимую информацию и строит рваный массив, возвращая
//   указатель   на   него.   Количество   строк   хранится   в   «минус   первом»   элементе   вектора
// указателей на строки, а  в «минус первом» элементе каждой строки – количество элементов 
// в строке
double ** ConstructArray()
{
double ** p=NULL;
int N, M; // количество строк, элементов в строке
// Ввести корректное количество строк
do
{
printf("\nProgram makes an array of N rows.\n");
printf("Please, enter N (1<=N<=10): ");
scanf("%d", &N);
}while(N<1 || N>10);
p=(double **)malloc( sizeof(double *)*N + sizeof(int));// выделить память
((int *)p)[0]=N; //записать количество строк
((int *)p)++; //сдвинуть указатель
// вводить построчно
for(int i=0; i<N; i++)
{
// ввести корректное количество элементов в строке
do
{
printf("Enter M - number of elements in %d-th row (1<=M<=10): ", i);
scanf("%d", &M);
}while(M<1 || M>10);
// выделить память
p[i]=(double *)malloc( M*sizeof(double) + sizeof(int));
((int *)(p[i]))[0]=M; // записать длину строки
((int *)(p[i]))++; // сдвинуть указатель
// поэлементно вводим и сохраняем в массив строки
for(int j=0; j<M; j++)
{
double m;
do
{
printf("\nEnter A[%d][%d] (1<=A[%d][%d]<=10): ", i, j, i, j);
scanf("%lf", &m);
}while(m<1 || m>10);
p[i][j]=m;
}
}
return p; // вернем сконструированный массив
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2012, 16:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разобраться в функции (C++):

Разобраться в небольшой функции - C++
Здравствуйте, нужно разобраться в этой функции. Заранее спасибо. ifs &gt;&gt; big &gt;&gt; n; istream&amp; operator&gt;&gt;(istream&amp; ifs, BigInt&amp; big) { ...

не могу разобраться в функции - C++
нашел в инете функцию добавление в список, но не могу разобраться что означает переменная link void add(LIST *link,int data) { ...

Функции в c++. никак не разобраться с задачками - C++
можете объяснить решения нескольких задач? застрял на передаче параметров по ссылке. а также : возврат результата по ссылке. не...

Не могу разобраться с отработкой рекурсивной функции - C++
Доброго времени суток. Имеется функция находящая в первом массиве количество повторения второго массива: #include &lt;iostream&gt; using...

помогите разобраться с ошибкой в вызове функции - C++
компилятор выдает ошибку `sum1' cannot be used as a function #include &lt;stdio.h&gt; #include &lt;conio.h&gt; float sum1 (int sum, int c,...

Разобраться в функции перемножения двух векторов - C++
Здравствуйте, помогите разобраться в функции, для перемножения двух векторов. Хочу получить ответ хотя бы на один вопрос. Заранее спасибо. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.08.2012, 16:37 #16
Цитата Сообщение от Deep_sea Посмотреть сообщение
Ну так вопрос к преподавателю, как он решил, так и написал.
Я про него и пишу. Такие конструкции:
C++
1
2
((int *)p)++; 
((int *)(p[i]))++;
в принципе не могут быть выполнены. В последних круглых скобках получается временное выражение (rvalue), к которому нельзя применить инкремент. Кстати, в такой строке: (int *)p++; (47 строка) приведение к int* не срабатывает. Нужный сдвиг там происходит из-за совпадение размера double** и int*. Если уж правильно писать, то так:
C++
1
p = (double**)((int*)p + 1);
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
26.03.2013, 01:21 #17
alsav22, А что делать если количество строк нужно хранить в "Терминальный символ в конце вектора указателей на строки" ?
Т.е. что вобще есть этот терминальный символ?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2013, 02:45 #18
Цитата Сообщение от Вебер Посмотреть сообщение
Т.е. что вобще есть этот терминальный символ?
Насколько знаю, это: '\0'. Конец строки в стиле С.

Добавлено через 1 минуту
Цитата Сообщение от Вебер Посмотреть сообщение
А что делать если количество строк нужно хранить в "Терминальный символ в конце вектора указателей на строки" ?
Эту фразу не понимаю.
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
26.03.2013, 04:06 #19
Цитата Сообщение от Deep_sea Посмотреть сообщение
Возможно ли в C++ реализовать их более понятно
Легко, нужно только использовать нормальные контейнеры вроде std::vector<std::vector<double> > и не заниматься ерундой с указателями.
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
26.03.2013, 08:39 #20
alsav22,
Насколько знаю, это: '\0'. Конец строки в стиле С.
да это так называемый нультерминант,для определения конца строки.

Если Deep_sea, требовалось хранить информацию о массиве в -1 эелементе,то мне требуеться хранить в "Терминальный символ в конце вектора указателей на строки",и как это вобще я не понимаю.
salam
162 / 143 / 12
Регистрация: 10.07.2012
Сообщений: 726
26.03.2013, 09:34 #21
"double ** p=NULL" after "((int *)p)++". It`s incorrect.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2013, 09:34
Привет! Вот еще темы с ответами:

Функции и файлы! Для продвинутых, я не могу разобраться. - C++
Есть ли тут профи, которые смогут мне помочь, плз? Квадратная матрица действительных чисел хранится в файле. Оформить в виде функции...

Stack. определение шаблона функции testStack. (хочу разобраться в коде) - C++
Вот эта программа. Хочу разобраться в коде. #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;Stack&gt; using namespace std; ...

Не могу разобраться как сделать указатель функции с динамич. массивом - C++
int* mass(int p, int n) { cout &lt;&lt; &quot;Введите размер массива: &quot;; cin&gt;&gt;n; int *p = new int ; for (int i(0); i &lt; n; i ++) { cout &lt;&lt;...

не могу разобраться с функциями ( значение функции, заданной с помощью ряда) - C++
Добрый день! пишу программу, которая вычисляет значение функции, заданной с помощью ряда. я плохо разбираюсь в написании функций, но...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.03.2013, 09:34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru