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

Указатели - C++

Восстановить пароль Регистрация
 
RRRONNN
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 24
30.10.2011, 16:43     Указатели #1
Добрый вечер, не могу что-то разобраться. В первом CASE определяется M, например
М="kards\\cherv\\" , вот, а во втором CASE мне нужно к существующему М прибавить еще, например "2.bmp" , чтобы получилось М="kards\\cherv\\2.bmp" как это реализовать???
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
char* M;
char function(int i,int j)
{
switch (i)
 {
 case 0: M="kards\\cherv\\"; break;
 case 1: M="kards\\byb\\";   break;
 case 2: M="kards\\krest\\"; break;
 case 3: M="kards\\pik\\";   break;
}
 
switch (j)
 {
 case 0: M="2.bmp"; break;
 case 1: M="3.bmp"; break;
 case 2: M="4.bmp"; break;
 case 3: M="5.bmp"; break;
 case 4: M="6.bmp"; break;
case 5: M="7.bmp"; break;
case 6: M="8.bmp"; break;
case 7: M="9.bmp"; break;
case 8: M="10.bmp"; break;
case 9: M="J.bmp"; break;
case 10: M="Q.bmp"; break;
case 11: M="K.bmp"; break;
case 12: M="A.bmp"; break;
 }
 
return M;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2011, 16:43     Указатели
Посмотрите здесь:

C++ Указатели
Указатели.... C++
C++ Указатели
Указатели C++
Указатели. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheToZudit
9 / 9 / 2
Регистрация: 22.10.2011
Сообщений: 19
30.10.2011, 17:38     Указатели #2
А если сделать вложенный switch?
Сыроежка
Заблокирован
30.10.2011, 17:43     Указатели #3
Цитата Сообщение от RRRONNN Посмотреть сообщение
Добрый вечер, не могу что-то разобраться. В первом CASE определяется M, например
М="kards\\cherv\\" , вот, а во втором CASE мне нужно к существующему М прибавить еще, например "2.bmp" , чтобы получилось М="kards\\cherv\\2.bmp" как это реализовать???
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
char* M;
char function(int i,int j)
{
switch (i)
 {
 case 0: M="kards\\cherv\\"; break;
 case 1: M="kards\\byb\\";   break;
 case 2: M="kards\\krest\\"; break;
 case 3: M="kards\\pik\\";   break;
}
 
switch (j)
 {
 case 0: M="2.bmp"; break;
 case 1: M="3.bmp"; break;
 case 2: M="4.bmp"; break;
 case 3: M="5.bmp"; break;
 case 4: M="6.bmp"; break;
case 5: M="7.bmp"; break;
case 6: M="8.bmp"; break;
case 7: M="9.bmp"; break;
case 8: M="10.bmp"; break;
case 9: M="J.bmp"; break;
case 10: M="Q.bmp"; break;
case 11: M="K.bmp"; break;
case 12: M="A.bmp"; break;
 }
 
return M;
}
Сначала нужно разобраться, что такое,например, "kards\\cherv\\", и что такое char* M;

"kards\\cherv\\", - это строковый литерал. Он имеет тип const char[], и стандарт языка С++ запрещает его изменять. Поэтому компилятор может поместить его в память только для чтения..

char* M - это указатель на тип chat, то есть, например, на 32-ьитовой платформе это просто ячейка памяти, равная по размеру типу int, которая хранит адрес какой-нибудь другой ячейки памяти.
Так как вы этого указателю хотите присвоить адрес строкового литерала, который имеет тип const char[],то лучше всего объявлять такой указатель как const char *M;, так как вы не можете менятьстрокорвый литерал.

Но у вас проблема в том,что вы хотите объединить двастроковых литерала. Поэтому вы должны использовать не указатель, а символьный массив, в который будете копировать строковые литералы в зависимости от переданной функции параметров.

Поэтому вам нужно объявлять не указатель M, а символьный массив достаточного размера, в который вы сможете скопировать заданные строковые литералы. Либо использовать стандартный шаблонный класс std::string.

Если вы используете символьные массивы, то нужно определить M как, например,

C++
1
char M[80] = {};
Есть специальная манифестная константа, которая задает максимальный размер пути. Поэтому вместо 80 в определении массива вы можете использовать эту константу. Не помню по памяти, как она называется, но что-то вроде MAX_PATH или MAX_FILENAME и обычно составляет 256 символов на платформе Windows.

Далее в своей функции вам нужно будет копировать в этот массив выбранные строковые литералы. Например,

C++
1
case 0: std::strcpy( M, "kards\\cherv\\" ); break;
Во втором switch предложении вы дописываете к первому строковому литералу второй строковый литерал в свой массив

case 0: std::strcat( M, "2.bmp" ); break;

Не забудьте включить для этих функций заголовок <cstring>
Haster
инженер-системотехник
 Аватар для Haster
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 17:52     Указатели #4
Используй во втором switch-е strcat- конкатенация строк
Invasion
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 20
30.10.2011, 17:59     Указатели #5
C
1
Char *M;
это только указатель и делать так
C
1
M="kards\\cherv\\";
нельзя!
тут если на ++ пишешь то можно просто написать
C++
1
String M;
только тогда во втором switch нужно писать
C++
1
M+="str";
Если на чистом СИ то нужно объявлять так:
C
1
Char M[100];
и юзать strcpy во всех switch или если уж так необходимо
C
1
Char *M;
то надо выделять память через malloc или calloс И всеравно юзать функции из string.h strcpy и тп.
Сыроежка
Заблокирован
30.10.2011, 18:06     Указатели #6
Цитата Сообщение от Invasion Посмотреть сообщение
C
1
Char *M;
это только указатель и делать так
C
1
M="kards\\cherv\\";
нельзя!
тут если на ++ пишешь то можно просто написать
C++
1
String M;
только тогда во втором switch нужно писать
C++
1
M+="str";
Если на чистом СИ то нужно объявлять так:
C
1
Char M[100];
и юзать strcpy во всех switch или если уж так необходимо
C
1
Char *M;
то надо выделять память через malloc или calloс И всеравно юзать функции из string.h strcpy и тп.
В С++ нет такого класса, как String. А есть шаблонный класс std::string
Jupiter
30.10.2011, 18:09
  #7

Не по теме:

Цитата Сообщение от Сыроежка Посмотреть сообщение
А есть шаблонный класс std::string
std::string специализация шаблона, а не шаблон

CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.10.2011, 18:40     Указатели #8
RRRONNN, самый тупой и простой вариант раз уж Вы пишете на плюсах:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
 
std::string GetCardIconPath(unsigned suite, unsigned value) {
  const char* directories[] = { "hearts", "diamonds", "roods", "spades" };
  const char* icons[] = { "2.ico", "3.ico", "4.ico", "5.ico", /* etc. */};
 
  const char* separator = "\\";
 
  return std::string("icons")
        .append(separator)
        .append(directories[suite])
        .append(separator)
        .append(icons[value]);
}
Цитата Сообщение от Сыроежка Посмотреть сообщение
Далее в своей функции вам нужно будет копировать в этот массив выбранные строковые литералы. Например,
C++
1
case 0: std::strcpy( M, "kards\\cherv\\" ); break;
Во втором switch предложении вы дописываете к первому строковому литералу второй строковый литерал в свой массив
Может все таки стоит заменить убогие switch теми же массивами?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 18:53     Указатели
Еще ссылки по теме:

Указатели C++
C++ Указатели
C++ Указатели

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

Или воспользуйтесь поиском по форуму:
RRRONNN
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 24
30.10.2011, 18:53  [ТС]     Указатели #9
Большое спасибо всем, особенно "Сыроежка", очень помог!
Yandex
Объявления
30.10.2011, 18:53     Указатели
Ответ Создать тему
Опции темы

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