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

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

Войти
Регистрация
Восстановить пароль
 
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52
#1

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

19.11.2013, 18:39. Просмотров 542. Ответов 12
Метки нет (Все метки)

Всем добрый день!
Ситуация такая: есть класс, в нём есть поля типа 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() ? В обоих случаях редактируется успешно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 18:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на поле типа char [] (C++):

Сохранение/Загрузка указателя на указатель типа char - C++
char **data = new char*; Подскажите, пожалуйста, как записать содержимое всего выше написанного в файл в двоичном виде, а также,...

Как вывести адресс на который указывает указатель типа char*. - C++
Эта программа : #include &lt;iostream&gt; using namespace std; int main() { int a={1, 2, 3, 4}; int* g=a; cout&lt;&lt;g&lt;&lt;endl; ...

Аргумент типа char (*)[1000] несовместим с параметром типа char** - C++
Здравствуйте! Есть вот такая структура: #define max 1000 struct expr { char s; int index; };

Аргумент типа char** не совместим с параметром типа const char* - C++
Программа должна позволять заносить в структуру данные и выводить на экран информацию о поездах, следующих до определенной станции: ...

Добавление в массив типа char * одного элемента типа char - C++
Дан класс Строка, содержащий указатель на char - адрес динамически выделенной для размещения символов строки памяти и длину строки. Нужен...

Объяснить работу функции, возвращающей указатель на указатель на char - C++
Добрый день! Сможете объяснить что означает запись char **InputFile(int &amp;strings);? Почему именно двойное **? Буду очень благодарна...

12
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 19:10 #2
Зачем вы, вообще, вот это пишите: A:: ? Это нужно если поля или методы статические.

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

Цитата Сообщение от alsav22 Посмотреть сообщение
И зачем в process() что-то передавать?
Так я же написал, что определённые действия многократно повторяются и их лучше вынести в отдельную функцию (метод).
0
zss
Модератор
Эксперт С++
6401 / 5967 / 1944
Регистрация: 18.12.2011
Сообщений: 15,364
Завершенные тесты: 1
19.11.2013, 19:13 #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;      
}
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 19:15 #5
Задача в чём? Чтобы один метод с разными полями работал? Или что хотите?
0
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52
19.11.2013, 19:25  [ТС] #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Задача в чём? Чтобы один метод с разными полями работал? Или что хотите?
Да-да, именно так. Чтобы работал с char-массивами любого размера.

zss, не, это немного не то, мне нужно универсальное решение.
Примеры с записью 'q' надуманные, на самом деле там посложнее строки обрабатываются.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 19:36 #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;
}
0
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52
19.11.2013, 19:47  [ТС] #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Если так:
Не, тоже не то. В идеале лучше отталкиваться от моего варианта, но как-то научить метод работать не с конкретным char-массивом, а с любыми.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 19:51 #9
Цитата Сообщение от Paket236 Посмотреть сообщение
Не, тоже не то.
В чём не то? Ваш метод - это ваш метод. Предложенным способом задача решается?
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 20:03 #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), а это константа, зависимая от адресного пространства. При вызове можешь измерить размер этим способом? Ну или зафигач признак длины в сам массив. В некоторое количество элементов в начале массива, по фиксированному отрицательному смещению от нулевого элемента, в виде терминального символа...
0
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52
19.11.2013, 20:04  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
В чём не то?
Возможно я плохо описал задачу. Я свой код подстраиваю под другой, и необходимо в старом коде произвести минимум изменений. Тот вариант, что предложил я в первом посту - возможно, единственный, что мне подходит (его лишь нужно подправить, если это возможно).
Ваши варианты плохо стыкуются с тем, что мне надо.

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

array char* to char* (значения массива указателей в один указатель) - C++
Как сложить(или вывести в формате char*) все значения массива указателей(char *) воедино, то есть сложить строки и назначить результату...

"Аргумент типа char несовместим с параметром типа const char" - C++
Программа должна перевести все символы до * в число,но что то пошло не так. P.S прошу не ругать. #include &lt;stdio.h&gt; #include...

Ошибка "аргумент типа char несовместим с параметром типа char*" - C++
#include &lt;iostream&gt; using namespace std; const int N=4; //размер очереди struct Queue { int data; //массив данных char...

Преобразовать указатель одного типа в указатель другого. - C++
Всем привет. Мне нужно выполнить задание &quot;Преобразовать указатель одного типа в указатель другого. &quot; Что-то совсем не понимаю. Помогите...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
19.11.2013, 20:41
Ответ Создать тему
Опции темы

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