|
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
|
|
| 18.09.2019, 14:47 | |
|
Ответы с готовыми решениями:
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,
используйте %f или так
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 как решение
Решениев форматной строке нет приведения, что попросишь то и выведет классический пример
Добавлено через 1 минуту Евгений_А, KarKarasik, ставьте тэги кода, а то читать не удобно
1
|
|||||||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
|
| 19.09.2019, 17:14 | |
|
1
|
|
| 19.09.2019, 17:14 | |
|
Помогаю со студенческими работами здесь
8
Странная работа Wi-Fi
Странная работа селектора Странная работа потока Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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. Пошагово создадим проект для загрузки изображения. . .
|