С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 108

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

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

Студворк — интернет-сервис помощи студентам
Собственно сам код.
его действия:
В главной функции 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.07.2016, 14:29
Ответы с готовыми решениями:

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

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

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

7
Модератор
Эксперт С++
 Аватар для zss
13770 / 10963 / 6491
Регистрация: 18.12.2011
Сообщений: 29,240
05.07.2016, 14:59
А почему они должны обнуляться?
Я нигде не вижу чего-нибудь типа c[i]=0;
1
3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 108
05.07.2016, 15:01  [ТС]
Цитата Сообщение от 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
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.07.2016, 15:02
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
Цитата Сообщение от 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
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,989
Записей в блоге: 32
05.07.2016, 16:48
Цитата Сообщение от avgoor Посмотреть сообщение
Вы хотите, чтобы y=... в одном случае меняло значение y, а вдругом - объект к которому привязана ссылка? Так не бывает.
Бывает. Но ради этого придется взять например шарп.
1
3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 108
05.07.2016, 20:21  [ТС]
Но как же сделать так, чтоб забирать у функции innfunc1 элемент массива и обнулять его в innfunc?
0
 Аватар для fire_Rising
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
05.07.2016, 20:42
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.07.2016, 20:42
Помогаю со студенческими работами здесь

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

Почему, после завершения цикла и заполнения массива, данные в нем обнуляются?
почему после завершения цикла и заполнения массива, данные в нем обнуляются? Дана строка символов, состоящая из цифр от 0 до 9. Найти...

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru