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

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

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

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

15.05.2012, 00:49. Просмотров 4133. Ответов 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();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 00:49     Двойной указатель
Посмотрите здесь:

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

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

Указатель на указатель заполнение матрицы - C++
Помогите как самому вбивать матрицу скоко на скоко и элементы этой матрицы ( без функций ) используя только &lt;iostream&gt;. (помощь)

Указатель на указатель заполнение матрицы - C++
Напишите как самому вбивать матрицу скок на скока и каждый элемент в нем (заранее спасибо)!

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

Указатель на указатель - разница способов - C++
int a =5; int *b = &amp;a; int **e =&amp;b; //первый способ //Нужно писать столько * скока указателей.. int *f = b; //Втрой...

Указатель на указатель, класс группа - C++
помогите пожалуйста не могу понять что со строкой 312 знаю что с указателем что то не то... но исправить не получается //4. В...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Ушёл с форума.
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
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
16.05.2012, 00:49     Двойной указатель #7
Цитата Сообщение от Jazz411 Посмотреть сообщение
сам я пишу int main(void) но так и не понял, то есть использовать можно, но нежелательно?
В стандарте сказано именно, что она должна возвращать целочисленное знаковое, то есть нельзя так писать. Компиляторы не выдают в этом месте ошибку возможно для совместимости со старыми кодами, а может и по каким другим причинам.
diagon
Higher
1928 / 1194 / 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
Модератор
Эксперт CЭксперт С++
7178 / 4344 / 634
Регистрация: 29.11.2010
Сообщений: 11,828
16.05.2012, 07:00     Двойной указатель #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
ВКомпиляторы не выдают в этом месте ошибку возможно для совместимости со старыми кодами, а может и по каким другим причинам.
gсс, Dev(не смотря на то, что им никто не занимается уже давно) ругаются. Такое можно делать только в VS и Борланде.

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

Добавлено через 3 минуты
А написано все на гибридном языке. Работа с файлами, вывод на экран, библиотеки с языка С, а операторы работы с памятью С++.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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++
В упор не могу понять правила которые приводит Дьюхерст для преобразований &quot;многоуровневых&quot; указателей. (Дьюхерст &quot;Скользкие места...

Зачем использовать Указатель на указатель? - C++
Подскажите зачем использовать Указатель на указатель? И как работают двумерные массивы за счет указателей?

Сделать указатель на указатель NULL - C++
есть код: class Matrix { private: double **data; //нужно, чтобы в самом начале это было NULL double *b; //и это тоже было NULL ...

Освободить указатель на указатель - C++
class Interface { }; class Test : public Interface { }; void main() { Interface** s = new Interface*; for (int i =...

Ссылка на указатель на указатель - C++
void TEST( int **&amp;refptr, int const &amp;N); int main() { int const N = 10; int i{ 0 }, b{ 2 }, *ptr{ &amp;i, &amp;b }; ...


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

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

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