Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Deelooc
0 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 19
1

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

28.07.2016, 10:01. Просмотров 809. Ответов 20
Метки нет (Все метки)

Сейчас задам очень странный вопрос)
Что это значит: int F1(char[]) не могу понять)) спасибо!

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

объявление функции
допустим у меня есть программа она использует из библиотеке conio.h функцию...

Объявление функции
Всем доброго времени суток! Подскажите пожалуйста, как правильно объявить...

Объявление функции
Завдання 1 Створити функцію яка приймає на вхід посилання на карту з ключем...

Объявление функции
Что значит подобное объявление: int f() const; Для чего этот "const" ?

Объявление и определение функции
В учебнике такой код: void somefunction(int); int main() { //неважно...

20
zss
Модератор
Эксперт С++
7179 / 6678 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 1
28.07.2016, 11:19 2
1. Ответ в названии темы.
F1 - функция, возвращающая int, параметр которой текстовый массив

2. 'A' -'a' - это разница между кодом символов верхнего и нижнего регистра.
Однако, в кодовой таблице заглавные буквы расположены раньше, поэтому 'A' -'a' отрицательное.
Т.е. a[i] += 'A' -'a' будет переводить от нижнего регистра к верхнему.
Еще стоит обратить внимание, что массив a должен иметь тип unsigned char,
иначе такое преобразование сработает только для букв латинского алфавита.
0
HelicopterK52
783 / 213 / 32
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
28.07.2016, 11:42 3
Цитата Сообщение от zss Посмотреть сообщение
параметр которой текстовый массив
параметр имеет тип char*.
Цитата Сообщение от zss Посмотреть сообщение
что массив a должен иметь тип unsigned char,
А если char уже unsigned?
0
Deelooc
0 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 19
28.07.2016, 11:49  [ТС] 4
Спасибо за помощь)
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
28.07.2016, 11:50 5
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
параметр имеет тип char*
вы не правы
0
HelicopterK52
783 / 213 / 32
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
28.07.2016, 12:11 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вы не правы
Да ладно? Пруф в студию, посмеемся вместе
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
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, хватит уже обижаться, пмс
0
HelicopterK52
783 / 213 / 32
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 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, хватит уже обижаться
Как не обижаться, если Вы ерунду сморозили?
0
DrOffset
8137 / 4719 / 1153
Регистрация: 30.01.2014
Сообщений: 7,690
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
1
HelicopterK52
28.07.2016, 13:07
  #10

Не по теме:

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

0
DrOffset
8137 / 4719 / 1153
Регистрация: 30.01.2014
Сообщений: 7,690
28.07.2016, 13:15 11
С помощью данной особенности можно реализовать некоторые интересные проверки.
Пользуясь случаем, дам ссылку свою статью на затронутую тему (применительно к типам функций).
5
HelicopterK52
28.07.2016, 13:17
  #12

Не по теме:

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

0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
28.07.2016, 14:06 13
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому данные выражения истинны
а что за трюк с void ?
0
DrOffset
8137 / 4719 / 1153
Регистрация: 30.01.2014
Сообщений: 7,690
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
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
28.07.2016, 14:26 15
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не трюк
C++
1
void(int(*)(double))
А как тогда это читается? Метод возвращающий void и принимающий безимяный указатель на функцию, которая возвращает int и принимает double. Зачем так было писать - вот и спрашиваю
0
hoggy
Нарушитель
Эксперт С++
7084 / 3128 / 647
Регистрация: 15.11.2014
Сообщений: 7,183
Завершенные тесты: 1
28.07.2016, 14:31 16
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
void(int(*)(double))
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А как тогда это читается?
тип функции, которая ничего не возвращает.
и принимает указатель на функцию, которая принимает double,
и возвращает int.
1
DrOffset
8137 / 4719 / 1153
Регистрация: 30.01.2014
Сообщений: 7,690
28.07.2016, 14:41 17
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Зачем так было писать - вот и спрашиваю
Как зачем, чтобы показать, что происходит. Мне кажется, ты не на том внимание акцентируешь

На первый вопрос см. ответ hoggy.
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
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;
Запутали лишними строчками)
0
hoggy
Нарушитель
Эксперт С++
7084 / 3128 / 647
Регистрация: 15.11.2014
Сообщений: 7,183
Завершенные тесты: 1
28.07.2016, 14:56 19
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Почему
короче(!)
это такое сишное легаси.

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

сишка - язык раздолбаев.
2
DrOffset
8137 / 4719 / 1153
Регистрация: 30.01.2014
Сообщений: 7,690
28.07.2016, 15:02 20
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Запутали лишними строчками)
Там была такая строка, именно как ты написал:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
is_same( void(char[]), void(char*) );
Цитата Сообщение от DrOffset Посмотреть сообщение
std::is_same<void(char[]), void(char *)>::value;
А вторая строка для того, чтобы показать, что это применимо не только к массивам, но и к функциям. Но ты похоже порыва образовательного не оценил, и вместо этого обвиняешь в запутывании И не стыдно?
1
28.07.2016, 15:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2016, 15:02

Множественное объявление функции
Здравствуйте! Есть проблема, IDE(Eclipse) сообщает о множественном объявлении...

Объявление функции в шаблоне
Здравствуйте. Как правильно объявить в шаблонном классе оператор / функцию:...

Правильное объявление функции
Честно перекопировал курсач. Возникла такая ошибка: Unit1.cpp(507): E2316...


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

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

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