Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2022, 15:17   #1
iXNomad
Пользователь
 
Регистрация: 06.01.2021
Сообщений: 45
Вопрос Очень странная ошибка в решении задачи на Си

Я сейчас изучаю Си, ещё не знаю всех тонкостей языка.

Задача: нужно посчитать количество положительных элементов массива и сумму отрицательных.
Даётся на вход массив и количество элементов.
Полученные результаты так же записываются в уже отведённые для этого области памяти, указатели на которые также передаются в параметрах.

В общем, моё решение работает:
Код:
void count_positives_sum_negatives(
  int *values, size_t count, int *positivesCount, int *negativesSum) 
{
  while(count-- > 0 ? (*values > 0 ? ++*positivesCount : (*negativesSum += *values)) + values++ : 0);
}  

Но выдаётся странная "ошибка", которая и не ошибка.
Код:
solution.c:6:94: warning: unsequenced modification and access to 'values' [-Wunsequenced]
  while(count-- > 0 ? (*values > 0 ? ++*positivesCount : (*negativesSum += *values)) + values++ : 0); 
                        ~~~~~~                                                               ^
1 warning generated.
Как её лучше исправить? На решение она у меня никак влияет.
iXNomad вне форума Ответить с цитированием
Старый 25.09.2022, 17:53   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

А вам запретили использовать for, if, переносы? В выражении "a + b" порядок вычисления выражений "a" и "b" строго не задан.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.09.2022, 18:52   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от iXNomad Посмотреть сообщение
На решение она у меня никак влияет.
Так влияет или нет. Определитесь.
macomics вне форума Ответить с цитированием
Старый 25.09.2022, 21:49   #4
iXNomad
Пользователь
 
Регистрация: 06.01.2021
Сообщений: 45
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А вам запретили использовать for, if, переносы? В выражении "a + b" порядок вычисления выражений "a" и "b" строго не задан.
Цитата:
Сообщение от macomics Посмотреть сообщение
Так влияет или нет. Определитесь.
Не влияло, но это, как я понял, неопределённое поведение.

Я нашёл способ исправить: просто выношу values++ в тело цикла, а в условии цикла заменяю его единицей.
ИЗи раскатал.

Код:
#include <stddef.h>

void count_positives_sum_negatives(
  int *values, size_t count, int *positivesCount, int *negativesSum) 
{
  while(count-- > 0 ? (*values > 0 ? ++*positivesCount : (*negativesSum += *values)) + 1 : 0) values++;
}
iXNomad вне форума Ответить с цитированием
Старый 25.09.2022, 22:04   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А разве обнулить переменные перед тем как гонять цикл не нужно?
macomics вне форума Ответить с цитированием
Старый 25.09.2022, 22:19   #6
iXNomad
Пользователь
 
Регистрация: 06.01.2021
Сообщений: 45
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
А разве обнулить переменные перед тем как гонять цикл не нужно?
Они там обнулены, проблем нет. Обнуляются в вызывающей программе.
iXNomad вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень странная ошибка HellMercenariess Общие вопросы Delphi 0 26.01.2017 12:38
Очень странная ошибка в PHP alhon PHP 7 22.10.2015 15:10
формулировка задачи очень странная i.yakushev Общие вопросы C/C++ 4 05.05.2011 10:12