Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Dmitry99
1 / 1 / 0
Регистрация: 11.11.2011
Сообщений: 9
#1

Приведение типов - C++

11.11.2011, 22:18. Просмотров 1442. Ответов 13
Метки нет (Все метки)

Делаю программу, которая кроме всего прочего должна отсортировать массив. Использую для этого qsort.

Вот что получилось:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    struct Storage
    {
        int count;      // Кол-во занятых строк
        int allocated;  // Кол-во строк, для которых выделена память
        char** pchar;   // Массив указателей на строки
    };
 
 
void main() {
    Storage* myStorage; 
    //пропущено
    qsort(myStorage->pchar,size,sizeof(int),CompareIA)
    //пропущено
}
 
int CompareIA(const void *firstParametr, const void *secondParametr) {
  return (atoi(*(char **)secondParametr) - atoi(*(char **)firstParametr));
 
}
Препод отругал за то, что у меня используется привидение типов в стиле си,
Я пытаюсь привести тип вот так, но ничего не выходит
C++
1
  return (atoi(*(reinterpret_cast<const char*>(secondParametr))) - atoi(*(reinterpret_cast<const char*>(secondParametr))));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2011, 22:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Приведение типов (C++):

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

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

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

Приведение типов
в GUI ни int str = static_convert&lt;int&gt;(Edit1-&gt;Text) ни int str =...

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

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

13
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
12.11.2011, 09:32 #2
Цитата Сообщение от Dmitry99
C++
1
2
3
4
int CompareIA(const void *firstParametr, const void *secondParametr) {
  return (atoi(*(char **)secondParametr) - atoi(*(char **)firstParametr));
 
}
если у тебя этот код работает

C++
1
2
3
4
5
int CompareIA(const void *firstParametr, const void *secondParametr)
{
    return atoi(*reinterpret_cast<const char **>(secondParametr)) -
           atoi(*reinterpret_cast<const char **>(firstParametr));
}
0
Dmitry99
1 / 1 / 0
Регистрация: 11.11.2011
Сообщений: 9
13.11.2011, 09:45  [ТС] #3
Цитата Сообщение от accept Посмотреть сообщение
если у тебя этот код работает

C++
1
2
3
4
5
int CompareIA(const void *firstParametr, const void *secondParametr)
{
    return atoi(*reinterpret_cast<const char **>(secondParametr)) -
           atoi(*reinterpret_cast<const char **>(firstParametr));
}
Компилятор пишет:
error C2440: reinterpret_cast: невозможно преобразовать "const void *" в "const char **"
IntelliSense: reinterpret_cast не удается отбросить квалификатор const или квалификаторы другого типа
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
13.11.2011, 11:44 #4
C++
1
2
3
4
5
int CompareIA(void *firstParametr, void *secondParametr)
{
    return atoi(*reinterpret_cast<char **>(firstParametr)) -
           atoi(*reinterpret_cast<char **>(secondParametr));
}
0
Dmitry99
1 / 1 / 0
Регистрация: 11.11.2011
Сообщений: 9
13.11.2011, 12:32  [ТС] #5
Цитата Сообщение от accept Посмотреть сообщение
C++
1
2
3
4
5
int CompareIA(void *firstParametr, void *secondParametr)
{
    return atoi(*reinterpret_cast<char **>(firstParametr)) -
           atoi(*reinterpret_cast<char **>(secondParametr));
}
Теперь компилятору не нравится эта функция в качестве аргумента для Qsort
error C2664: qsort: невозможно преобразовать параметр 4 из "int (__cdecl *)(void *,void *)" в "int (__cdecl *)(const void *,const void *)"
IntelliSense: аргумент типа "int (*)(void *firstParametr, void *secondParametr)" несовместим с параметром типа "int (__cdecl *)(const void *, const void *)"
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
13.11.2011, 12:35 #6
Цитата Сообщение от Dmitry99 Посмотреть сообщение
Препод отругал за то, что у меня используется привидение типов в стиле си
А то есть qsort это нормально?
1
Dmitry99
1 / 1 / 0
Регистрация: 11.11.2011
Сообщений: 9
13.11.2011, 12:36  [ТС] #7
Цитата Сообщение от fasked Посмотреть сообщение
А то есть qsort это нормально?
А что в нем не нормального?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2011, 12:38 #8
Цитата Сообщение от Dmitry99 Посмотреть сообщение
А что в нем не нормального?
qsort Си-шная функция

Добавлено через 35 секунд
Цитата Сообщение от Dmitry99 Посмотреть сообщение
void main()
и в С++ это считается ошибкой
0
Dmitry99
1 / 1 / 0
Регистрация: 11.11.2011
Сообщений: 9
13.11.2011, 12:41  [ТС] #9
Цитата Сообщение от Jupiter Посмотреть сообщение
qsort Си-шная функция
В задании он разрешил использовать ее.
Цитата Сообщение от Jupiter Посмотреть сообщение
Добавлено через 35 секунд
и в С++ это считается ошибкой
Сыплю голову пеплом
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
13.11.2011, 12:42 #10
Цитата Сообщение от Dmitry99 Посмотреть сообщение
В задании он разрешил использовать ее.
Лучше используйте std::sort. Вреда меньше будет.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
13.11.2011, 13:13 #11
Цитата Сообщение от Dmitry99 Посмотреть сообщение
reinterpret_cast<char **>(firstParametr)
Делай через два каста. Сперва к void**, а потом к char**.
А зачем вобще так ты делаешь, я не понял.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
13.11.2011, 23:49 #12
Цитата Сообщение от Dmitry99
Теперь компилятору не нравится эта функция в качестве аргумента для Qsort
C++
1
2
3
4
5
int CompareIA(const void *firstParametr, const void *secondParametr)
{
    return atoi(*reinterpret_cast<char * const* >(firstParametr)) -
           atoi(*reinterpret_cast<char * const* >(secondParametr));
}
а мы вот так
1
Dmitry99
1 / 1 / 0
Регистрация: 11.11.2011
Сообщений: 9
15.11.2011, 14:34  [ТС] #13
Цитата Сообщение от accept Посмотреть сообщение
C++
1
2
3
4
5
int CompareIA(const void *firstParametr, const void *secondParametr)
{
    return atoi(*reinterpret_cast<char * const* >(firstParametr)) -
           atoi(*reinterpret_cast<char * const* >(secondParametr));
}
а мы вот так
Так работает, но преподу все равно не нравится, ему нравится вот так

C++
1
atof(*static_cast<char**>(const_cast<void*>(firstParametr)))
1
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
15.11.2011, 23:16 #14
правильно, смысл в том, чтобы все приведения прояснить
0
15.11.2011, 23:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 23:16
Привет! Вот еще темы с решениями:

Приведение типов
В паскале можно привести типы: type ts = 0..9; chislo = array of ts;...

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

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

Приведение типов
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f ...


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

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

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