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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
#1

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

08.01.2013, 00:13. Просмотров 3478. Ответов 16
Метки нет (Все метки)

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

Чем отличаются объявления const char* и const* char - C++
Прошу объяснить мне, чем отличаются объявления const char* и const* char и как объявить: указатель на константный массив символов, ...

Реализация функции char *padl(const char *string, int len, int c=' ') - C++
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо удалением лишних символов слева , либо...

Error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]" - C++
Вроде все правильно а все равно не работает. Подскажите в чем ошибка #include <iostream> template<typename T> inline const T...

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' - C++
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context Unit1.cpp(55): parsing: void _fastcall...

Cannot convert 'const wchar_t *' to 'const char *' - C++
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC hRes=FindResource(hMod,"acc.dll",RT_RCDATA); if(!hRes){ } HGLOBAL...

16
3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 00:35 #2
Цитата Сообщение от kebal Посмотреть сообщение
char *suit[4] = { }; //(и тут 4 string)
каким боком тут string?
PS проект с вашим кодом у меня компилируется
0
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 00:47  [ТС] #3
Цитата Сообщение от 3BEPb_TyTa Посмотреть сообщение
каким боком тут string?
PS проект с вашим кодом у меня компилируется
Имелось ввиду вот так
C++
1
const char *suit[4] = {"Черви", "Бубны", "Трефы", "Пики" };
0
3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 00:58 #4
покажите хотя бы где вы функцию вызываете, а лучше весь код
0
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 01:16  [ТС] #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 минут
О передаче массива вопрос решён, а вот изначальный вопрос - нет.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2013, 01:29 #6
char *suit[4] = {"Черви", "Бубны", "Трефы", "Пики" };
ну вот это вот не корректный код, хоть он и компилируется.
была где-то тема на этот счет.
если проще перезаписать, то:
C++
1
2
3
4
5
6
char* str = "dfdfdfdf";
str[0] = 'j';
// ахтунг. str указывает на константную память. где ее компилятор разместит - хз.
// это может как работать на одних компиляторах и не работать на других. или даже
// не работать при сборке одним и тем же компилятором но с разными флагами компиляции
// или линковки.
1
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 01:38  [ТС] #7
Если взять эту часть отдельно, то она отлично компилируется и всё в ней работает.
Это всего-лишь массив указателей, какие с этим могут быть проблемы?
И не могли бы вы точно написать, как с вашей точки зрения должна выглядеть строка, так как ваш пример не вполне понятен.

Добавлено через 3 минуты
Цитата Сообщение от DU Посмотреть сообщение
C++
1
2
3
4
char* str = "dfdfdfdf";
str[0] = 'j';
// ахтунг. str указывает на константную память. где ее компилятор разместит - хз.
// или линковки.
Это по той причине, что j это символ, а в моём случае речи о символе нет.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2013, 01:45 #8
http://msdn.microsoft.com/en-us/library/69ze775t(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]
и тогда вопроса из первого поста не было бы. вот.
1
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 01:58  [ТС] #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
0
3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 02:00 #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] = {"Туз", "Двока", "Тройка", "Четверка",
                      "Пятерка", "Шестерка", "Семерка",
                      "Восьмерка", "Девятка", "Десятка",
                      "Валет", "Дама", "Король" };
0
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 02:05  [ТС] #11
Да, внутри метода сами строки должны быть константными.
Но не внутри мейна. Как это реализовать?
0
3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 02:16 #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;
    }
}
пайдёт? -)
1
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
08.01.2013, 02:22  [ТС] #13
Пойдет, но мне в данном случае интересна реализация с помощью массива ссылок.
Если передавать массив вашим способом, массив ведь всё равно передаётся по ссылке? Программе не нужно создавать копию данных внутри метода?
0
3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
08.01.2013, 02:27 #14
да, массив в любом случае передаётся по ссылке.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2013, 02:39 #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
но если сделать кое-какие ошибки, то в выводе компилятора появляются сигнатуры с нужными нам именами типов.
2
08.01.2013, 02:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2013, 02:39
Привет! Вот еще темы с ответами:

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Работа со строками - Invalid conversion from 'char' to 'const char*' - C++
#include &lt;iostream&gt; #include &lt;ctype.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; using namespace std; void poisk(int n, char...

[Ошибка] invalid conversion from 'const char*' to 'char*' [-fpermissive] - C++
Решал задачи сам по себе, наткнулся на очень интересную. Вот сама задача: Вы оператор пуска ракет на ядерном подводном ...

Error: incompatible types in assignment of 'const char [5]' to 'char [10]' - C++
Код: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; const int m = 10; class name {


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

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

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