3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 108
1

Почему не обнуляются элементы массива? (функции, массивы, указатели)

05.07.2016, 14:29. Показов 680. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно сам код.
его действия:
В главной функции tmain выполняется функция innfunc, а функция innfunc вызывает функцию innfunc1.
Вопрос: почему не обнуляются элименты массива? Как поправить чтоб работало?

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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
void innfunc(int*);
int & innfunc1(int*);
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a[3] = {5,20,10}; //создаем массив из трех элементов 
    innfunc(a); // вызываем функцию
    system ("pause");
    return 0;
}
 
void innfunc(int *b)
{
    int &y = innfunc1(b); //создаем ссылку, на элемент массива, который вернет функция innfunc1
       //создадим цикл который обнуляет наши элементы массива
    do
    {
        y = 0;
        y = innfunc1(b); //обнулили элемент, берем новый
        cout << y << endl;
    } while (y > 0);
}
 
int & innfunc1(int *c)
{
    cout << "c[0] " << c[0] << endl;
    cout << "c[1] " << c[1] << endl;
    cout << "c[2] " << c[2] << endl;
    for (int i = 0;; i++) //цикл вернет элемент который не равен нулю
    {
        if (c[i] > 0)
        {
            return c[i];
            break;
        }
        if (!(c[i + 1] >= 0)) //условие вернет ноль когда все элементы равны нулю
                {
            return c[1];
            break;
                }
    }
}
Пока уходит в бесконечный цикл, т.к. элементы не обнуляются.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2016, 14:29
Ответы с готовыми решениями:

список (в программе обнуляются указатели на структуры)
здравствуйте помогите найти ошибку, при возврате указателя на структуру из функции в функцию майн...

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц)
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник...

Указатели на массивы. Указатели и функции
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно...

Указатели и массивы. Указатели и функции
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию...

7
Модератор
Эксперт С++
13585 / 10819 / 6438
Регистрация: 18.12.2011
Сообщений: 28,849
05.07.2016, 14:59 2
А почему они должны обнуляться?
Я нигде не вижу чего-нибудь типа c[i]=0;
1
3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 108
05.07.2016, 15:01  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
А почему они должны обнуляться?
Я нигде не вижу чего-нибудь типа c[i]=0;
y это ссылка на элемент
Вот же:
C++
1
2
3
4
5
6
do
    {
        y = 0;
        y = innfunc1(b); //обнулили элемент, берем новый
        cout << y << endl;
    } while (y > 0);
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.07.2016, 15:02 4
Igorokmen, В строке 19 вы инициализировали ссылку с помощью c[0]. Все. Она всегда связана с c[0]. Поэтому в строке 23 выполняется с[0]=0; а в строке 24: c[0]=innfunc(b). Вы хотите, чтобы y=... в одном случае меняло значение y, а вдругом - объект к которому привязана ссылка? Так не бывает.
Если переписать с помощью указателей, то в одном слусае будет y=... в другом *y=...
2
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
05.07.2016, 15:07 5
Цитата Сообщение от Igorokmen Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
if (c[i] > 0)
{
    return c[i];
    break;
}
if (!(c[i + 1] >= 0)) //условие вернет ноль когда все элементы равны нулю
{
    return c[1];
    break;
}
break не нужен, и так выйдет из цикла
1
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
05.07.2016, 16:48 6
Цитата Сообщение от avgoor Посмотреть сообщение
Вы хотите, чтобы y=... в одном случае меняло значение y, а вдругом - объект к которому привязана ссылка? Так не бывает.
Бывает. Но ради этого придется взять например шарп.
1
3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 108
05.07.2016, 20:21  [ТС] 7
Но как же сделать так, чтоб забирать у функции innfunc1 элемент массива и обнулять его в innfunc?
0
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
05.07.2016, 20:42 8
Igorokmen, работать через указатель, а не через ссылку, т.е.
C++
1
2
3
4
5
6
 
int *y = innfunc1(b);
*y = 0; //обнуляем значение по адресу
 
//Ну и здесь изменить тип возвр значения соответственно 
int *innfunc1(int *c) {}
И еще вопрос, зачем использовать в параметрах указатель?
C++
1
innfunc1(int *c)
Ты как бы (c) все равно никак не меняешь.

Добавлено через 5 минут
Предлагаю просто написать так
C++
1
int *innfunc1(int c);
а вызывать так:
C++
1
int *y = innfunc1(&b);
1
05.07.2016, 20:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2016, 20:42
Помогаю со студенческими работами здесь

почему после завершения цикла и заполнения массива, данные в нем обнуляются?
почему после завершения цикла и заполнения массива, данные в нем обнуляются? Дана строка...

Указатели и массивы: почему заданный код даёт разные результаты?
Почему этот код даёт разные результаты? Что присваивается указателю во втором случае? int main()...

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

указатели.функции.массивы.
помогите решить в с++ Array75. Дан массив размера N. Переставить в обратном порядке элементы...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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