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

const char *[] в функции - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 00:13     const char *[] в функции #1
Прототип функции такой
C++
1
void deal(const int [][13], const char *[], const char *[]);
А вот сама функция
C++
1
2
3
void deal(const int wDeck[][13], const char *wFace [], const char *wSuit []) {
 
}
Пишет, что невозможно преобразовать параметр 2 из "char *[13]" в "const char *[]".
В мейне я объявлял
C++
1
char *suit[4] = { }; //(и тут 4 string)
А если быть более точным, то есть похожая тема, но там решение такое, что в мейне также объявляется тип const char *, но если мне нужно,
чтобы данный массив указателей был неизменяем только в вызываемой функции deal?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 00:35     const char *[] в функции #2
Цитата Сообщение от kebal Посмотреть сообщение
char *suit[4] = { }; //(и тут 4 string)
каким боком тут string?
PS проект с вашим кодом у меня компилируется
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 00:47  [ТС]     const char *[] в функции #3
Цитата Сообщение от 3BEPb_TyTa Посмотреть сообщение
каким боком тут string?
PS проект с вашим кодом у меня компилируется
Имелось ввиду вот так
C++
1
const char *suit[4] = {"Черви", "Бубны", "Трефы", "Пики" };
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 00:58     const char *[] в функции #4
покажите хотя бы где вы функцию вызываете, а лучше весь код
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 01:16  [ТС]     const char *[] в функции #5
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
41
42
43
44
45
46
47
48
49
50
51
void shuffle(int [][13]);
void deal(const int [][13], const char *[], const char *[]);
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Russian");
 
    char *suit[4] = {"Черви", "Бубны", "Трефы", "Пики" };
    char *face[13] = {"Туз", "Двока", "Тройка", "Четверка",
                      "Пятерка", "Шестерка", "Семерка",
                      "Восьмерка", "Девятка", "Десятка",
                      "Валет", "Дама", "Король" };
    int deck [4][13] = { 0 };
 
    int player1 [2][5] = { 0 };
    int player2 [2][5] = { 0 };
 
    srand(time(NULL));
 
    shuffle(deck);
    deal(deck, face, suit);
 
 
    system("pause");
    return 0;
}
 
void shuffle(int wDeck [][13]) {
    int row, column;
    for (int card = 1; card <= 52; card++) {
        while (wDeck[row][column] != 0) {
            row = rand() % 4;
            column = rand() % 13;
        }
 
        wDeck[row][column] = card;
    }
}
 
void deal(const int wDeck[][13], const char *wFace[], const char *wSuit[]) {
    for (int card = 1; card <= 5; card++)
 
        for (int row = 0; row <= 3; row++)
 
            for (int column = 0; column <= 12; column++)
                if (wDeck[row] [column] == card)
                    cout << setw(9) << setiosflags(ios::right)
                         << wFace[column] << " масти "
                         << setw(5) << setiosflags(ios::left)
                         << wSuit[row] << endl;
}
Также сразу хотелось бы задать вопрос.
Как в эту же функцию мне передать массив player1 при условии, что внутри функции мне его нужно будет изменять.

Добавлено через 9 минут
О передаче массива вопрос решён, а вот изначальный вопрос - нет.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2013, 01:29     const char *[] в функции #6
char *suit[4] = {"Черви", "Бубны", "Трефы", "Пики" };
ну вот это вот не корректный код, хоть он и компилируется.
была где-то тема на этот счет.
если проще перезаписать, то:
C++
1
2
3
4
5
6
char* str = "dfdfdfdf";
str[0] = 'j';
// ахтунг. str указывает на константную память. где ее компилятор разместит - хз.
// это может как работать на одних компиляторах и не работать на других. или даже
// не работать при сборке одним и тем же компилятором но с разными флагами компиляции
// или линковки.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 01:38  [ТС]     const char *[] в функции #7
Если взять эту часть отдельно, то она отлично компилируется и всё в ней работает.
Это всего-лишь массив указателей, какие с этим могут быть проблемы?
И не могли бы вы точно написать, как с вашей точки зрения должна выглядеть строка, так как ваш пример не вполне понятен.

Добавлено через 3 минуты
Цитата Сообщение от DU Посмотреть сообщение
C++
1
2
3
4
char* str = "dfdfdfdf";
str[0] = 'j';
// ахтунг. str указывает на константную память. где ее компилятор разместит - хз.
// или линковки.
Это по той причине, что j это символ, а в моём случае речи о символе нет.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2013, 01:45     const char *[] в функции #8
http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
The result of modifying a string constant is undefined. For example:
C++
1
2
char *szStr = "1234";
szStr[2] = 'A';      // Results undefined
C++
1
 char *suit[4] = {"Черви", "Бубны", "Трефы", "Пики" };
вот это вот массив чего по вашему? массив массивов символом или массив указателей на строки, которые константные, но тип элемента массива - неконстантный указатель на строку?

и хотя такой массив вроде бы у вас нигде не изменяются, вы так же писали:
но если мне нужно,
чтобы данный массив указателей был неизменяем только в вызываемой функции deal
Добавлено через 6 минут
такие массивы вообще нигде не стоит изменять. поведение неопределено. поэтому изначально нужно было делать
const char *suit[4]
и тогда вопроса из первого поста не было бы. вот.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 01:58  [ТС]     const char *[] в функции #9
Вы говорите о том, что нельзя заменить какой-то один элемент внутри массива символов. Но я этим и не занимаюсь.
Объявляя
C++
1
char *suit[4] = {"Черви", "Бубны", "Трефы", "Пики" };
Я никаким образом ничего не изменяю в каком-либо массиве символов, значит проблема явно не в объявлении.

Добавлено через 1 минуту
Цитата Сообщение от DU Посмотреть сообщение
такие массивы вообще нигде не стоит изменять. поведение неопределено. поэтому изначально нужно было делать
const char *suit[4]
и тогда вопроса из первого поста не было бы. вот.
Поведение неопределено если я изменяю объект по ссылке, а если я захочу изменять саму ссылку? Тогда мне нельзя объявлять тип const char.
А вот внутри метода я как-раз хочу сделать его const, но не получается.
Или const будет относиться к char, а не к *suit[4] ?

Добавлено через 9 минут
Результат неопределен, но если сделать так
cout << *suit[0]; //Выводит первый символ слова Черви
suit[0] = "LOL";
cout << *suit[0]; //Выводит первый символ слова LOL
И в данном случае я не хочу объявлять тип const char
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 02:00     const char *[] в функции #10
что именно внутри метода вы хотите сделать константным? сами строки?
как вариант можно сделать размер строк массива константыми
C++
1
void deal(const int wDeck[][13], const char wFace[4][100], const char wSuit[13][100])
C++
1
2
3
4
5
char suit[4][100] = {"Черви", "Бубны", "Трефы", "Пики" };
    char face[13][100] = {"Туз", "Двока", "Тройка", "Четверка",
                      "Пятерка", "Шестерка", "Семерка",
                      "Восьмерка", "Девятка", "Десятка",
                      "Валет", "Дама", "Король" };
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 02:05  [ТС]     const char *[] в функции #11
Да, внутри метода сами строки должны быть константными.
Но не внутри мейна. Как это реализовать?
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 02:16     const char *[] в функции #12
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
41
42
43
44
45
46
47
void shuffle(int [][13]);
void deal(const int wDeck[][13], const char wFace[13][100], const char wSuit[4][100]);
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL,"Russian");
 
    char suit[4][100] = {"Черви", "Бубны", "Трефы", "Пики" };
    char face[13][100] = {"Туз", "Двока", "Тройка", "Четверка",
                      "Пятерка", "Шестерка", "Семерка",
                      "Восьмерка", "Девятка", "Десятка",
                      "Валет", "Дама", "Король" };
    int deck [4][13] = { 0 };
 
    int player1 [2][5] = { 0 };
    int player2 [2][5] = { 0 };
 
    srand(time(NULL));
 
    shuffle(deck);
    deal(deck, face, suit);
    system("pause");
    return 0;
}
 
void deal(const int wDeck[][13], const char wFace[4][100], const char wSuit[13][100]) {
    for (int card = 1; card <= 5; card++)
        for (int row = 0; row <= 3; row++)
            for (int column = 0; column <= 12; column++)
                if (wDeck[row] [column] == card)
                    cout << setw(9) << setiosflags(ios::right)
                         << wFace[column] << " масти "
                         << setw(5) << setiosflags(ios::left)
                         << wSuit[row] << endl;*/
}
 
void shuffle(int wDeck [][13]) {
    int row, column;
    for (int card = 1; card <= 52; card++) {
        while (wDeck[row][column] != 0) {
            row = rand() % 4;
            column = rand() % 13;
        }
 
        wDeck[row][column] = card;
    }
}
пайдёт? -)
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 02:22  [ТС]     const char *[] в функции #13
Пойдет, но мне в данном случае интересна реализация с помощью массива ссылок.
Если передавать массив вашим способом, массив ведь всё равно передаётся по ссылке? Программе не нужно создавать копию данных внутри метода?
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 02:27     const char *[] в функции #14
да, массив в любом случае передаётся по ссылке.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2013, 02:39     const char *[] в функции #15
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//вот поиграйте с таким кодом. после идут пояснения.
 
#include <iostream>
#include <typeinfo>
 
typedef const char* CCharPtr;
 
void foo1(const char** arr)
{
    std::cout << "1 " << typeid(arr).name() << std::endl;
}
 
void foo2(const char* arr[])
{
    std::cout << "2 " << typeid(arr).name() << std::endl;
}
 
void foo3(CCharPtr* arr)
{
    std::cout << "3 " << typeid(arr).name() << std::endl;
}
 
void foo4(const CCharPtr* arr)
{
    std::cout << "4 " << typeid(arr).name() << std::endl;
}
 
void modify1(CCharPtr* arr, int index)
{
    arr[index] = 0;
}
 
void modify2(const CCharPtr* arr, int index)
{
    //arr[index] = 0;
}
 
 
int main()
{
    const char* arr[5] = {"aa", "adf", "dfdf", "adfdf", "sdfd"};
    
    foo1(arr);
    foo2(arr);
    foo3(arr);
    foo4(arr);
 
    modify1(arr, 0);
    std::cout << (void*)arr[0] << std::endl;
 
    modify2(arr, 0);
 
    return 0;
}
 
// void foo1(const char** arr);
// void foo2(const char* arr[]);
// это функции с одинаковыми сигнатурами. если их имена сделать одинаковыми,
// то компилятор начнет ругатся на то, что функция определена более одного раза. 
// мне привычнее иметь дело с const char** arr, а не с const char* arr[].
// далее нужно определить что такое const char**.
// смотрим на функцию вывод функции foo3. совпадает с foo1 и foo2.
// значит const char** - это указатель1 на указатель2, где указатель 2 указывает на константу.
// это значит, что указатель2 изменить можно. например сначало он указывал на строку "aa", но в
// в функции его поменяли так, что он теперь указывает в ноль, чего мы пытаемся измежать
// (см. вызов функции modify1 и что выводится после). теперь, если мы раскомментируем код в
// modify2, то получим ошибку о том, что у нас попытка изменить что-то константное. т.е. то, что
// нам нужно. итого правильный тип аргумента: const CCharPtr* arr, который совпадает с аргументом 
// void foo4(const CCharPtr* arr), которая в свою очередь выводит
// char const* const * что эквивалентно const char* const *.
// ИТОГО: нужно использовать одно из двух:
// char const* const *
// const char* const *
ну и в заключение:
такие массивы - это сишная жопа. если нет требований именно си, то лучше использовать с++. это std::vector, std::array или что-нибудь самодельное

и еще. не все компиляторы выдают человеческие имена типов. вот тут например:
http://liveworkspace.org/code/2yfRfI$7
но если сделать кое-какие ошибки, то в выводе компилятора появляются сигнатуры с нужными нам именами типов.
Croessmah
08.01.2013, 08:22
  #16

Не по теме:

Цитата Сообщение от kebal Посмотреть сообщение
с помощью массива ссылок
Вы уверены?
Цитата Сообщение от standart
There shall be no references to references, no arrays of references, and no pointers to references.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2013, 16:32     const char *[] в функции
Еще ссылки по теме:

C++ Invalid conversion from 'char' to 'const char*'
невозможно преобразовать параметр 1 из 'char' в 'const char *' C++
C++ Чем отличаются объявления const char* и const* char

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

Или воспользуйтесь поиском по форуму:
Spamik
Сообщений: n/a
24.03.2013, 16:32     const char *[] в функции #17
Как вариант, можно объявить двумерные массивы suit и face(не обязательно как const), как предложил товарищ 3BEPb_TyTa, а вот в самой функции ссылаться на них с помощью указателей на двумерные массивы.
К примеру вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Это прототип функции:
void deal(const int [][13],const char (*)[100],const char (*)[100])
 
//Сама функция
void deal(const int wDeck[][13],const char (*wFace)[100],const char (*wSuit)[100])
{
    for (int card=1; card<=52; card++)
        for (int row=0; row<=3; row++)
            for (int column=0; column<=12;column++)
                if (wDeck[row][column]==card)
                    cout << setw(9) << setiosflags(ios::right) << wFace[column] << " масти " 
                    << setw(5) << setiosflags(ios::left)
                    << wSuit[row] << endl;
}
Таким образом ваша цель вроде как будет достигнута
Yandex
Объявления
24.03.2013, 16:32     const char *[] в функции
Ответ Создать тему
Опции темы

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