Как писать сортировать с неизвестным аргументом. Не может повторяться с void * / -- c++ поле с участием sorting поле с участием insertion-sort пол Связанный проблема

How write sort with unknown argument. Cant iterate with void*/


-2
vote

проблема

русский

в этом <код> void* ic = b + j * sz; и это <код> void* jc = ic - sz; lines IDE, написание того, что выражение должно быть указателем на полный тип. Мне нужен функция Райта, которая может отсортировать все, поэтому я использую пустоту *. Я не сейчас, как итерацию с void *. Как получить доступ к элементам <код> void* base как массив.

<Сильные> UPD pchartove не так. У кулачка я бросил <код> void* <код> char* и оказался символы сердца. Чем я пытался работать с <код> void* .

 <код> #include <iostream>  using namespace std;  typedef int (*CFT) (const void*, const void*);  int pcharToInt(char* a); int cmp1(const void* a, const void* b); void insort(void* base, size_t n, size_t sz, CFT cmp);  int main() {     int arr[] = { 9, 3, 5, 3, 7, 9, 4 };     void* a = arr;     char* b = static_cast<char*>(a);     return 0; }  int pcharToInt(char* a) {     int b = 0;     char* tmp = a;     while (*a) {         b *= 10;         b += (*a++ - '0');     }     a = tmp;     return b; }  int cmp1(const void* a, const void* b) {     int n1 = 0;     int n2 = 0;     n1 = pcharToInt((char*)a);     n2 = pcharToInt((char*)b);     if (n1 > n2) return 1;     else return 0; }  void insort(void* base, size_t n, size_t sz, CFT cmp) {     void* b = base;     for (int i = 1; i < n; i++)     {         for (int j = i; j > 0; j--)         {             void* ic = b + j * sz;             void* jc = ic - sz;             if (cmp1(jc, ic)) {                 for (int k = 0; k < sz; k++) {                     char tmp = jc[k];                     jc[k] = ic[k];                     ic[k] = tmp;                 }             }             break;         }     } }   

und2 его старый код fitch char

 <код> char* b = static_cast<char*> (base);     for (int i = 1; i < n; i++)     {         for (int j = i; j > 0; j--)         {             char* ic = b + j * sz;             char* jc = ic - sz;             if (cmp1(jc, ic)) {                 for (int k = 0; k < sz; k++) {                     char tmp = jc[k];                     jc[k] = ic[k];                     ic[k] = tmp;                 }             }             break;         }     }   

und3 Проблемы в линии, где я бросаю <код> void* на <код> char* . В результате чего не правильные символы. Это должно быть цифры в примере кода.

Английский оригинал

In this void* ic = b + j * sz; and this void* jc = ic - sz; lines ide writing that expression must be a pointer to a complete type. I need to wright function which can sort everything so i use void*. I don't now how to iterate with void*. How get access to elements void* baselike array.

UPD pcharToInt is wrong. At fist i cast void* to char* and turned out heart symbols. Than i tried to work with void*.

#include <iostream>  using namespace std;  typedef int (*CFT) (const void*, const void*);  int pcharToInt(char* a); int cmp1(const void* a, const void* b); void insort(void* base, size_t n, size_t sz, CFT cmp);  int main() {     int arr[] = { 9, 3, 5, 3, 7, 9, 4 };     void* a = arr;     char* b = static_cast<char*>(a);     return 0; }  int pcharToInt(char* a) {     int b = 0;     char* tmp = a;     while (*a) {         b *= 10;         b += (*a++ - '0');     }     a = tmp;     return b; }  int cmp1(const void* a, const void* b) {     int n1 = 0;     int n2 = 0;     n1 = pcharToInt((char*)a);     n2 = pcharToInt((char*)b);     if (n1 > n2) return 1;     else return 0; }  void insort(void* base, size_t n, size_t sz, CFT cmp) {     void* b = base;     for (int i = 1; i < n; i++)     {         for (int j = i; j > 0; j--)         {             void* ic = b + j * sz;             void* jc = ic - sz;             if (cmp1(jc, ic)) {                 for (int k = 0; k < sz; k++) {                     char tmp = jc[k];                     jc[k] = ic[k];                     ic[k] = tmp;                 }             }             break;         }     } } 

UPD2 Its old code vitch char

char* b = static_cast<char*> (base);     for (int i = 1; i < n; i++)     {         for (int j = i; j > 0; j--)         {             char* ic = b + j * sz;             char* jc = ic - sz;             if (cmp1(jc, ic)) {                 for (int k = 0; k < sz; k++) {                     char tmp = jc[k];                     jc[k] = ic[k];                     ic[k] = tmp;                 }             }             break;         }     } 

UPD3 Trouble in line where I cast void* to char*. In result where are not right symbols. It must be numbers in example code.

</div
        
         
         

Список ответов

0
 
vote
vote
Лучший ответ
 

в C ++ вы не выбросите информацию о типе.

вместо

 <код>  > lag(x)                   2003-01-01 2 6 10  2003-01-02 3 7 11  2003-01-03 4 8 12 2  

Вы должны писать

 <код>  > lag(x)                   2003-01-01 2 6 10  2003-01-02 3 7 11  2003-01-03 4 8 12 3  

Обратите внимание, что вы игнорируете первый элемент, а <код> > lag(x) 2003-01-01 2 6 10 2003-01-02 3 7 11 2003-01-03 4 8 12 4 кажется подозрительным. Вам вообще нужно переместить более одного элемента, когда вы найдете что-то из строя.

надлежащая форма вставки ( адаптирована отсюда ) будет

 <код>  > lag(x)                   2003-01-01 2 6 10  2003-01-02 3 7 11  2003-01-03 4 8 12 5  
 

In C++ you don't throw away type information.

Instead of

typedef int (*CFT) (const void*, const void*); void insort(void* base, size_t n, size_t sz, CFT cmp); int cmp1(const void* a, const void* b); 

You should be writing

template<typename T> using CFT = bool(*)(const T *, const T *);  template<typename T> void insort(T* base, size_t n, CFT<T> cmp) {     for (T* i = base + 1; i < base + n; i++)     {         for (T* j = i; j > base; j--)         {             if (cmp(j, i)) {                 std::swap(*j, *i)             }             break;         }     } }  int cmp1(const int * a, const int * b) {      return *a > *b;  } 

Note that you ignore the first element, and the break seems suspicious. You generally need to move more than one element when you find something out of order.

A proper insertion sort (adapted from here) would be

template<typename T, typename Compare = std::less<>> void insertion_sort(T* first, size_t n, Compare cmp = Compare{}) {     for (T* it = first; it != first + n; ++it) {         auto const insertion = std::upper_bound(first, it, *it, cmp);         std::rotate(insertion, it, std::next(it));          assert(std::is_sorted(first, std::next(it), cmp));     } } 
</div
 
 
 
 
1
 
vote
<Р> Если вы пытаетесь имитировать работу <код> qsort() из стандартной библиотеки C, потребности функция сравнения быть адаптирована к типу элемента, отсортированные и порядок сортировки (по возрастанию или по убыванию) , Сравнение вызывается с указателем аргументами типа <код> const void * , поскольку <код> qsort() предназначен для работы с массивами любого типа и <код> void * является наиболее общим указателем объекта тип. <Р> Для конкретного случая сравнения <код> int элементы, то <код> const void * аргументы должны быть преобразованы в <код> const int * и разыменовываются получить значения из < код> int <код> элементы / для сравнения. Функция сравнения должна возвращать отрицательное, ноль или положительное значение, чтобы указать относительный порядок двух сравниваемых элементов. Для сортировки элементов <код> int Вид в порядке возрастания, подходящая функция сравнения заключается в следующем:
 <код> int cmp1(const void *a, const void *b) {     int aa = *(const int *)a; // convert pointer a and dereference     int bb = *(const int *)b; // convert pointer b and defererence      if (aa < bb)         return -1;     if (aa > bb)         return 1;     return 0; }   
<Р> Функция сравнения для сортировки <код> const void *0 элементы по убыванию Заказ будет аналогична описанному выше, но с <код> const void *1 и <код> const void *2 < / код> возвращаемые значения меняются местами. <Р> Ваш <код> const void *3 функции требуется другое значение, возвращаемое функцией сравнения, возвращая значение 0 вместо отрицательного значения. Для совместимости с <код> const void *4 функции, потребности функции должны быть изменены следующим образом:
 <код> const void *5  

<Р> Для стандартного C (и C ++?), Указатель арифметика <код> const void *6 не допускается, так как арифметика указателей разрешено только на указатели на полный типы объектов, а <код> const void *7 является неполными Тип объекта по определению. Некоторые компиляторы, такие как GCC указатель разрешения арифметика <код> const void *8 в качестве расширения стандарта C будут обрабатывать это так же, как <код> const void *9 , насколько арифметика указателей обеспокоена. Портативный код следует избегать арифметики указателей на <код> qsort()0 . Ваш <код> qsort()1 функция может быть изменена следующим образом для портативности:
 <код> qsort()2  
 

If you are trying to mimic the operation of qsort() from the C standard library, the comparison function needs to be tailored to the type of the element being sorted and the sort order (ascending or descending). The comparison is called with pointer arguments of type const void * because qsort() is designed to work with arrays of any type and void * is the most general object pointer type.

For the specific case of comparing int elements, the const void * arguments should be converted to const int * and dereferenced to get the values of the int elements to be compared. The comparison function should return a negative, zero, or positive value to indicate the relative ordering of the two elements being compared. For sorting elements of int type in ascending order, a suitable comparison function is the following:

int cmp1(const void *a, const void *b) {     int aa = *(const int *)a; // convert pointer a and dereference     int bb = *(const int *)b; // convert pointer b and defererence      if (aa < bb)         return -1;     if (aa > bb)         return 1;     return 0; } 

A comparison function for sorting int elements in descending order would be similar to the above but with the -1 and 1 return values swapped.

Your insort() function requires a different return value from the comparison function, returning 0 instead of a negative value. For compatibility with your insort() function, the function needs to be modified as follows:

int cmp1(const void *a, const void *b) {     int aa = *(const int *)a; // convert pointer a and dereference     int bb = *(const int *)b; // convert pointer b and defererence      return (aa > bb); } 

For standard C (and C++?), pointer arithmetic on void * is not allowed because pointer arithmetic is only allowed on pointers to complete object types, and void is an incomplete object type by definition. Some compilers such as GCC permit pointer arithmetic of void * as an extension to the C standard be treating it the same as char * as far as pointer arithmetic is concerned. Portable code should avoid pointer arithmetic on void *. Your insort() function can be modified as follows for portability:

void insort(void* base, size_t n, size_t sz, CFT cmp) {     char* b = (char*)base;     for (int i = 1; i < n; i++)     {         for (int j = i; j > 0; j--)         {             char* ic = b + j * sz;             char* jc = ic - sz;             if (cmp1((void*)jc, (void*)ic)) {                 for (int k = 0; k < sz; k++) {                     char tmp = jc[k];                     jc[k] = ic[k];                     ic[k] = tmp;                 }             }             break;         }     } } 
</div
 
 
     
     

Связанный проблема

1  Проблема с использованием TextureView с NDK  ( Issue using textureview with ndk ) 
Я работаю над небольшим кусочком кода, используя текстуру, чтобы отобразить результат среды MediaPlayer. Я сталкиваюсь с проблемой, пытающимся смешивать упр...

29  C ++ Указатель на объекты  ( C pointer to objects ) 
в C ++ У вас всегда инициализировать указатель на объект с new ключевое слово? или вы просто имеете это тоже: <код> MyClass *myclass; myclass->DoSometh...

7  Используйте простой класс C ++ в Android NDK  ( Use a simple c class in android ndk ) 
Я пытаюсь узнать основные основы Android NDK, но я застрял, когда я должен использовать его с классом C ++. Я понимаю, как использовать его с помощью просто...

1  Наличие проблемных проектов C ++ в Eclipse CDT в ОС X для глупой причины  ( Having trouble building c project in eclipse cdt in os x for a silly reason ) 
Я пытаюсь построить очень простую программу C ++ в Eclipse, и я получаю очень глупую ошибку: <код> **** Internal Builder is used for build **...

0  Использование Pybind11 на MacBook Pro  ( Using pybind11 on macbook pro ) 
Я пытаюсь использовать Pybind11 на MacBook, и я пытаюсь сделать так, как было написано в https://pybind11.readtheDocs.io/en/stable/basics.html я установил C...

145  Как определить, является ли строка номер с C ++?  ( How to determine if a string is a number with c ) 
У меня было довольно неприятностей, пытаясь написать функцию, которая проверяет, является ли строка номер. Для игры, которую я пишу, мне просто нужно проверит...

0  Как скопировать файлы из установленного местоположения в изолированное хранение в Windows Phone 8  ( How to copy files from installed location to isolated storage in windows phone 8 ) 
Я разрабатываю приложение для WP8 с помощью Cocos2DX. Я не могу найти функцию копирования, которая помогает мне копировать файлы с установленного местоположен...

-2  Конструкторы ведут себя странным с кодом обработки исключений  ( Constructors behaving strange with exception handling code ) 
Скриншот # 1: Образец (образец & amp;) {...) // Нет ошибки без использования "const" Скриншот № 2: Destructor называется дважды, когда Copy-Constructor не вк...

10  Как я могу обнаружить доступ к файлу в Linux?  ( How can i detect file accesses in linux ) 
У меня есть куча потоков и приложений для обработки данных, которые я иногда нужно шпионить, то есть мне нужно знать, какие файлы они читают. Это в основном, ...

7  Как очистить удаленные объекты в C ++  ( How do clean up deleted objects in c ) 
Возможно ли использовать память об удаленных объектах в C ++? Я хочу сделать это, чтобы воспроизвести Coredump в модульном тесте: <код> //Some member variab...

4  Строка :: Новая: что это?  ( Stringnew what is it ) 
Я из фона Java и изучает C ++. Я столкнулся с следующим C ++: <код> String source = String::New("'Hello' + ', World'"); Как то, что я так понимаю, это ...

-1  Qt показывает изображение на 1/4 секунды  ( Qt show an image for 1 4 of a second ) 
Эй, я пробовал несколько раз, чтобы завершить это, используя Uslep или Qt Sleep, когда показывает изображение, но иногда (почти каждый раз) он появляется белы...

3  Преобразование IPlimage в вектор в 1D в OpenCV  ( Converting iplimage into 1d vector in opencv ) 
Я хочу преобразовать MXN IPLIMAGE в вектору A (M * N) x 1 1. Может ли это сделать с любой функцией в OpenCV? Любая помощь значительно ценится. ...

42  Как я могу легко увидеть график C / C ++ #include? [закрыто]  ( How can i see the c c include graph easily ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос не соответствует Рекомендациям переполнения ...

-1  C ++ с использованием класса от заголовка в классе  ( C using a class from a header within a class ) 
У меня есть немного проблемы с классами, используемыми в классах, из файлов заголовка. У меня есть время занятий во времени. Как: <код> #ifndef TIME_H #de...