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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
#1

Передача char в функцию - C++

27.04.2014, 00:23. Просмотров 948. Ответов 13
Метки нет (Все метки)

Привет всем! Помогите, что неправильно: есть функция
C++
1
2
3
4
5
6
    void send_new_object(char *g, char *h, int j)
    {
        char name_nach_punkta = *g;
        char name_kon_punkta = *h;
        nomer_marshrouta = j;
    }
в которую посылается
C++
1
2
3
4
5
char add_name_nach_punkta[30];
    char add_name_kon_punkta[30];
    int add_nomer_marshrouta;
...
send_new_data(add_name_nach_punkta, add_name_kon_punkta, add_nomer_marshrouta);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2014, 00:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача char в функцию (C++):

Передача в функцию char*([Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]) - C++
Почему компилятор на это матерится? ObjA.Show("A"); deprecated conversion from string constant to 'char*' #include <iostream> ...

Передача в функцию char** - C++
Здравствуйте! Подскажите как передавать в функцию void переменную char**, а то ошибку пишет что нельзя так передавать Объявление самого...

Передача в функцию массива char - C++
Есть функция : char f1(const char *str); Мне нужно её вызвать . Делаю так: char s; s="abcd"; // ошибка: invalid...

Передача в функцию unsigned char [ ] - C++
Заполняю массив unsigned char sizeBuf; for (int i = 0; i < 4; i++){ sizeBuf =...

Передача FILE и char[x] в функцию - C++
Собственно есть такой кусок кода: int Parser(int n, int value) { FILE *fp = fopen("../../DB.txt", "r"); char buffer; ...

Передача массива типа char в функцию - C++
Не пойму в чем ошибка, выдает что ошибка в типе char. Объясните пожалуйста что не так. int min() { char ar =...

13
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,492
27.04.2014, 00:25 #2
lion_wine, вы пытаетесь присвоить одной переменной значение всего массива.Либо копируйте массив,либо работайте с указателями.
0
Avazart
Эксперт С++
7214 / 5386 / 286
Регистрация: 10.12.2010
Сообщений: 23,808
Записей в блоге: 17
27.04.2014, 00:26 #3
C++
1
2
3
4
5
6
void send_new_object(char *g, char *h, int j)
    {
        char name_nach_punkta = *g;
        char name_kon_punkta = *h;
        nomer_marshrouta = j;
    }
Смысл такой ф-ции?
1
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
27.04.2014, 00:37  [ТС] #4
а разве указатель уже не даст возможности обращаться к другим участкам памяти? а как передать весь массив?

Добавлено через 1 минуту
забыл дописать
C++
1
2
3
    char name_nach_punkta[30];
    char name_kon_punkta[30];
    int nomer_marshrouta;
0
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,492
27.04.2014, 00:55 #5
lion_wine, вы и передаете весь массив.Ошибка в другом.
0
DrOffset
7324 / 4424 / 1001
Регистрация: 30.01.2014
Сообщений: 7,260
27.04.2014, 01:02 #6
S_el, не совсем, он передает указатель, к которому был автоматически приведен массив.
lion_wine, тут надо добавить, что массивы нельзя передавать по значению. Потому что они не объекты первого класса (по историческим причинам). Поэтому обычно массивы копируют поэлементно; т.е. указатель + размер и копия (функции strcpy, strncpy, memcpy, std::copy и т.п.) в другой массив.
Чтобы передать массив целиком, как объект, можно использовать, например, std::array (С++11) или эквивалентный подход с собственным типом.
0
alsav22
5422 / 4817 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.04.2014, 01:03 #7
Цитата Сообщение от lion_wine Посмотреть сообщение
забыл дописать
Это где объявляется?
0
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,492
27.04.2014, 01:06 #8
Цитата Сообщение от DrOffset Посмотреть сообщение
S_el, не совсем, он передает указатель, к которому был автоматически приведен массив.
Фраза "передаете весь массив" намного более понятна,чем передача указателя.
0
DrOffset
7324 / 4424 / 1001
Регистрация: 30.01.2014
Сообщений: 7,260
27.04.2014, 01:17 #9
Цитата Сообщение от S_el Посмотреть сообщение
Фраза "передаете весь массив" намного более понятна,чем передача указателя.
Если ты знаешь что за ней стоит, то да. Но лично мне показалось, что у автора как раз вся проблема из-за того, что он думал, что может передать "весь массив" разом.
0
konstantin vl
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 59
27.04.2014, 02:59 #10
C++
1
2
3
4
5
6
7
8
void send_new_object(char *g, char *h, int j)
    {
         char name_nach_punkta[strlen(g) + 1];
        strcpy(name_nach_punkta, g);
        char name_kon_punkta[strlen(h) + 1];
        strcpy(name_kon_punkta, h);
        nomer_marshrouta = j;
    }
0
alsav22
5422 / 4817 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.04.2014, 11:38 #11
Цитата Сообщение от konstantin vl Посмотреть сообщение
C++
1
2
3
4
char name_nach_punkta[strlen(g) + 1];
...
char name_kon_punkta[strlen(h) + 1];
...
Смысл объявления локальных массивов?
0
konstantin vl
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 59
27.04.2014, 22:58 #12
Ты в аргументе передаешь целый массив, а указатель не указывает на целый массив он указывает только на первый элемент.
C++
1
2
char name_nach_punkta = *g;
        char name_kon_punkta = *h;  // здесь ты присваиваешь первый элемент.
0
Rioter
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 19
27.04.2014, 23:38 #13
Добавлено через 4 минуты
C++
1
2
3
4
5
6
    void send_new_object(char *g, char *h, int j)
    {
        char name_nach_punkta = *g;
        char name_kon_punkta = *h;
        nomer_marshrouta = j;
    }
Здесь вы пытаетесь присвоить char name_nach_punkta содержимое первого элемента из указателя g и так же с char name_kon_punkta = *h;

Добавлено через 5 минут
Как же объяснить.... Когда вы пишите название массива ( massive_name ), программа воспринимает его как адрес первого элемента массива в оперативной памяти, а когда рядом указываете номер элемента( massive_name[number_of_element] ) переходит относительно этого адреса на number_of_element шагов.

Добавлено через 3 минуты
следовательно, принимающая ф-ция должна записать в указатель адрес первого элемента массива и относительно этого указателя вызывать элементы(как я описал в своем примере кусков кода). Извините если где-то ошибся, но вроде все правильно.

Добавлено через 8 минут
Вот полный рабочий пример написал.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
void func(char * mass, int n){
    for(int i=0;i<n;i++){
        cout<<mass[i];
    }
}
 
int main(){
    char massive[64]="Example";
    func(massive,64);
    system("pause");
    return 0;
}
Добавлено через 2 минуты
А вот если надо передать один конкретный знак:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
using namespace std;
 
void func(char char1){
    cout<<char1;
}
 
int main(){
    char massive[64]="Example";
    func(massive[0]);
    system("pause");
    return 0;
}
0
konstantin vl
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 59
28.04.2014, 02:03 #14
alsav22, а вдруг его функция изменит исходное значение а он этого не хочет, можно конечно поставить const прочесть весь массив через указатель до \0 , но лучше все же сначала объяснить автору как это работает.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2014, 02:03
Привет! Вот еще темы с ответами:

Передача массива Char в функцию. Как быть? - C++
Столкнулся вот с такой проблемой, что #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;Windows.h&gt; #include &lt;conio.h&gt; using...

Передача char* из функции - C++
Здравствуйте! Функция считывает из Settings.ini данные. Из файла данные считываются правильно! Но далее, в main я не могу правильно...

Передача символьного массива char - C++
Привет всем. Подскажите пожалуйста. Есть функция в DLL. extern &quot;C&quot; __declspec(dllexport) void TestFan(char *bUUID,char *bName) { ...

Передача char массива в MessageBox - C++
Добрый день господа. Не могу решить проблему. Пытаюсь обработать сообщение WM_MOVE и передать координаты окна в MessageBox. Но не знаю как...


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
28.04.2014, 02:03
Ответ Создать тему
Опции темы

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