Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

11.11.2011, 22:18. Просмотров 1352. Ответов 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++):

Приведение типов - C++
Необходимо привязать адрес массива double по указателю к адресу структуры. Массив сам создан в другом приложении. Если использовать...

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

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

Приведение типов - C++
При вводе с клавиатуры s = 11 и a = 1.1, получаем 9. Результат переменной d = 10, это правильно. В чём подвох? int main() { ...

Приведение типов - C++
Как привести наследника ко второму родителю? class Parent1 { public: int a; int b; int c; }; class Parent2

приведение типов - C++
Объясните, пожалуйста, почему возникает такая ошибка: error C2666: 'operator *' : 4 overloads have similar conversions ? Из-за того,...

13
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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
Эксперт С++
4948 / 2528 / 180
Регистрация: 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
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
13.11.2011, 12:42 #10
Цитата Сообщение от Dmitry99 Посмотреть сообщение
В задании он разрешил использовать ее.
Лучше используйте std::sort. Вреда меньше будет.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.11.2011, 13:13 #11
Цитата Сообщение от Dmitry99 Посмотреть сообщение
reinterpret_cast<char **>(firstParametr)
Делай через два каста. Сперва к void**, а потом к char**.
А зачем вобще так ты делаешь, я не понял.
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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
Привет! Вот еще темы с ответами:

Приведение типов - C++
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int a=-1; unsigned int b=5; if(a&gt;b){...}//Условие...

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

Приведение типов - C++
Есть задача создать список с объектами у которых разные классы, но один базовый предок. Потом нужно перебрать список и если объект одного...

Приведение типов - C++
В паскале можно привести типы: type ts = 0..9; chislo = array of ts; Как это сделать на С++?


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

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

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