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

Указатель на поле типа char [] - C++

Восстановить пароль Регистрация
 
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 48
19.11.2013, 18:39     Указатель на поле типа char [] #1
Всем добрый день!
Ситуация такая: есть класс, в нём есть поля типа char [] и метод, работающий с этими полями. Метод должен многократно по определённому алгоритму изменять эти поля.
Что я решил сделать: создать ещё один метод (process() ), который будет вызываться из вышеупомянутого метода (method() ) для обработки этих полей (txt1, txt2 и т.д.). Он каким-то образом будет принимать поле, обрабатывать и сохранять обратно.

Общий вид кода примерно такой:
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
#include <iostream>
using namespace std;
 
class A
{
public:
    char txt1[40];
    char txt2[35];
    char txt3[18];
 
    void method();
    void process();
};
 
void A::method()
{   // ...
    process();
    // ...
}
 
void A::process()
{
}
 
int main()
{
    A obA;
    obA.method();
 
    cin.get();
    return 0;
}

Попытался сделать так:

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
#include <iostream>
using namespace std;
 
class A
{
public:
    char txt1[40];
    char txt2[35];
    char txt3[18];
 
    void method();
    void process(char (A::*txt1)[40]);
};
 
void A::method()
{   // ...
    process(&A::txt1);                  // передаём адрес поля txt1
    // ...
}
 
void A::process(char (A::*txt1_)[40])   // инициализируем указатель на поле txt1
{   // ...
    (this->*txt1_)[1] = 'q';            // редактируем поле txt1 для текущего объекта
}
 
int main()
{
    A obA;
    obA.method();
 
    cin.get();
    return 0;
}

Но возникла проблема: приходится указывать размер массива. Как сделать так, чтобы размер определялся автоматически?
И ещё вопрос. Покажу на примере (добавил метод process2() ):

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
#include <iostream>
using namespace std;
 
class A
{
public:
    char txt1[40];
    char txt2[35];
    char txt3[18];
 
    void method();
    void process(char (A::*txt1)[40]);
    void process2(char *txt_);
};
 
void A::method()
{   // ...
    process(&A::txt1);                  // передаём адрес поля txt1
    process2(txt1);                     // передаём адрес строки txt1
    // ...
}
 
void A::process(char (A::*txt1_)[40])   // инициализируем указатель на char на поле txt1
{   // ...
    (this->*txt1_)[1] = 'q';            // редактируем поле txt1 для текущего объекта
}
 
void A::process2(char *txt1_)           // инициализируем указатель на char
{   // ...
    txt1_[1] = 's';                     // редактируем строку по адресу txt1_ (не для объекта!)
}
 
int main()
{
    A obA;
    obA.method();
 
    cin.get();
    return 0;
}

В методе process2() редактируется строка, которая является полем (т.е. редактируется без использования объекта). Так нормально делать? Метод process2() опасней метода process() ? В обоих случаях редактируется успешно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 19:10     Указатель на поле типа char [] #2
Зачем вы, вообще, вот это пишите: A:: ? Это нужно если поля или методы статические.

Добавлено через 4 минуты
И зачем в process() что-то передавать? Он и так имеет доступ к полям класса.
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 48
19.11.2013, 19:13  [ТС]     Указатель на поле типа char [] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем вы, вообще, вот это пишите: A:: ?
Насколько я знаю, при создании указателей на поле используется именно такая синтаксическая конструкция.

Цитата Сообщение от alsav22 Посмотреть сообщение
И зачем в process() что-то передавать?
Так я же написал, что определённые действия многократно повторяются и их лучше вынести в отдельную функцию (метод).
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 1
19.11.2013, 19:13     Указатель на поле типа char [] #4
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
class A
{
private:
    char txt1[40];
    char txt2[35];
    char txt3[18];
    void process(char c);
    void process2(char c);
 
public:
    void method();
 };
 
void A::method()
{   // ...
    process('q');
    process2('s'); 
    // ...
}
 
void A::process(char c)  
{   // ...
    txt1[0] = c;
    txt1[1]=0;  // терминальный нуль для строки
}
 
void A::process2(char c) 
{   // ...
    txt2[0] = c;txt2[1]=0;      
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 19:15     Указатель на поле типа char [] #5
Задача в чём? Чтобы один метод с разными полями работал? Или что хотите?
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 48
19.11.2013, 19:25  [ТС]     Указатель на поле типа char [] #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Задача в чём? Чтобы один метод с разными полями работал? Или что хотите?
Да-да, именно так. Чтобы работал с char-массивами любого размера.

zss, не, это немного не то, мне нужно универсальное решение.
Примеры с записью 'q' надуманные, на самом деле там посложнее строки обрабатываются.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 19:36     Указатель на поле типа char [] #7
Если так:
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
#include <iostream>
using namespace std;
 
class A
{
public:
    char txt1[40];
    char txt2[35];
    char txt3[18];
 
    void method(char *txt)
    {
        txt[1] = 'q';
    }
    
};
 
int main()
{
    A obA;
    obA.method(obA.txt1);
    obA.method(obA.txt2);
    obA.method(obA.txt3);
 
    cin.get();
    return 0;
}
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 48
19.11.2013, 19:47  [ТС]     Указатель на поле типа char [] #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Если так:
Не, тоже не то. В идеале лучше отталкиваться от моего варианта, но как-то научить метод работать не с конкретным char-массивом, а с любыми.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 19:51     Указатель на поле типа char [] #9
Цитата Сообщение от Paket236 Посмотреть сообщение
Не, тоже не то.
В чём не то? Ваш метод - это ваш метод. Предложенным способом задача решается?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 20:03     Указатель на поле типа char [] #10
Цитата Сообщение от Paket236 Посмотреть сообщение
Ситуация такая: есть класс, в нём есть поля типа char [] и метод, работающий с этими полями. Метод должен многократно по определённому алгоритму изменять эти поля.
Что я решил сделать: создать ещё один метод (process() ), который будет вызываться из вышеупомянутого метода (method() ) для обработки этих полей (txt1, txt2 и т.д.). Он каким-то образом будет принимать поле, обрабатывать и сохранять обратно.
Всё это можно спокойно выбросить, а нужного в посте нет. Один туман, из которого не понятно даже накручивание второго метода вроде как на пустом месте. Какая задача решается?

Добавлено через 7 минут
Цитата Сообщение от Paket236 Посмотреть сообщение
Но возникла проблема: приходится указывать размер массива. Как сделать так, чтобы размер определялся автоматически?
Параметр не может быть массивом, а если его декларировать, как массив, то это означает указатель на нулевой элемент. Если бы речь шла об измерении количества элементов в обычной автоматической/статической/глобальной переменной, то
C++
1
2
char a[]=...;
size_t n=sizeof(a)/sizeof(a[0]);
и ни каких гвоздёв, а так размер параметра уже sizeof(size_t), а это константа, зависимая от адресного пространства. При вызове можешь измерить размер этим способом? Ну или зафигач признак длины в сам массив. В некоторое количество элементов в начале массива, по фиксированному отрицательному смещению от нулевого элемента, в виде терминального символа...
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 48
19.11.2013, 20:04  [ТС]     Указатель на поле типа char [] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
В чём не то?
Возможно я плохо описал задачу. Я свой код подстраиваю под другой, и необходимо в старом коде произвести минимум изменений. Тот вариант, что предложил я в первом посту - возможно, единственный, что мне подходит (его лишь нужно подправить, если это возможно).
Ваши варианты плохо стыкуются с тем, что мне надо.

Вот, кстати, собственный вариант с process2() мне подходит, но я боюсь, что так делать не следует.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 20:05     Указатель на поле типа char [] #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем вы, вообще, вот это пишите: A:: ? Это нужно если поля или методы статические.
При чём здесь вообще статик?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 20:41     Указатель на поле типа char []
Еще ссылки по теме:

Аргумент типа "unsigned char*" несовместим с параметром типа "const char*" C++
C++ Ошибка "аргумент типа char несовместим с параметром типа char*"
Сохранение/Загрузка указателя на указатель типа char C++

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

Или воспользуйтесь поиском по форуму:
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 48
19.11.2013, 20:41  [ТС]     Указатель на поле типа char [] #13
taras atavin
Спасибо за критику и объяснение. Попробую сам ещё поискать решение. А то уже не знаю, как объяснить, что я хочу
А не могли бы вы прокомментировать, нормально ли редактировать поля, не используя объект, как это показано в методе process2() ?
Yandex
Объявления
19.11.2013, 20:41     Указатель на поле типа char []
Ответ Создать тему
Опции темы

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