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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 5.00
Arvin
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 3
#1

Двойной указатель - C++

15.05.2012, 00:49. Просмотров 4198. Ответов 10
Метки нет (Все метки)

Это не совсем C++ вроде, а просто C, но поясните, пожалуйста, зачем в коде в строчку **sums=NULL используется двойной указатель?

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <stdio.h>
#include <process.h>
#include <math.h>
float *a, *b, *x, *y, **sums;
int N, K;
//N - number of data points
//K - polinom power
//K<=N
char filename[256];
FILE* InFile=NULL;
void count_num_lines(){
   //count number of lines in input file - number of equations
   int nelf=0;       //non empty line flag
   do{
       nelf = 0;
       while(fgetc(InFile)!='\n' && !feof(InFile)) nelf=1;
       if(nelf) N++;
   }while(!feof(InFile));
}
 
void freematrix(){
   //free memory for matrixes
   int i;
   for(i=0; i<K+1; i++){
       delete [] sums[i];
   }
   delete [] a;
   delete [] b;
   delete [] x;
   delete [] y;
   delete [] sums;
}
 
void allocmatrix(){
   //allocate memory for matrixes
   int i,j,k;
   a = new float[K+1];
   b = new float[K+1];
   x = new float[N];
   y = new float[N];
   sums = new float*[K+1];
   if(x==NULL || y==NULL || a==NULL || sums==NULL){
       printf("\nNot enough memory to allocate. N=%d, K=%d\n", N, K);
       exit(-1);
   }
   for(i=0; i<K+1; i++){
       sums[i] = new float[K+1];
       if(sums[i]==NULL){
       printf("\nNot enough memory to allocate for %d equations.\n", K+1);
       }
   }
   for(i=0; i<K+1; i++){
       a[i]=0;
       b[i]=0;
       for(j=0; j<K+1; j++){
       sums[i][j] = 0;
       }
   }
   for(k=0; k<N; k++){
       x[k]=0;
       y[k]=0;
   }
}
 
void readmatrix(){
   int i=0,j=0, k=0;
   //read x, y matrixes from input file
   for(k=0; k<N; k++){
       fscanf(InFile, "%f", &x[k]);
       fscanf(InFile, "%f", &y[k]);
   }
   //init square sums matrix
   for(i=0; i<K+1; i++){
       for(j=0; j<K+1; j++){
       sums[i][j] = 0;
       for(k=0; k<N; k++){
           sums[i][j] += pow(x[k], i+j);
       }
       }
   }
   //init free coefficients column
   for(i=0; i<K+1; i++){
       for(k=0; k<N; k++){
       b[i] += pow(x[k], i) * y[k];
       }
   }
}
 
void printresult(){
   //print polynom parameters
   int i=0;
   printf("\n");
   for(i=0; i<K+1; i++){
       printf("a[%d] = %f\n", i, a[i]);
   }
}
void diagonal(){
   int i, j, k;
   float temp=0;
   for(i=0; i<K+1; i++){
       if(sums[i][i]==0){
       for(j=0; j<K+1; j++){
           if(j==i) continue;
           if(sums[j][i] !=0 && sums[i][j]!=0){
           for(k=0; k<K+1; k++){
               temp = sums[j][k];
               sums[j][k] = sums[i][k];
               sums[i][k] = temp;
           }
           temp = b[j];
           b[j] = b[i];
           b[i] = temp;
           break;
           }
       }
       }
   }
}
void cls(){
   for(int i=0; i<25; i++) printf("\n");
}
void main(){
   int i=0,j=0, k=0;
   cls();
   do{
       printf("\nInput filename: ");
       scanf("%s", filename);
       InFile = fopen(filename, "rt");
   }while(InFile==NULL);
   count_num_lines();
   printf("\nNumber of points: N=%d", N);
   do{
       printf("\nInput power of approximation polinom K<N: ");
       scanf("%d", &K);
   }while(K>=N);
   allocmatrix();
   rewind(InFile);
   //read data from file
   readmatrix();
   //check if there are 0 on main diagonal and exchange rows in that case
   diagonal();
   fclose(InFile);
   //printmatrix();
   //process rows
   for(k=0; k<K+1; k++){
       for(i=k+1; i<K+1; i++){
       if(sums[k][k]==0){
           printf("\nSolution is not exist.\n");
           return;
       }
       float M = sums[i][k] / sums[k][k];
       for(j=k; j<K+1; j++){
           sums[i][j] -= M * sums[k][j];
       }
       b[i] -= M*b[k];
       }
   }
   //printmatrix();
   for(i=(K+1)-1; i>=0; i--){
       float s = 0;
       for(j = i; j<K+1; j++){
       s = s + sums[i][j]*a[j];
       }
       a[i] = (b[i] - s) / sums[i][i];
   }
   printresult();
   freematrix();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 00:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Двойной указатель (C++):

Двойной указатель - C++
for (i=0; i&lt;N; i++) delete A; //Освобождение памяти для A delete A; Вопрос по синтаксису: для чего необходимо ставить в...

Двойной указатель на объект класса - C++
Подскажите что означает следующее определение объекта класса. A **myA; где - A имя класса, а myA его объект. Мне не понятно что...

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

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

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

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

10
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:14 #2
удали функцию
C++
1
2
3
void cls(){
   for(int i=0; i<25; i++) printf("\n");
}
cls(); замени на
C++
1
system("cls");//очистка консоли (не изобретай велосипед)
Ну смотри я толком не смотрел твой код, но если у тебя матрицы то sums это указать на указатель то есть ты в строчке sums = new float*[K+1]; делаешь из него массив указателей, а в sums[i] = new float[K+1]; делаешь его полноценной матрицей где в каждой ячейке sums[i] пресвоенно указатель на одинарный массив. Почитай в гугле (учебнике) как создать двумерный массив динамически (передача двумерного массива в функцию).
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.05.2012, 11:54 #3
Цитата Сообщение от Arvin Посмотреть сообщение
**sums=NULL используется двойной указатель
За тем, что по нему выделяется двумерный динамический массив.
Цитата Сообщение от Arvin Посмотреть сообщение
Это не совсем C++ вроде, а просто C,
А по-моеум это не то, и не другое: c++ не поддерживает void main(), а c - вроеде не поддерживает декларации переменнхы где попало.

Добавлено через 6 минут
[QUOTE]In function 'allocmatrix':
Line 3: error: 'for' loop initial declaration used outside C99 mode
In function 'main':
Line 8: warning: return type of 'main' is not 'int'
C++
1
2
3
4
5
6
7
8
9
10
void allocmatrix(int k)
{
   for(int i=0; i<k+1; i++)
 {
 }
}
void main ()
{
 allocmatrix (11);
}
0
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 23:29 #4
Цитата Сообщение от taras atavin Посмотреть сообщение
c++ не поддерживает void main()
в смысле не поддерживает? А как же самые первые проекты которые начинались с void main()?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
16.05.2012, 00:05 #5
Цитата Сообщение от Jazz411 Посмотреть сообщение
void main()
Это можно было делать в старых версиях Си. Сейчас же по стандарту main должна возвращать целочисленное знаковое значение.
Цитата Сообщение от taras atavin Посмотреть сообщение
вроеде не поддерживает декларации переменнхы где попало.
В последнем стандарте ( C99 ) это делать можно, как и указано в ошибке. Но в Си вообще так делать не нужно.
0
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
16.05.2012, 00:26 #6
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это можно было делать в старых версиях Си. Сейчас же по стандарту main должна возвращать целочисленное знаковое значение.
сам я пишу int main(void) но так и не понял, то есть использовать можно, но нежелательно?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
16.05.2012, 00:49 #7
Цитата Сообщение от Jazz411 Посмотреть сообщение
сам я пишу int main(void) но так и не понял, то есть использовать можно, но нежелательно?
В стандарте сказано именно, что она должна возвращать целочисленное знаковое, то есть нельзя так писать. Компиляторы не выдают в этом месте ошибку возможно для совместимости со старыми кодами, а может и по каким другим причинам.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.05.2012, 06:37 #8
Цитата Сообщение от Jazz411 Посмотреть сообщение
в смысле не поддерживает? А как же самые первые проекты которые начинались с void main()?
Ага. А когда-то все писалось с помощью машинных кодов.
void main уже лет 10-15 запрещен стандартом с++.
Наиболее популярные компиляторы(MSVC, gcc) отказываются компилировать код, если main возвращает не int.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,017
16.05.2012, 07:00 #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
ВКомпиляторы не выдают в этом месте ошибку возможно для совместимости со старыми кодами, а может и по каким другим причинам.
gсс, Dev(не смотря на то, что им никто не занимается уже давно) ругаются. Такое можно делать только в VS и Борланде.

Добавлено через 1 минуту
Цитата Сообщение от Jazz411 Посмотреть сообщение
в смысле не поддерживает? А как же самые первые проекты которые начинались с void main()?
Именно поэтому мне так не понравился VS, с самого начала учат проприетарным стандартам

Добавлено через 3 минуты
А написано все на гибридном языке. Работа с файлами, вывод на экран, библиотеки с языка С, а операторы работы с памятью С++.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
16.05.2012, 07:17 #10
Цитата Сообщение от MrGluck Посмотреть сообщение
gсс, Dev
Dev С++ не компилятор, а IDE. И он использует тот же GCC в качестве компилятора, но, вроде, не очень свежий.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,017
16.05.2012, 14:29 #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Dev С++ не компилятор, а IDE. И он использует тот же GCC в качестве компилятора, но, вроде, не очень свежий.
Он использует gcc 3.4.2.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2012, 14:29
Привет! Вот еще темы с ответами:

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Функция принимает указатель на void и возвращает указатель на int - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Указатель на указатель, функции для создания новых массивов? - C++
Всем привет! У меня в коде есть несколько новых массивов, чтобы не повторяться я создам функцию которая будет выделять память под новые...

Приведение любого двумерного массива к типу указатель на указатель - C++
Допустим, есть несколько массивов int arr1; int arr2; int arr3; Какое преобразование нужно сделать, чтобы подобные присвоения...


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

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

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