Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 19
1

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

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

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

Добавлено через 25 минут
и вот ещё вопрос: a[i] += 'A' -'a'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2016, 10:01
Ответы с готовыми решениями:

Объявление функции внутри функции. Keil4
А можно ли в keil внутри функции объявлять новые? Например так? Раньше я так делал на PIC24, а...

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

Объявление функции
Смотрел видео урок и увидел странное для себя(!) объявление функции, оно имеет следующий вид:...

Объявление функции в C#
Помогите пожалуйста, в коде VBasic прописано: Private Function CropBitmap()(ByVal scrBitmap As...

20
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
28.07.2016, 11:19 2
1. Ответ в названии темы.
F1 - функция, возвращающая int, параметр которой текстовый массив

2. 'A' -'a' - это разница между кодом символов верхнего и нижнего регистра.
Однако, в кодовой таблице заглавные буквы расположены раньше, поэтому 'A' -'a' отрицательное.
Т.е. a[i] += 'A' -'a' будет переводить от нижнего регистра к верхнему.
Еще стоит обратить внимание, что массив a должен иметь тип unsigned char,
иначе такое преобразование сработает только для букв латинского алфавита.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
28.07.2016, 11:42 3
Цитата Сообщение от zss Посмотреть сообщение
параметр которой текстовый массив
параметр имеет тип char*.
Цитата Сообщение от zss Посмотреть сообщение
что массив a должен иметь тип unsigned char,
А если char уже unsigned?
0
0 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 19
28.07.2016, 11:49  [ТС] 4
Спасибо за помощь)
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.07.2016, 11:50 5
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
параметр имеет тип char*
вы не правы
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
28.07.2016, 12:11 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вы не правы
Да ладно? Пруф в студию, посмеемся вместе
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
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
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 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
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
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
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
28.07.2016, 13:15 11
С помощью данной особенности можно реализовать некоторые интересные проверки.
Пользуясь случаем, дам ссылку свою статью на затронутую тему (применительно к типам функций).
5
HelicopterK52
28.07.2016, 13:17
  #12

Не по теме:

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

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.07.2016, 14:06 13
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому данные выражения истинны
а что за трюк с void ?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
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
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.07.2016, 14:26 15
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не трюк
C++
1
void(int(*)(double))
А как тогда это читается? Метод возвращающий void и принимающий безимяный указатель на функцию, которая возвращает int и принимает double. Зачем так было писать - вот и спрашиваю
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.07.2016, 14:31 16
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
void(int(*)(double))
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А как тогда это читается?
тип функции, которая ничего не возвращает.
и принимает указатель на функцию, которая принимает double,
и возвращает int.
1
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
28.07.2016, 14:41 17
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Зачем так было писать - вот и спрашиваю
Как зачем, чтобы показать, что происходит. Мне кажется, ты не на том внимание акцентируешь

На первый вопрос см. ответ hoggy.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
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
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.07.2016, 14:56 19
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Почему
короче(!)
это такое сишное легаси.

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

сишка - язык раздолбаев.
2
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2016, 15:02
Помогаю со студенческими работами здесь

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

Объявление функции
Добрый день. Не очень понимаю, что происходит. Изначально на онклик кнопки написал кусок кода и...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru