Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 25.02.2019
Сообщений: 9
1

Почему в данной функции неправильные значения

11.01.2020, 14:13. Просмотров 366. Ответов 11


Здравствуйте, имеется функция:

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
#include <stdio.h>
 
int Length(int *arr)
{
    return(sizeof(arr)/sizeof(arr[0]));
}
 
int main()
{
    const int SIZE = 10;
    int arr[SIZE];
 
    arr[0] = 0;
    arr[1] = 1;
    arr[2] = 2;
    arr[3] = 3;
    arr[4] = 4;
    arr[5] = 5;
    arr[6] = 6;
    arr[7] = 7;
    arr[8] = 8;
    arr[9] = 9;
 
    Length(arr); //равен 2
    printf("%d \n", sizeof(arr)/sizeof(arr[0])); // равен 10
 
    return 0;
}
Так вот, почему если я эту операцию проделаю в функции, то вернётся 2, а если просто разделю в mian'e, то всё правильно?

Прикол в том, что в функции sizeof(arr) равен не 40 как должно быть, а 8. sizeof(arr[0]) вообще равен 4. Почему? не знаю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2020, 14:13
Ответы с готовыми решениями:

Почему при проверке заполнения массива выводятся неправильные значения?
// ConsoleApplication15.cpp: определяет точку входа для консольного приложения. // #include...

Вычислить с заданной точностью значения данной функции
Ребят, очень нужна помощь в решении задачи с помощью вложенных циклов. Суть задачи: Вычислить с...

Вычислить с заданной точностью значения данной функции на интервале
Вычислить с заданной точностью значения данной функции на интервале от Xнач до Xкон с шагом h,...

Вычислить с заданной точностью значения данной функции на интервале
Вычислить с заданной точностью  значения данной функции на интервале...

11
Модератор
Эксперт CЭксперт С++
4289 / 3855 / 706
Регистрация: 07.10.2015
Сообщений: 7,900
11.01.2020, 14:31 2
The little nigh, в функции Вы получаете размер не массива, а указателя.
А вот в main() компилятор видит массив и высчитывает его размер.

Добавлено через 2 минуты
sizeof(arr[0]) == 4, т.к. это размер int-а, как элемента, адрес которого находится в arr
1
0 / 0 / 0
Регистрация: 25.02.2019
Сообщений: 9
11.01.2020, 14:33  [ТС] 3
Спасибо это на самом деле объясняет такое поведение, но как тогда это исправить? передать массив как-то так:
const int SIZE = 10;

int Length(int arr[SIZE])
{
...
}
0
Модератор
Эксперт CЭксперт С++
4289 / 3855 / 706
Регистрация: 07.10.2015
Сообщений: 7,900
11.01.2020, 14:39 4
The little nigh, это тоже самое
Если нужна длина массива в подпрограмме, передайте явно.
C++
1
2
3
4
int fun(int* arr, int SIZE)
{
...
}
1
Продавец времени
4887 / 2668 / 612
Регистрация: 12.03.2015
Сообщений: 12,916
11.01.2020, 14:40 5
Цитата Сообщение от The little nigh Посмотреть сообщение
но как тогда это исправить?
Никак. По одному только указателю размер узнать невозможно. Именно для этого си-строки оканчиваются нулём.
1
Модератор
Эксперт CЭксперт С++
4289 / 3855 / 706
Регистрация: 07.10.2015
Сообщений: 7,900
11.01.2020, 14:41 6
Если глобальная константа, то и передавать не надо. И так видна.
0
0 / 0 / 0
Регистрация: 25.02.2019
Сообщений: 9
11.01.2020, 14:43  [ТС] 7
Большое спасибо, я подумал, что такое решение мне вполне подойдёт:
C++
1
2
3
4
5
6
7
8
int Length(int* arr, int size)
{
    int sum = 0;
    for(int i = 0; i < size; ++i)
        sum++;
    
    return sum;
}
0
Модератор
Эксперт CЭксперт С++
4289 / 3855 / 706
Регистрация: 07.10.2015
Сообщений: 7,900
11.01.2020, 14:46 8
The little nigh, ну тогда назовите не int Length(), a что-то типа int CalcSum()
1
Продавец времени
4887 / 2668 / 612
Регистрация: 12.03.2015
Сообщений: 12,916
11.01.2020, 14:50 9
Цитата Сообщение от The little nigh Посмотреть сообщение
Большое спасибо, я подумал, что такое решение мне вполне подойдёт
Эта функция не имеет смысла.
0
бах-бах и в продакшен!
2561 / 1328 / 474
Регистрация: 23.09.2014
Сообщений: 4,121
Записей в блоге: 4
11.01.2020, 14:51 10
The little nigh,
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
#include <stdio.h>
 
int Length(int arr[])
{   return(sizeof(arr)/sizeof(arr[0]));
}
 
int main()
{   const int SIZE = 10;
    int arr[SIZE];
 
    arr[0] = 0;
    arr[1] = 1;
    arr[2] = 2;
    arr[3] = 3;
    arr[4] = 4;
    arr[5] = 5;
    arr[6] = 6;
    arr[7] = 7;
    arr[8] = 8;
    arr[9] = 9;
 
    Length(arr); //равен 2
    printf("%d \n", sizeof(arr)/sizeof(arr[0])); // равен 10
 
    return 0;
}
0
3956 / 2230 / 929
Регистрация: 07.02.2019
Сообщений: 5,856
11.01.2020, 15:11 11
The little nigh,
C++
1
2
3
4
5
6
7
template<class T, size_t N>
constexpr size_t Length(T(&arr)[N])
{
    return N;
}
// или просто используй
std::size(arr);
1
652 / 465 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
11.01.2020, 20:35 12
А всё это потому что ~40 лет назад люди не могли себе позволить передавать массив целиком
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.01.2020, 20:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Построить машину Тьюринга, вычисляющую значения данной функции
Построить машину Тьюринга, вычисляющую значения данных функции. g(x) = 5x

Вычислить с заданной точностью значения данной функции на интервале
Вычислить с заданной точностью значения данной функции на интервале от до с шагом h, используя...

Вычислить с заданной точностью ε значения данной функции на интервале
Вычислить с заданной точностью ε значения данной функции на интервале от Хнач до Хкон с шагом h,...

Вычислить с заданной точностью значения данной функции на интервале от до с шагом h
Вычислить с заданной точностью значения данной функции на интервале от до с шагом h, используя...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.