Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 3

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

15.05.2012, 00:49. Показов 6055. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2012, 00:49
Ответы с готовыми решениями:

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

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

Как создать ссылку на двойной указатель?
Как создать ссылку на двойной указатель?

10
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:14
удали функцию
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
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.05.2012, 11:54
Цитата Сообщение от 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
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 23:29
Цитата Сообщение от taras atavin Посмотреть сообщение
c++ не поддерживает void main()
в смысле не поддерживает? А как же самые первые проекты которые начинались с void main()?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
16.05.2012, 00:05
Цитата Сообщение от Jazz411 Посмотреть сообщение
void main()
Это можно было делать в старых версиях Си. Сейчас же по стандарту main должна возвращать целочисленное знаковое значение.
Цитата Сообщение от taras atavin Посмотреть сообщение
вроеде не поддерживает декларации переменнхы где попало.
В последнем стандарте ( C99 ) это делать можно, как и указано в ошибке. Но в Си вообще так делать не нужно.
0
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
16.05.2012, 00:26
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это можно было делать в старых версиях Си. Сейчас же по стандарту main должна возвращать целочисленное знаковое значение.
сам я пишу int main(void) но так и не понял, то есть использовать можно, но нежелательно?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
16.05.2012, 00:49
Цитата Сообщение от Jazz411 Посмотреть сообщение
сам я пишу int main(void) но так и не понял, то есть использовать можно, но нежелательно?
В стандарте сказано именно, что она должна возвращать целочисленное знаковое, то есть нельзя так писать. Компиляторы не выдают в этом месте ошибку возможно для совместимости со старыми кодами, а может и по каким другим причинам.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.05.2012, 06:37
Цитата Сообщение от Jazz411 Посмотреть сообщение
в смысле не поддерживает? А как же самые первые проекты которые начинались с void main()?
Ага. А когда-то все писалось с помощью машинных кодов.
void main уже лет 10-15 запрещен стандартом с++.
Наиболее популярные компиляторы(MSVC, gcc) отказываются компилировать код, если main возвращает не int.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.05.2012, 07:00
Цитата Сообщение от Toshkarik Посмотреть сообщение
ВКомпиляторы не выдают в этом месте ошибку возможно для совместимости со старыми кодами, а может и по каким другим причинам.
gсс, Dev(не смотря на то, что им никто не занимается уже давно) ругаются. Такое можно делать только в VS и Борланде.

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

Добавлено через 3 минуты
А написано все на гибридном языке. Работа с файлами, вывод на экран, библиотеки с языка С, а операторы работы с памятью С++.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
16.05.2012, 07:17
Цитата Сообщение от MrGluck Посмотреть сообщение
gсс, Dev
Dev С++ не компилятор, а IDE. И он использует тот же GCC в качестве компилятора, но, вроде, не очень свежий.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.05.2012, 14:29
Цитата Сообщение от Toshkarik Посмотреть сообщение
Dev С++ не компилятор, а IDE. И он использует тот же GCC в качестве компилятора, но, вроде, не очень свежий.
Он использует gcc 3.4.2.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2012, 14:29
Помогаю со студенческими работами здесь

Как использовать возврат по адресу двойной указатель?
Как передать двойной указатель в функцию и вернуть его?

Как передать двойной указатель не через ссылку?
Не выводит значение двойного указателя. Скорее всего он уничтожается при выходе из функции, а как по другому передать и вернуть указатель...

Как передать двойной указатель в функцию и вернуть его
Как передать двойной указатель в функция и вернуть его? В данном случае выдает ошибку :error C2440: =: невозможно преобразовать...

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

Указатель типа void. Использование косвенного связывания через универсальный указатель
Необходимо использовать косвенного связывания через универсальный указатель, примерный вид: struct обобщение{ключ; void* на что угодно}...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru