Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
5 / 5 / 0
Регистрация: 24.01.2017
Сообщений: 234
1

Вывод массива из функции как указатель

20.03.2021, 13:10. Показов 1379. Ответов 6

Author24 — интернет-сервис помощи студентам
Здравствуйте люди добрые
подскажите, пожалуйста,
как вывести из функции обработанный функцией массив
(выводит вместо правильного результата нули)

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
#include <stdlib.h> //для _getchar(), printf(), putchar();
#include <stdio.h> //для _getchar(), printf(), putchar();
//#include <locale.h>
#include <conio.h> // _getch()
 
//функция возведения в стпень матрицы mas
float* degr(float*, float*, float*, int sz, int dg);
 
void main(void) {
 
int n=0; //размерность матрицы
float mas[4][4] = {
     {0.4, 0.6, 0, 0},
     {0.4, 0, 0.6, 0},
     {0, 0.6, 0, 0.4},
     {0.4, 0, 0.6, 0} };
 
// p2,p3 - временные массивы для передачи в функцию
float **p2 = calloc(4,sizeof(float*));
    if (!p2) exit(1);
for (int i= 0; i<4; ++i) {
    p2[i]= calloc(4,sizeof(float*));
        if (!p2) exit(1);
}
 
float **p3 = calloc(4,sizeof(float*));
    if (!p3) exit(1);
for (int i= 0; i<4; ++i) {
    p3[i]= calloc(4,sizeof(float*));
        if (!p3) exit(1);
}
//сюда предполагается результат функции ссылка на массив
float **rez = calloc(4,sizeof(float*));
    if (!rez) exit(1);
for (int i= 0; i<4; ++i) {
    rez[i]= calloc(4,sizeof(float*));
    if (!rez) exit(1);
}
 
// инициализация например исходным массивом
p2[0]= mas[0];
p3[0]= mas[0];
rez[0] = mas[0];
 
// Функция должна возвращать массив но не возвращает
rez[0] = degr(mas[0], p2[0], p3[0], 4, 1);
//rez = degr(mas[0], p2[0], p3[0], 4, 1);
 
 
 
//вывод результата
printf("\n REZULTAT:\n");
printf("\n");
for (int i= 0; i<4; ++i) {
for (int j = 0; j<4; ++j) {
    //printf("%.2f ", rez[4*i+j]);
    printf("%.2f ", rez[4*i+j]);
 }
    printf("\n");
 }
 
_getch();
_getch();
free (mas);
free (p2);
free (p3);
free (rez);
 
_getch();
 
}//Конец программы
 
 
//Функция
float* degr(float *p, float *tmp1, float *tmp2, int sz, int dg){
 
 
for (int r = 1; r <= dg; ++r) { //Цикл возведения в степень r
    float ss = 0.0;
 
    //умножаю матрицы- результат tmp3 будет=============
    for (int i= 0; i<sz; ++i) {
    for (int j = 0; j<sz; ++j) {
 
         ss = 0.0;
//            p3[i*4+j] = ss;
//            puts("   Stop =============================\n");
//            printf(" p3[i*4+j] =%.2f i=%d  j=%d ", p3[i*4+j], i, j);
//            _getch();
 
                    //ищем элемент p3[i,j]
                    for (int k = 0; k < sz; k++){
                          ss += (p[i*4+k]) * (tmp1[k*4+j]);
 
//            puts("   Stop =============================\n");
//            printf(" ss= %.2f \n ", ss);
//            _getch();
//
                     }
 
                    tmp2[i*4+j] = ss; //здесь tmp3 обновляет все свои старые значения
 
              //puts("   Stop =============================\n");
              //печать результата на экран из внутри функции для проверки
              printf(" tmp2[%d][%d] = %.2f   ", i, j,tmp2[i*4+j]);
              if (j==3) printf("\n");
             // _getch();
 
      }
      }
    //=========================================
 
    tmp1[0] = tmp2[0]; // и снова считаем p*tmp2, где уже tmp2=tmp3
 
}
    return (tmp2);
}
Миниатюры
Вывод массива из функции как указатель  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2021, 13:10
Ответы с готовыми решениями:

Указатель массива как аргумент функции
Я прочитал несколько алгоритмов сортировки массивов, но не совсем понял, если массив чисел будет...

Указатель на константную строку и имя массива как указатель
Изучаю C. У меня есть указатель на константную строку, и я хочу его изменить путем передачи в...

Не могу осуществить вывод массива в файл, нужен вывод первоначального массива и массива после выполнения функции
FILE* f_output; f_output = fopen(&quot;output.txt&quot;, &quot;w&quot;); printf(&quot;Выберите размер...

Вывод массива через указатель
Небольшой набросок, есть функция, вычисляющая значения произвольного выражения. Эти значения потом...

6
Заблокирован
20.03.2021, 13:33 2
Цитата Сообщение от Rukov Посмотреть сообщение
как вывести из функции обработанный функцией массив
(выводит вместо правильного результата нули)
Для таких проблем добрые бородатые дяди-программисты придумали отладчик. Посмотри пошагово, как формируются значения и индексы выходного массива.
0
5 / 5 / 0
Регистрация: 24.01.2017
Сообщений: 234
20.03.2021, 14:32  [ТС] 3
Цитата Сообщение от Verevkin Посмотреть сообщение
как формируются значения и индексы выходного массива
...функция формирует массив в соответствии с ожидаемым результатом (это отображено на рисунке)
индексы выходного массива не выходят за диапазон
вопрос не в этом
проблема как достать его оттуда в указатель и какого типа должен быть
0
Заблокирован
20.03.2021, 18:32 4
Цитата Сообщение от Rukov Посмотреть сообщение
вопрос не в этом
проблема как достать его оттуда в указатель
вернуть, например, через return, как у тебя и сделано.
Цитата Сообщение от Rukov Посмотреть сообщение
и какого типа должен быть
Такого, какого надо программисту, который пишет код.
---------
Ты лучше расскажи, зачем ты юзаешь одномерные массивы для работы с матрицами? Ты маньяк-чикатила?
0
5 / 5 / 0
Регистрация: 24.01.2017
Сообщений: 234
20.03.2021, 23:40  [ТС] 5
Цитата Сообщение от Verevkin Посмотреть сообщение
зачем ты юзаешь одномерные массивы для работы с матрицами? Ты маньяк-чикатила?
...массивы на десерт оставил )
*&]%$#@!~
0
2305 / 1131 / 702
Регистрация: 25.04.2016
Сообщений: 3,224
21.03.2021, 12:52 6
Лучший ответ Сообщение было отмечено Rukov как решение

Решение

Rukov, лучше скажите что ваша программа должна делать. Возвращать из функции указатель на массив программисту приходится примерно раз в 5 лет, и я более чем уверен, что в вашей программе это совершенно ненужное и лишнее действие.

кстати
C
1
2
3
4
5
6
float **p2 = calloc(4,sizeof(float*));
    if (!p2) exit(1);
for (int i= 0; i<4; ++i) {
    p2[i]= calloc(4,sizeof(float*));
        if (!p2) exit(1);
}
во-первых, так не надо делать, слишком много вызовов calloc, пример того, как это делается ровно в два обращения к памяти, я уже приводил.
во-вторых, p2[i]= calloc(4,sizeof(float*)); тут ошибка. Почему у вас sizeof(float*), когда должно быть sizeof(float)?

Ну а вашу функцию degr(), не зная что она должна делать, я даже разбирать не хочу.

Добавлено через 1 минуту
То, что занимает меньше строчек кода, далеко не всегда работает быстрее.

Из того, что я видел на данный момент, получается вот это:
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
#include <math.h>
#include <stdio.h>
#define N 4
 
void degr (float a[][N], float b[][N], int rows, int columns, int power) {
    // Цикл возведения каждого элемента массива a[][] в степень power
    for (int i = 0; i < rows; ++i)
        for (int k = 0; k < columns; ++k)
            b[i][k] = pow(a[i][k], power);
}
 
void print (float a[][N], int rows, int columns) {
    // Вывод массива на экран
    for (int i = 0; i < rows; ++i, puts(""))
        for (int k = 0; k < columns; ++k)
            printf("%8.2f", a[i][k]);
}
 
int main (void) {
    float rez[N][N], mas[N][N] = {
        {0.4, 0.6, 0.0, 0.0},
        {0.4, 0.0, 0.6, 0.0},
        {0.0, 0.6, 0.0, 0.4},
        {0.4, 0.0, 0.6, 0.0}
    };
    
    degr(mas, rez, N, N, 3);    // Функция НЕ должна возвращать массив!
    puts("mas:");       print(mas, N, N);
    puts("\nrez:");     print(rez, N, N);
    return 0;
}
Добавлено через 11 минут
Ну или если без циклического возведения в степень вот совсем никак. Ну не приемлет душа math подключать, и все тут:
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
#include <stdio.h>
#define N 4
 
void degr (float a[][N], float b[][N], int rows, int columns, int power) {
    // Цикл возведения каждого элемента массива a[][] в целую степень power
    for (int base = 0; base <= power; ++base)
        for (int i = 0; i < rows; ++i)
            for (int k = 0; k < columns; ++k)
                b[i][k] = (base < 1)? 1.0 : b[i][k] * a[i][k];
}
 
void print (float a[][N], int rows, int columns) {
    // Вывод массива на экран
    for (int i = 0; i < rows; ++i, puts(""))
        for (int k = 0; k < columns; ++k)
            printf("%8.2f", a[i][k]);
}
 
int main (void) {
    float rez[N][N], mas[N][N] = {
        {0.4, 0.6, 0.0, 0.0},
        {0.4, 0.0, 0.6, 0.0},
        {0.0, 0.6, 0.0, 0.4},
        {0.4, 0.0, 0.6, 0.0}
    };
 
    degr(mas, rez, N, N, 3);    // Функция НЕ должна возвращать массив!
    puts("mas:");       print(mas, N, N);
    puts("\nrez:");     print(rez, N, N);
    return 0;
}
1
5 / 5 / 0
Регистрация: 24.01.2017
Сообщений: 234
24.03.2021, 20:18  [ТС] 7
...ну да ошибок много было
все же довел свой вариант до рабочего состояния
проблем много пришлось решать:
IDE Eclipct, mingw, с Dev, сам код

вот рабочий вариант
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
#include <stdlib.h> //для _getchar(), printf(), putchar();
#include <stdio.h> //для _getchar(), printf(), putchar();
//#include <locale.h>
#include <conio.h> // _getch()
 
//функция возведения в стпень матрицы mas
float** degr(float**, float**, float**, int sz, int dg);
 
 
void main(void) {
 
int n=0, i=0,j=0;
 
//объявление массивов участвующих
//mas - исходный
float **mas = calloc(4,sizeof(float*));
    if (!mas) exit(1);
for (int i= 0; i<4; ++i) {
    mas[i]= calloc(4,sizeof(float*));
        if (!mas) exit(1);
}
// p2,p3 - временные массивы для передачи в функцию
float **p2 = calloc(4,sizeof(float*));
    if (!p2) exit(1);
for (int i= 0; i<4; ++i) {
    p2[i]= calloc(4,sizeof(float*));
        if (!p2) exit(1);
}
float **p3 = calloc(4,sizeof(float*));
    if (!p3) exit(1);
for (int i= 0; i<4; ++i) {
    p3[i]= calloc(4,sizeof(float*));
        if (!p3) exit(1);
}
 
float **pf = calloc(4,sizeof(float*));
    if (!pf) exit(1);
for (int i= 0; i<4; ++i) {
    pf[i]= calloc(4,sizeof(float*));
        if (!pf) exit(1);
}
//определение массивов
//исходный
mas[0][0]=0.4;  mas[0][1]=0.6; mas[0][2]=0.0; mas[0][3]=0.0;
mas[1][0]=0.4;  mas[1][1]=0.0; mas[1][2]=0.6; mas[1][3]=0.0;
mas[2][0]=0.0;  mas[2][1]=0.6; mas[2][2]=0.0; mas[2][3]=0.4;
mas[3][0]=0.4;  mas[3][1]=0.0; mas[3][2]=0.6; mas[3][3]=0.0;
 
// инициализация например исходным массивом
for (i = 0; i < 4; ++i) {
    for (j = 0; j < 4; ++j) {
        p2[i][j] = mas[i][j];
    }
}
 
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
    p3[i][j]= mas[i][j];
    }
}
 
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
    pf[i][j]= mas[i][j];
    }
}
//степень указывается на 1 меньше...
pf = degr(mas, p2, p3, 4, 1);
 
printf("\n");
 
 
for (int i = 0; i < 4; ++i){
for (int j = 0; j< 4; ++j) {
           printf("%.3f ", pf[i][j]);
       }
           printf("\n");
       }
 
//_getch();
 
free (mas);
free (p2);
free (p3);
free (pf);
 
}//Конец программы
 
//Функция
float** degr(float **p, float **tmp1, float **tmp2, int sz, int dg){
    int i=0, j=0, r=0;
    float ss = 0.0;
for ( r = 0; r <= dg-1; ++r) { //Цикл возведения в степень r
 
 
    //умножаю матрицы- результат tmp2 будет=============
    for ( i= 0; i<sz; ++i) {
    for ( j = 0; j<sz; ++j) {
 
//            puts("   Stop =============================\n");
//            printf(" p3[i*4+j] =%.2f i=%d  j=%d ", p3[i*4+j], i, j);
//            _getch();
     ss = 0.0;
                    for (int k = 0; k < sz; k++){
                       ss += p[i][k] * tmp1[k][j];
 
//            puts("   Stop =============================\n");
//            printf(" ss= %.2f \n ", ss);
            //_getch();
                     }
 
                    tmp2[i][j] = ss; //здесь tmp3 обновляет все свои старые значения
                    ss = 0.0;
                   // _getch();
       //puts("   Stop =============================\n");
       //печать результата на экран из внутри функции для проверки
      // printf(" tmp2[%d][%d] = %.2f   ", i, j,tmp2[i*4+j]);
     //  if (j==3) printf("\n");
        //_getch();
      }
      }
    //=========================================
 
    //tmp1[0] = tmp2[0]; // и снова считаем p*tmp1
 
    for (int i = 0; i < 4; ++i){
    for (int j = 0; j< 4; ++j) {
               tmp1[i][j] = tmp2[i][j];
           }
 
           }
 
    //_getch();
}
    return (tmp2);
}


...ну и если в Dev впихнуть, то привести тип надо когда память выделяешь,
иначе ругается
0
24.03.2021, 20:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2021, 20:18
Помогаю со студенческими работами здесь

Вывод двумерного массива через указатель
в пятой главе Прохоренка приведен такой фрагмент кода #include &lt;iostream&gt; using namespace std;...

Вывод двумерного массива на экран, переданного через указатель
Выводит совсем не то, что нужно исправить в функции вывода ? // labrab2.12.cpp: определяет точку...

Вызов функции из массива, через указатель
имею код #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;utility&gt; using namespace std; void...

Передача массива другой функции через указатель
Сейчас я изучаю функции и выполняю упражнение по работе с массивом. Задача такая: занести числа в...

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

Создание функции инициализации двумерного массива строк через указатель
Здравствуйте,имеется двумерный массив: in_data_up=_T(&quot;00&quot;); in_data_up=_T(&quot;01&quot;); ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru