Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
#1

Приведение типов

13.05.2012, 10:23. Просмотров 1570. Ответов 19
Метки нет (Все метки)

В паскале можно привести типы:
Pascal
1
2
3
type
  ts = 0..9;
  chislo = array[1..nmax] of ts;
Как это сделать на С++?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2012, 10:23
Ответы с готовыми решениями:

Приведение типов
Как привести наследника ко второму родителю? class Parent1 { public: ...

Приведение типов.
Столкнулся с задачей считывания данных из символьного массива с дальнейшим...

Приведение типов
Уважаемые программеры, ПОМОГИТЕ!!! Нужно (мне) реализовать шаблонную функцию...

Приведение типов
в GUI ни int str = static_convert<int>(Edit1->Text) ни int str =...

Приведение типов
Всем привет) Есть массив int a = {2 ,4 ,5 ,6 ,256} Числа располагаются по...

19
zss
Модератор
Эксперт С++
7062 / 6606 / 4180
Регистрация: 18.12.2011
Сообщений: 17,410
Завершенные тесты: 1
13.05.2012, 11:33 #2
В С++ есть оператор typedef.
Однако именно для такого случая
(ограничение диапазона значений переменной)
простого решения в голову не приходит.
Можно сделать контейнерный класс,
в котором задать эти ограничения
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
#include <iostream>
using namespace std;
class ts
{
private:
unsigned short val;
public:
    ts():val(0){}
ts& operator=(ts& a){val=a.val;return *this;} 
ts& operator=(int a)
{
    if(a<0)a=0;
    else if(a>9)a=9;
    val=a;
    return *this;
}
friend ostream& operator<<(ostream& os,ts& a)
{
    os<<a.val;
    return os;
}
};
int main(int argc, char *argv[])
{
    const int nmax=2;
    ts chislo[nmax];
    chislo[0]=10;
    chislo[1]=chislo[0];
    cout<<chislo[0]<<" "<<chislo[1];
    system("pause");
}
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
13.05.2012, 11:54 #3
SeryZone, Вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
enum dig 
   {
      zero, one, two, three, four, five, six, seven, eight, nine
   };
  
dig digit;
 
int main()
{
    digit = one;
    std::cout << digit << std::endl;
}
http://liveworkspace.org/code/272844877ea42d398b5f69707c0ef999
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 12:02 #4
Приведение типов в с++ намного, намного более мощное и запутанное чем в паскале, однако множеств в языке нету(ибо не нужны).
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
13.05.2012, 14:14 #5
Цитата Сообщение от diagon Посмотреть сообщение
однако множеств в языке нету(ибо не нужны).
А как же std::set?
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:17 #6
Цитата Сообщение от go Посмотреть сообщение
А как же std::set?
Это просто класс, реализованный стандартными средствами. В паскале же множества прямо в язык встроены.
Да и вообще это разные вещи, множества в паскале нужны для упрощения записи, а set в с++ это отсортированный контейнер с уникальными значениями
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
13.05.2012, 14:23 #7
Цитата Сообщение от diagon Посмотреть сообщение
Это просто класс, реализованный стандартными средствами. В паскале же множества прямо в язык встроены.
Это стандартный класс. Чего вы от него хотите? string в паскале что это?

Цитата Сообщение от diagon Посмотреть сообщение
Да и вообще это разные вещи, множества в паскале нужны для упрощения записи, а set в с++ это отсортированный контейнер с уникальными значениями
Цитата Сообщение от SeryZone Посмотреть сообщение
ts = 0..9;
Цитата Сообщение от go Посмотреть сообщение
enum dig
{
zero, one, two, three, four, five, six, seven, eight, nine
};
Я считаю это почти одно и тоже
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:31 #8
Хотя нет, это не множества, а просто перечисляемый тип.

Цитата Сообщение от go Посмотреть сообщение
Я считаю это почти одно и тоже
Так что да, это почти одно и тоже.

А множества, это, к примеру, вот
Pascal
1
if 3 in [1..9] + [20..30]  //если 3 лежит в диапазоне [1..9] или в диапазоне [20..30]
0
zss
Модератор
Эксперт С++
7062 / 6606 / 4180
Регистрация: 18.12.2011
Сообщений: 17,410
Завершенные тесты: 1
13.05.2012, 14:33 #9
Цитата Сообщение от go Посмотреть сообщение
Я считаю это почти одно и тоже
Отнюдь,
digit=9;
написать нельзя.
Придется писать
digit=nine;
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
13.05.2012, 14:38 #10
Цитата Сообщение от diagon Посмотреть сообщение
А множества, это, к примеру, вот
Множество там и там одиново.
Pascal
1
set of char {например, так}
C++
1
std:;set<char>
Я не вижу разницы. Хотя функциональность явно в С++ повыше.

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
Отнюдь,
digit=9;
Но все Си это возможно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
enum dig 
   {
      zero, one, two, three, four, five, six, seven, eight, nine
   };
  
enum dig digit;
 
int main()
{
    digit = 9;
    printf("%d\n", digit); 
}
http://liveworkspace.org/code/2e8813c74cb4b0376954677e46b6b753
В плюсах вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
enum dig 
   {
      zero, one, two, three, four, five, six, seven, eight, nine
   };
  
dig digit;
 
int main()
{
    digit = static_cast<dig> (9);
    std::cout << digit << std::endl;
}
http://liveworkspace.org/code/ee6c5bf7c6d554fd561fbf428b0191cc
Просто привели тип.
1
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:39 #11
Цитата Сообщение от zss Посмотреть сообщение
Отнюдь,
digit=9;
написать нельзя.
Придется писать
digit=nine;
Неправда, можно писать digit = 9
Хотя стоп, вроде нельзя. А вроде и можно было >_<''
Если явно привести тип, то точно можно.
Ну да, можно явно сравнивать с числами, а вот присваивать нельзя.

Цитата Сообщение от go Посмотреть сообщение
Я не вижу разницы. Хотя функциональность явно в С++ повыше.
Однако в с++ нельзя так удобно оперировать с множествами, как в паскале(задавать с помощью [a..b], пересекать с помощью оператора сложения и т.д.). Аналог того условия, что я привел выше, на с++ будет занимать ~10 строк.
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
13.05.2012, 14:43 #12
Цитата Сообщение от diagon Посмотреть сообщение
Если явно привести тип, то точно можно.
В С++ только так все и делается. Ведь 9 это целое число. http://liveworkspace.org/code/ee6c5bf7c6d554fd561fbf428b0191cc

Цитата Сообщение от diagon Посмотреть сообщение
Однако в с++ нельзя так удобно оперировать с множествами, как в паскале(задавать с помощью [a..b], пересекать с помощью оператора сложения и т.д.).
Ну как это нельзя??? Чуть-чуть извернутся, то и получится.
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:52 #13
Цитата Сообщение от go Посмотреть сообщение
Ну как это нельзя??? Чуть-чуть извернутся, то и получится
Чуть-чуть? :)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    std::set< int > first; //[0..9]
    for (int i = 0; i <= 9; ++i)
        first.insert(i);
        
    std::set< int > second; //[20..30]
    for (int i = 20; i <= 30; ++i)
        second.insert(i);
        
    std::set< int > third; //[0..9] + [20..30]
    std::set_union
    (
        first.begin(), first.end(),
        second.begin(), second.end(),
        std::inserter< std::set< int > > (third, third.begin() )
    );
    
    int x = 3;
    
    if ( third.find(x) != third.end() ) //...
0
SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
07.07.2012, 21:42  [ТС] #14
Ладно, например я хочу получить не __int64 (до 264-1), а до 2128-1; Умельцы на хабе делали так, но как это сделать вообще?
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.07.2012, 22:06 #15
SeryZone, именно int - через длинку. Можно float/double, но вычисления будут происходить дольше.
0
SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
08.07.2012, 14:27  [ТС] #16
soon, напиши проще, я в С++ вообще очень мало понимаю.
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 17:01 #17
SeryZone, если нужен целочисленный тип, то через длинную арифметику. В противном случае можно воспользоваться вещественными типами данных, но вычисления будут происходить дольше.
0
SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
08.07.2012, 18:59  [ТС] #18
Блин... Я пробовал длиннную арифметику, но здесь её просто нет: http://habrahabr.ru/post/121950/
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 19:36 #19
Цитата Сообщение от SeryZone Посмотреть сообщение
Я пробовал длиннную арифметику, но здесь её просто нет: http://habrahabr.ru/post/121950/
Тут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    typedef unsigned char   u8;
    typedef unsigned short u16;
    typedef unsigned int   u32;
 
    u16 a = 1000;
    u16 b = 2000;
    u32 r = 0;
 
    u8  * a_ptr = (u8*)&a;
    u8  * b_ptr = (u8*)&b;
    u16 * r_ptr = (u16*)(void*)&r;
 
    Karatsuba_multiply(a_ptr, b_ptr, r_ptr);
 
    cout << r;
}
фактически создается переменная типа u32, а в функцию передается указатель на эту переменную, но с типом u16. Остальные также урезаны вдвое. Каким макаром вы собрались делать 128 битную целочисленную переменную - непонятно.
0
SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
08.07.2012, 19:43  [ТС] #20
А, понятно...
0
08.07.2012, 19:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2012, 19:43

Приведение типов.
Доброго времени суток! В общем, есть класс Matrix(прямоугольные над полем...

Приведение типов
Добрый вечер! Реализовываю явное и не явное приведение типов. Есть два...

Приведение типов
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int...


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

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

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