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

Странная работа программы

18.09.2019, 14:47. Показов 2863. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такой простенький код:
#include <stdio.h>
float low_med_res(float *, int);

int main(void)
{
float numbers[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
float * pi_numbers = &numbers;
float MedCount = low_med_res(pi_numbers, 10);

printf("Среднее арифметическое == %d\n", MedCount);

return 0;
}

float low_med_res(float * size, int count)
{
float All_Results;

for (int i = 0; i < count; i++)
{
All_Results += size[i];
}

All_Results /= count;

return All_Results;
}

Хочу обратить на вот этот участок кода:
float MedCount = low_med_res(pi_numbers, 10);
Если изменить тип переменной на int то выводится значение 4,
но если тип float, то выводит 0.
Я не понимаю в чем проблема, подскажите пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2019, 14:47
Ответы с готовыми решениями:

Странная работа программы
Подскажите пожалуйста. Пытаюсь разобраться в простеньком скриншотере. При нажатии на первую кнопку в image который расположен на Scroolbox...

Странная работа БД
Спасибо всем тем, кто решил откликнуться. Сначала лирика: Имеется проект &quot;Калькулятор&quot;, созданы различные типы инженерный,...

Странная работа ПК
Всем привет. Вчера все было нормально, сегодня начал заходить в игру - начал замечать что при заходе в нее начинает что-то свистеть в...

7
0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 4
18.09.2019, 15:43
Вы передаёте указатель pi_numbers в функцию low_med_res, а работаете с ней, как с массивом (All_Results += size[i].
Тогда уж хотя-бы так: All_Results += *size++;.
0
0 / 0 / 0
Регистрация: 14.09.2019
Сообщений: 57
18.09.2019, 19:35  [ТС]
К сожалению ваш вариант не помог.
К тому же если поставить тип int то все работает как должно,
а если float то выводит 0.
Если сделать вот так:
#include <stdio.h>
float low_med_res(float, int);

int main(void)
{
float numbers[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
//float * pi_numbers = &numbers;
float MedCount = low_med_res(numbers[10], 10);

printf("Среднее арифметическое == %d\n", MedCount);

return 0;
}

float low_med_res(float size, int count)
{
float All_Results;

for (int i = 0; i < count; i++)
{
All_Results += size[i];
}

All_Results /= count;

return All_Results;
}
То компилятор выведет:
Program95.c: В функции «low_med_res»:
Program95.c:21:24: ошибка: индексируемый объект не является ни массивом, ни указателем, ни вектором
All_Results += size[i];

То есть, с указателем можно работать как с массивом, ведь
массив по сути указатель на свой первый элемент.
Плюс еще то, что указатель указывает на адрес массива.

При компиляции самого первого кода компилятор выдает предупреждение:
Program95.c:7:24: предупреждение: initialization of «float *» from incompatible pointer type «float (*)[10]» [-Wincompatible-pointer-types]
float * pi_numbers = &numbers;
0
0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 4
18.09.2019, 21:27
Проверил на Си для микроконтроллера MSP430F169. Другого компилятора нет под рукой. Всё работает.
По идее, различаться не должно.

#include "msp430x16x.h"

float arithmetic_mean_array; // среднее арифметическое массива
float low_med_res (float *position_data_array, int size_array); // указатель на начало массива, размер массива
//-----------------------------------------------------
int main(void)
{
float numbers[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // если изменить кол-во элементов, всё автоматически в функцию подставится, как надо
float numbers_2[] = {10, 11, 12, 13, 14};

// функция вычисляет среднее арифметическое любого массива типа float величиной до максимального размера переменных size_array, i, т.е. до int
arithmetic_mean_array = low_med_res ( numbers, // адрес первого элемента массива
sizeof(numbers)/sizeof(float)); // размер массива в байтах / размер типа данных массива = кол-во элементов массива


arithmetic_mean_array = low_med_res ( numbers_2, sizeof(numbers_2)/sizeof(float));


//printf("Среднее арифметическое == %d\n", MedCount);
}
//------------------------------------------------------------
float low_med_res (float *position_data_array, int size_array)
{ float sum_array_elements = 0;

for (int i = 0; i < size_array; i++)
{ sum_array_elements += *position_data_array++;} // подсуммирование элемента из позиции, куда показывает указатель и постинкремент указателя

return (sum_array_elements /= size_array);
}
0
12 / 10 / 2
Регистрация: 15.12.2017
Сообщений: 70
19.09.2019, 15:00
Лучший ответ Сообщение было отмечено KarKarasik как решение

Решение

KarKarasik,
C
1
printf("Среднее арифметическое == %d\n", MedCount);
проблема в %d это значит вывести целое число, и когда вы туда суёте с плавающей точкой получаете 0.
используйте %f
или так
C
1
printf("Среднее арифметическое == %d\n", (int)MedCount);
1
0 / 0 / 0
Регистрация: 14.09.2019
Сообщений: 57
19.09.2019, 16:37  [ТС]
Спасибо большое, программа работает как надо!
Только мне непонятно одно, даже когда там стоял %d должно было
вывестись 4, ведь в C тип автоматически преобразовался бы, а здесь
был 0.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
19.09.2019, 17:07
Лучший ответ Сообщение было отмечено KarKarasik как решение

Решение

Цитата Сообщение от KarKarasik Посмотреть сообщение
Только мне непонятно одно, даже когда там стоял %d должно было
вывестись 4, ведь в C тип автоматически преобразовался бы, а здесь
был 0.
нет не должен
в форматной строке нет приведения, что попросишь то и выведет
классический пример
C
1
2
char a='A';
printf ("%x %d %c",a,a,a);
выведет шеснадцетиричное десятичное и символ

Добавлено через 1 минуту
Евгений_А, KarKarasik, ставьте тэги кода, а то читать не удобно
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
19.09.2019, 17:14
Цитата Сообщение от KarKarasik Посмотреть сообщение
даже когда там стоял %d должно было
вывестись 4, ведь в C тип автоматически преобразовался бы
Нет, никакого "тип автоматически преобразовался" в printf быть не может.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2019, 17:14
Помогаю со студенческими работами здесь

Странная работа Wi-Fi
Вчера начал пропадать интернет т.е. есть, рраз на пол минуты - минуту отключается и снова есть, пропадет по разному бывает каждые 5 минут,...

Странная работа vk.com
Недавно я проапгрейдил комп, поставил новую мать, ссд и проц, и сверху на ссдшник накатил новую винду. Однако после переустановки виндовс...

Странная ошибка при запуске программы
Привет! Есть программа на Pascal с модулем для гаражного кооператива. Почему-то при запуске выдаёт ошибку при компиляции(хотя ее по факту...

Странная работа селектора
Объясните мне почему выполняется эта часть кода? Она не должна выполняться так как клиент ничего не отправляет! Что за магия?)) Глюки...

Странная работа потока
Вообщем не могу понять в чем дело, есть программа: //--------------------------------------------------------------------------- ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru