Форум программистов, компьютерный форум CyberForum.ru

Объявление функции с массивом - C++

Восстановить пароль Регистрация
 
 
Deelooc
0 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 19
28.07.2016, 10:01     Объявление функции с массивом #1
Сейчас задам очень странный вопрос)
Что это значит: int F1(char[]) не могу понять)) спасибо!

Добавлено через 25 минут
и вот ещё вопрос: a[i] += 'A' -'a'
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2016, 10:01     Объявление функции с массивом
Посмотрите здесь:

Объявление функции C++
объявление функции C++
Объявление функции (непонятно) C++
Объявление функции C++
Объявление и определение функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,197
Завершенные тесты: 1
28.07.2016, 11:19     Объявление функции с массивом #2
1. Ответ в названии темы.
F1 - функция, возвращающая int, параметр которой текстовый массив

2. 'A' -'a' - это разница между кодом символов верхнего и нижнего регистра.
Однако, в кодовой таблице заглавные буквы расположены раньше, поэтому 'A' -'a' отрицательное.
Т.е. a[i] += 'A' -'a' будет переводить от нижнего регистра к верхнему.
Еще стоит обратить внимание, что массив a должен иметь тип unsigned char,
иначе такое преобразование сработает только для букв латинского алфавита.
HelicopterK52
634 / 177 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
28.07.2016, 11:42     Объявление функции с массивом #3
Цитата Сообщение от zss Посмотреть сообщение
параметр которой текстовый массив
параметр имеет тип char*.
Цитата Сообщение от zss Посмотреть сообщение
что массив a должен иметь тип unsigned char,
А если char уже unsigned?
Deelooc
0 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 19
28.07.2016, 11:49  [ТС]     Объявление функции с массивом #4
Спасибо за помощь)
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
28.07.2016, 11:50     Объявление функции с массивом #5
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
параметр имеет тип char*
вы не правы
HelicopterK52
634 / 177 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
28.07.2016, 12:11     Объявление функции с массивом #6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вы не правы
Да ладно? Пруф в студию, посмеемся вместе
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
28.07.2016, 12:41     Объявление функции с массивом #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
template< std::size_t N >                   
int F1( char(&arr)[N] )                     
{
    std::cout << " My type is char(&arr)[" << N << "]" << std::endl;
    return -2;
}
 
int main()
{
    char text[] = "Privet";
 
    F1( text );
}
Почему отлавливает char* ? Потому, что передается в таком случаи text[0]. Почему если оба варианта происходит ошибка компилятора в выборе нужной функции для вызова - тут ответ http://www.quizful.net/interview/cpp/4vmrpY9End8Y . При передачи массива в функцию принимать обычный указатель мы теряем данные об размере как минимум

P.S. HelicopterK52, хватит уже обижаться, пмс
HelicopterK52
634 / 177 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
28.07.2016, 12:51     Объявление функции с массивом #8
rikimaru2013, это Вы мне пруф привели или что? Вы меня удивляете.
у ТС:
Цитата Сообщение от Deelooc Посмотреть сообщение
C++
1
int F1(char[])
у Вас:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
C++
1
int F1( char(&arr)[N] )
Но даже в этом случае параметр имеет тип ссылки на массив, а не массив.
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
//g++  4.9.3
 
#include <iostream>
#include <iomanip>
#include <type_traits>
 
 
 
template< std::size_t N >                   
void F1( char(&arr)[N] )                     
{
    char arr2[1];
    std::cout << "F1" << std::endl;
    std::cout << std::boolalpha << "arr - array: " << std::is_array<decltype(arr)>::value << std::endl;
    std::cout << std::boolalpha << "arr - pointer: " << std::is_pointer<decltype(arr)>::value << std::endl;
    std::cout << std::boolalpha << "arr - reference: " << std::is_reference<decltype(arr)>::value << std::endl;
    
    std::cout << std::boolalpha << "arr2 - array: " << std::is_array<decltype(arr2)>::value << std::endl;
    std::cout << std::boolalpha << "arr2 - pointer: " << std::is_pointer<decltype(arr2)>::value << std::endl;
    std::cout << std::boolalpha << "arr2 - reference: " << std::is_reference<decltype(arr2)>::value << std::endl;
}
 
 
 
 
             
void F2( char arr[])                     
{
    std::cout << "F2" << std::endl;
    std::cout << std::boolalpha << "arr - array: " << std::is_array<decltype(arr)>::value << std::endl;
    std::cout << std::boolalpha << "arr - pointer: " << std::is_pointer<decltype(arr)>::value << std::endl;
    std::cout << std::boolalpha << "arr - reference: " << std::is_reference<decltype(arr)>::value << std::endl;
}
 
 
 
 
 
int main()
{
    char text[] = "Privet";
 
    F1( text );
    F2( text );
}
http://rextester.com/RBM5504
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
HelicopterK52, хватит уже обижаться
Как не обижаться, если Вы ерунду сморозили?
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
28.07.2016, 13:01     Объявление функции с массивом #9
rikimaru2013, хочу заступиться за HelicopterK52.
Сигнатурка функции, котору дал автор, выглядит так:
Цитата Сообщение от Deelooc Посмотреть сообщение
C++
1
int F1(char[])
При этом HelicopterK52 на это сказал, что char[] в данном случае на самом деле char*.
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
параметр имеет тип char*.
Так вот, он здесь абсолютно прав. Типы функций и типы массивов, будучи употребленными в декларации параметров функции преобразуются в указатель. Поэтому данные выражения истинны:
C++
1
2
std::is_same<void(int(double)), void(int(*)(double))>::value;
std::is_same<void(char[]), void(char *)>::value;
http://rextester.com/UQG62023
HelicopterK52
28.07.2016, 13:07
  #10

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
хочу заступиться за HelicopterK52
Я обзавелся мощной обороной и союзниками

DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
28.07.2016, 13:15     Объявление функции с массивом #11
С помощью данной особенности можно реализовать некоторые интересные проверки.
Пользуясь случаем, дам ссылку свою статью на затронутую тему (применительно к типам функций).
HelicopterK52
28.07.2016, 13:17
  #12

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Пользуясь случаем, дам ссылку свою статью
Читал когда-то, интересно

rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
28.07.2016, 14:06     Объявление функции с массивом #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому данные выражения истинны
а что за трюк с void ?
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
28.07.2016, 14:14     Объявление функции с массивом #14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а что за трюк с void ?
Это не трюк. Это возвращаемое значение функции.
Мы же говорим о типе параметра функции, и как этот тип в контексте параметра функции видоизменяется.
Поэтому я и сравниваю в is_same два типа функций, которые параметром принимают массив и указатель, функцию и указатель на функцию, и эти типы оказываются равны.
Ну можно написать по-другому (будет фактически тоже самое):
C++
1
2
3
4
5
6
7
8
9
10
11
void boo1(int()) {}
void boo2(int(*)()) {}
 
void foo1(char[]) {}
void foo2(char *) {}
 
int main()
{
    std::cout << std::is_same<decltype(boo1), decltype(boo2)>::value << '\n';
    std::cout << std::is_same<decltype(foo1), decltype(foo2)>::value;
}
http://rextester.com/MGYWI74809
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
28.07.2016, 14:26     Объявление функции с массивом #15
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не трюк
C++
1
void(int(*)(double))
А как тогда это читается? Метод возвращающий void и принимающий безимяный указатель на функцию, которая возвращает int и принимает double. Зачем так было писать - вот и спрашиваю
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
28.07.2016, 14:31     Объявление функции с массивом #16
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
void(int(*)(double))
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А как тогда это читается?
тип функции, которая ничего не возвращает.
и принимает указатель на функцию, которая принимает double,
и возвращает int.
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
28.07.2016, 14:41     Объявление функции с массивом #17
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Зачем так было писать - вот и спрашиваю
Как зачем, чтобы показать, что происходит. Мне кажется, ты не на том внимание акцентируешь

На первый вопрос см. ответ hoggy.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
28.07.2016, 14:53     Объявление функции с массивом #18
Цитата Сообщение от DrOffset Посмотреть сообщение
Мне кажется, ты не на том внимание акцентируешь
А не за чем было меня запутывать))))

Почему не (псевдокод):
C++
1
is_same( void(char[]), void(char*) );
зачем это было в примере
C++
1
std::is_same<void(int(double)), void(int(*)(double))>::value;
Запутали лишними строчками)
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
28.07.2016, 14:56     Объявление функции с массивом #19
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Почему
короче(!)
это такое сишное легаси.

суть в том, что char[] в аргументах функций и char* это одно и тоже.
первое выглядит как массив, но на самом деле это нефига не массив,
а самый обычный указатель.

сишка - язык раздолбаев.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2016, 15:02     Объявление функции с массивом
Еще ссылки по теме:

Объявление функции C++
Объявление функции в шаблоне C++
Правильное объявление функции C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
28.07.2016, 15:02     Объявление функции с массивом #20
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Запутали лишними строчками)
Там была такая строка, именно как ты написал:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
is_same( void(char[]), void(char*) );
Цитата Сообщение от DrOffset Посмотреть сообщение
std::is_same<void(char[]), void(char *)>::value;
А вторая строка для того, чтобы показать, что это применимо не только к массивам, но и к функциям. Но ты похоже порыва образовательного не оценил, и вместо этого обвиняешь в запутывании И не стыдно?
Yandex
Объявления
28.07.2016, 15:02     Объявление функции с массивом
Ответ Создать тему
Опции темы

Текущее время: 16:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru