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

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

Войти
Регистрация
Восстановить пароль
 
psdmaster
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 44
#1

Указатель на массив символов - C++

07.02.2013, 21:45. Просмотров 535. Ответов 10
Метки нет (Все метки)

фрагмент кода:
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
void putX(int x, int y, char** mass);
 
/////////////////////////////////////
// -------- Главная часть -------- //
/////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    char mass[9]= {' '};
    int x = 0, y = 0;
 
    do
    {
        key = _getch();
        if (key==0||key==224)
        {
            key=_getch();
            moveCursor(x, y, key);
        }
        else if (key == 32) {putX(x, y, &mass);}
    } while (key != 27);
 
    getchar();
    return 0;
}
/////////////////////////////////////
// ----- Конец главной части ----- //
/////////////////////////////////////
 
void putX(int x, int y, char** mass)
{
    if (*mass[y*3 + x] == ' ') {*mass[y*3 + x] = 'X';}
}
Выдает ошибку:
1>d:\c++\tictactoe\tictactoe\tictactoe.cpp(74): error C2664: 'putX' : cannot convert parameter 3 from 'char (*)[9]' to 'char **'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1. Что нужно исправить?
2. Как сделать не указатель, а ссылку на массив?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 21:45     Указатель на массив символов
Посмотрите здесь:

Указатель на двумерный массив символов - C++
Доброго времени суток. Особо не сталкивался со строками, но сейчас возникла необходимость, так же возникли и проблемы. Пытаюсь...

Удаление символов строки, используя указатель - C++
Здравствуйте, помогите, пожалуйста, дописать код. Заранее спасибо за помощь. Задание: 1. Ввести строку в символьный массив размером 60....

Что быстрее использовать, массив э-в, или указатель на массив э-в? - C++
уважаемые, что быстрее использовать, массив э-в, или указатель на массив э-в? или без разницы? С одной стороны обращается все к той же...

Определить класс «строка символов» с компонентными данными: длина строки, указатель на строку. Перегрузить оп - C++
Определить класс «строка символов» с компонентными данными: длина строки, указатель на строку. Перегрузить операции: << (вывод в виде...

Указатель на массив - C++
объясните пожалуйста что я тут делаю: char b; char* Buffer = &b; Buffer = "123"; и почему у меня после этого в char b...

Указатель на массив - C++
Скажите, почему этот код нельзя скомпилировать? double a; double *pa = &a; // !!!!! double *pa_2...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
07.02.2013, 22:02     Указатель на массив символов #2
Цитата Сообщение от psdmaster Посмотреть сообщение
putX(x, y, &mass);
Не надо так третий параметр передавать
psdmaster
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 44
07.02.2013, 22:56  [ТС]     Указатель на массив символов #3
Цитата Сообщение от go Посмотреть сообщение
Не надо так третий параметр передавать
А как надо?
NeonLost
Пес войны
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
08.02.2013, 00:08     Указатель на массив символов #4
Цитата Сообщение от psdmaster Посмотреть сообщение
А как надо?
&mass - получается, что ты адрес указатебя берешь...)
попробуй так mass
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 716
08.02.2013, 01:06     Указатель на массив символов #5
&mass - получается, что ты адрес указатебя берешь...)
попробуй так mass
фигню советуете

char mass[9] у тебя описывает константный указатель на строку
а ты пытаешься передать ее как неконстантую, т.е. допускаешь ее изменение.

но если вопрос стоит именно что вместо &mass писать, то const_cast<>() разве что спасёт
Вообще, это моветон и так делать нельзя, поэтому не советую, но const_cast изучал для таких вопросов. Как-то должно сработать.
psdmaster
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 44
08.02.2013, 01:40  [ТС]     Указатель на массив символов #6
Цитата Сообщение от abit Посмотреть сообщение
фигню советуете

char mass[9] у тебя описывает константный указатель на строку
а ты пытаешься передать ее как неконстантую, т.е. допускаешь ее изменение.

но если вопрос стоит именно что вместо &mass писать, то const_cast<>() разве что спасёт
Вообще, это моветон и так делать нельзя, поэтому не советую, но const_cast изучал для таких вопросов. Как-то должно сработать.
Тогда как массив описать как переменный?

Добавлено через 5 минут
Цитата Сообщение от NeonLost Посмотреть сообщение
&mass - получается, что ты адрес указатебя берешь...)
попробуй так mass
d:\c++\tictactoe\tictactoe\tictactoe.cpp(74): error C2664: 'putX' : cannot convert parameter 3 from 'char [9]' to 'char **'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 716
08.02.2013, 02:53     Указатель на массив символов #7
Цитата Сообщение от psdmaster Посмотреть сообщение
Тогда как массив описать как переменный?
я кстати всё это время думал над этой задачей...

оказалось всё сложнее, чем я сперва прикинул...

вот что у меня получилось

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
#include <iostream>
 
void putX(int x, int y, char ** mass)
{
    if ((*mass)[y*3 + x] == ' ') {(*mass)[y*3 + x] = 'X';}
}
 
int main()
{
        char *m = new char[9];
        m[0] = ' ';
 
        char mass[9] = {' '};
        int x = 0, y = 0;
 
        std::clog << "Mark -1" << std::endl;
 
        putX(x, y, &m);
 
 
        std::clog << "Mark 0" << std::endl;
 
        if (mass[y*3 + x] == ' ') {mass[y*3 + x] = 'X';}
        //putX(x, y, (char**) &mass);
 
 
        std::clog << "Mark 1" << std::endl;
 
        std::cout << mass[0];
        return 0;
}
Вот так все работает как ожидалось

но это ещё не конец ))) я ещё думаю

Добавлено через 1 час 1 минуту
всё... дошло)))
вот решение
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
#include <iostream>
#include <cstdio>
 
void putX(int x, int y, char ** mass)
{
        if ((*mass)[y*3 + x] == ' ') {(*mass)[y*3 + x] = 'X';}
}
 
int main()
{
        char mass[9] = {' '};
        int x = 0, y = 0;
        printf("%p  %p\n", mass, &mass);
 
        std::clog << "Mark 0" << std::endl;
 
        char *pm = (char *)mass;
        putX(x, y, & pm);
 
        std::clog << "Mark 1" << std::endl;
 
        std::cout << mass[0] << std::endl;
        return 0;
}
Croessmah
Модератор
Эксперт CЭксперт С++
13059 / 7322 / 817
Регистрация: 27.09.2012
Сообщений: 18,074
Записей в блоге: 3
Завершенные тесты: 1
08.02.2013, 05:05     Указатель на массив символов #8
Цитата Сообщение от abit Посмотреть сообщение
C++
1
void putX(int x, int y, char ** mass)
А зачем двойной указатель?
psdmaster
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 44
08.02.2013, 09:26  [ТС]     Указатель на массив символов #9
Цитата Сообщение от Croessmah Посмотреть сообщение
А зачем двойной указатель?
Первый потому что массив, второй чтобы значение сохранилось после выхода из функции.
Croessmah
Модератор
Эксперт CЭксперт С++
13059 / 7322 / 817
Регистрация: 27.09.2012
Сообщений: 18,074
Записей в блоге: 3
Завершенные тесты: 1
08.02.2013, 09:33     Указатель на массив символов #10
Цитата Сообщение от psdmaster Посмотреть сообщение
второй чтобы значение сохранилось после выхода из функции.
не вижу фактического изменения самого указателя =)

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
#include <iostream>
#include <cstdio>
 
void putX(int x, int y, char * mass)
{
        if (mass[y*3 + x] == ' ') {mass[y*3 + x] = 'X';}
}
 
int main()
{
        char mass[9] = {' '};
        int x = 0, y = 0;
        printf("%p  %p\n", mass, &mass);
 
        std::clog << "Mark 0" << std::endl;
 
        char *pm = (char *)mass;
        putX(x, y, pm);
 
        std::clog << "Mark 1" << std::endl;
 
        std::cout << mass[0] << std::endl;
        return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2013, 18:22     Указатель на массив символов
Еще ссылки по теме:

Указатель на массив - C++
Не могу разобраться в указателях. Допустим есть двумерный массив, выводятся поочереди 19 элементов. Если я в инструкции if поменяю...

указатель и массив - C++
подскажите плс эти две строки эквивалентны? char* str=&quot;bla bla bla&quot;; char str={&quot;bla bla bla&quot;}; Почему при выводе адреса 1...

указатель на массив - C++
Добрый день, объясните как верно будет. например определим массив char array = {&quot;qaqaqaqqa&quot;} к примеру есть функция void primer(...

Указатель на массив - C++
Здравствуйте , подскажите пожалуйста , есть функция , вопрос заключается в указателе мне нужно передать массив в функцию через указатель (...


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

Или воспользуйтесь поиском по форуму:
psdmaster
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 44
08.02.2013, 18:22  [ТС]     Указатель на массив символов #11
Цитата Сообщение от Croessmah Посмотреть сообщение
не вижу фактического изменения самого указателя =)

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
#include <iostream>
#include <cstdio>
 
void putX(int x, int y, char * mass)
{
        if (mass[y*3 + x] == ' ') {mass[y*3 + x] = 'X';}
}
 
int main()
{
        char mass[9] = {' '};
        int x = 0, y = 0;
        printf("%p  %p\n", mass, &mass);
 
        std::clog << "Mark 0" << std::endl;
 
        char *pm = (char *)mass;
        putX(x, y, pm);
 
        std::clog << "Mark 1" << std::endl;
 
        std::cout << mass[0] << std::endl;
        return 0;
}
А без введения указателя pm нельзя никак обойтись? Может вообще можно по другому изменить массив внутри функции?

И между делом. Ниже строчка должна по-моему всем элементам массива присваивать значение ' '.
C++
1
char mass[9]= {' '};
Но присваивается только первому. Как сделать чтобы всем присваивалось?
Yandex
Объявления
08.02.2013, 18:22     Указатель на массив символов
Ответ Создать тему
Опции темы

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