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

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

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

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

07.02.2013, 21:45. Просмотров 574. Ответов 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. Как сделать не указатель, а ссылку на массив?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 21:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на массив символов (C++):

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

Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив. - C++
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++. Условие:Реализовать 3 функции, каждая из которых принимает указатель на...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

Динамический массив и указатель на указатель - C++
Спасибо за внимание) Задача такова: нужно удалить элемент по индексу, при этом уменьшить сам массив на 1 (т.е. удалили элемент - уменьшился...

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

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

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

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

но если вопрос стоит именно что вместо &mass писать, то const_cast<>() разве что спасёт
Вообще, это моветон и так делать нельзя, поэтому не советую, но const_cast изучал для таких вопросов. Как-то должно сработать.
1
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
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 761
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;
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
08.02.2013, 05:05 #8
Цитата Сообщение от abit Посмотреть сообщение
C++
1
void putX(int x, int y, char ** mass)
А зачем двойной указатель?
0
psdmaster
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 44
08.02.2013, 09:26  [ТС] #9
Цитата Сообщение от Croessmah Посмотреть сообщение
А зачем двойной указатель?
Первый потому что массив, второй чтобы значение сохранилось после выхода из функции.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 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;
}
0
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]= {' '};
Но присваивается только первому. Как сделать чтобы всем присваивалось?
0
08.02.2013, 18:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2013, 18:22
Привет! Вот еще темы с ответами:

Матрица и одномерный массив (Составить одномерный массив, содержащий количество буквенных символов в каждом из ее столбцов, подсчет символов) - C++
Помогите решить задачку: Дана матрица 5х7, элементами которой являются значения символьного типа. Составить одномерный массив, содержащий...

Написать функцию принимающую массив и возвращающую указатель на динамический массив - C++
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий первые n нaибольших чисел. Как сделать...

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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