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

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

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

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

30.10.2011, 16:43. Просмотров 378. Ответов 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++):

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include <iostream> #include <stdlib.h> #include<iomanip> using namespace std; void min_max(int*pa, int*pb,...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Указатели на слонов или А зачем нужны указатели? - 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
инженер-системотехник
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++
2300 / 1670 / 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 теми же массивами?
RRRONNN
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 24
30.10.2011, 18:53  [ТС] #9
Большое спасибо всем, особенно "Сыроежка", очень помог!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 18:53
Привет! Вот еще темы с ответами:

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Указатели и массивы. Указатели и функции - C++
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию Compress() с использованием указателей, которая...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.10.2011, 18:53
Ответ Создать тему
Опции темы

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