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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 5.00
Arvin
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 3
15.05.2012, 00:49     Двойной указатель #1
Это не совсем 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();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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] пресвоенно указатель на одинарный массив. Почитай в гугле (учебнике) как создать двумерный массив динамически (передача двумерного массива в функцию).
taras atavin
Ушёл с форума.
 Аватар для 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);
}
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 23:29     Двойной указатель #4
Цитата Сообщение от taras atavin Посмотреть сообщение
c++ не поддерживает void main()
в смысле не поддерживает? А как же самые первые проекты которые начинались с void main()?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
16.05.2012, 00:05     Двойной указатель #5
Цитата Сообщение от Jazz411 Посмотреть сообщение
void main()
Это можно было делать в старых версиях Си. Сейчас же по стандарту main должна возвращать целочисленное знаковое значение.
Цитата Сообщение от taras atavin Посмотреть сообщение
вроеде не поддерживает декларации переменнхы где попало.
В последнем стандарте ( C99 ) это делать можно, как и указано в ошибке. Но в Си вообще так делать не нужно.
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
16.05.2012, 00:26     Двойной указатель #6
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это можно было делать в старых версиях Си. Сейчас же по стандарту main должна возвращать целочисленное знаковое значение.
сам я пишу int main(void) но так и не понял, то есть использовать можно, но нежелательно?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
16.05.2012, 00:49     Двойной указатель #7
Цитата Сообщение от Jazz411 Посмотреть сообщение
сам я пишу int main(void) но так и не понял, то есть использовать можно, но нежелательно?
В стандарте сказано именно, что она должна возвращать целочисленное знаковое, то есть нельзя так писать. Компиляторы не выдают в этом месте ошибку возможно для совместимости со старыми кодами, а может и по каким другим причинам.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.05.2012, 06:37     Двойной указатель #8
Цитата Сообщение от Jazz411 Посмотреть сообщение
в смысле не поддерживает? А как же самые первые проекты которые начинались с void main()?
Ага. А когда-то все писалось с помощью машинных кодов.
void main уже лет 10-15 запрещен стандартом с++.
Наиболее популярные компиляторы(MSVC, gcc) отказываются компилировать код, если main возвращает не int.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
16.05.2012, 07:00     Двойной указатель #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
ВКомпиляторы не выдают в этом месте ошибку возможно для совместимости со старыми кодами, а может и по каким другим причинам.
gсс, Dev(не смотря на то, что им никто не занимается уже давно) ругаются. Такое можно делать только в VS и Борланде.

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

Добавлено через 3 минуты
А написано все на гибридном языке. Работа с файлами, вывод на экран, библиотеки с языка С, а операторы работы с памятью С++.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
16.05.2012, 07:17     Двойной указатель #10
Цитата Сообщение от MrGluck Посмотреть сообщение
gсс, Dev
Dev С++ не компилятор, а IDE. И он использует тот же GCC в качестве компилятора, но, вроде, не очень свежий.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2012, 14:29     Двойной указатель
Еще ссылки по теме:

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель C++
Функция, получающая указатель на обычную функцию, получает указатель на метод класса C++
C++ Как правильно удалять выделенную память под указатель на указатель?

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
16.05.2012, 14:29     Двойной указатель #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Dev С++ не компилятор, а IDE. И он использует тот же GCC в качестве компилятора, но, вроде, не очень свежий.
Он использует gcc 3.4.2.
Yandex
Объявления
16.05.2012, 14:29     Двойной указатель
Ответ Создать тему
Опции темы

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