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

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

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

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

30.10.2011, 16:43. Просмотров 374. Ответов 8
Метки нет (Все метки)

Добрый вечер, не могу что-то разобраться. В первом 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++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Константные указатели и указатели на константу - C++
Чем они, собственно говоря, отличаются? Поясните, пожалуйста. Не знаю, как так получилось, что в разных источниках - разные...

Указатели - C++
Есть задание,я сделала через массив,а мне нужно переделать через указатели. #include <iostream.h> #include <stdio.h> #include...

Указатели - C++
Почему такой вариант кода невозможен(конкретно: строка 6)?int indicator, x = 15, y = 10; int *ptr; cin >> indicator; ...

Указатели в c++ - C++
Задача: Дан текст, заканчивающийся точкой. Напечатать этот текст, удалив из него все цифры и знаки «+» или «–». Попробовала написать...

Указатели - C++
Что происходит в данном случае? for (unsigned int i = 0; i < n; i++) p_array.entry_pt = NULL; for (unsigned int...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
инженер-системотехник
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++
2299 / 1669 / 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++
Что это означает? while(*p), if(*p) это типа проверка есть ли у указателя значение? или что-то другое?

Указатели в Си - C++
Добрый вечер! Почему MinGW ругается при объявлении: char *str = {&quot;Hello&quot;, &quot; World!&quot;}; Объясните пожалуйста, как со строковыми...

Указатели - C++
4.Создать указатель на указатель и вывести на экран Адрес в ОП этого указателя Значение этого указателя - как ??? Сделал вот...

Указатели. - C++
Как написать эту программу через указатели??? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; int main() { int a; int b; ...


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

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

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