Invalid conversion from `void*' to `int*' - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Не могу разобраться с ошибкой выдаваемой компилятором. In function `void merge(char*, long int, long int, long int)': (На 158 строке) invalid conversion from `void*' to `int*' Программирую на Dev, думаю все дело в этом, но все равно не могу понять проблему. Прошу помощи.
#define MAXN 10000 //максимальный размер массива для метода квадратичных проб
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
//---------------------------------------------------------------------------------------
void selection_method(char *a, int len) //сортировка методом прямого выбора
{
    /* внешний цикл. i – позиция первого неотсортированного элемента на данной итерации */
    int i;
    for (i = 0; i <= len - 1; i=i+1)
    {
        int min = i; /* min – позиция минимального элемента */
        /* внутренний цикл. если найден элемент строго меньший текущего минимального, записываем его индекс как минимальный */
        int j;
        for(j = i + 1; j <= len; j=j+1)
        {
            if(a[j] < a[min])
                min = j;
        }
        if(min != i) /* минимальный элемент не является первым неотсортированным, обмен нужен */
        {
            char tmp = a[i];
            char tmp1 = a[min];
            a[i] = tmp1;
            a[min]= tmp;
            printf("Перемещены элементы %d и %d", i, min);
        }
    }
    puts("Selection sort result");
    puts(a);
}
//---------------------------------------------------------------------------------------
void Swap(char Arr[], int i) //Перестановка i-го и i-1-го элемента массива Arr
{
    int temp;       //буфер
    temp = Arr[i];
    Arr[i] = Arr[i - 1];
    Arr[i - 1] = temp;
}
//---------------------------------------------------------------------------------------
void ShakerSort(char Arr[], int Start, int N) //Шейкер сортировка
{
    int Left, Right; //границы сортировки
 
    Left = Start;
    Right = N - 1;
    do
    {
        //Сдвигаем к началу массива "легкие элементы"
        int i;
        for (i = Right; i >= Left; i--)
        {
            if (Arr[i - 1]>Arr[i])
            {
                Swap(Arr, i);
            }
        }
 
        Left = Left + 1;
 
        //Сдвигаем к концу массива "тяжелые элементы"
 
        for (i = Left; i <= Right; i++)
        {
            if (Arr[i - 1] > Arr[i])
            {
                Swap(Arr, i);
            }
        }
 
        Right = Right - 1;
    }
    while (Left <= Right);
    puts("Shaker sort result");
    puts(Arr);
}
//---------------------------------------------------------------------------------------
void ShellSort(char v[], int n) //Сортировка Шелла
{
    int gap; // Расстояние между элементами
    int i,j,temp;
 
    for(gap = n/2; gap > 0; gap /= 2)
        for(i = gap; i < n; i++)
            for(j = i - gap; j >= 0 && v[j] > v[j + gap]; j -= gap)
            {
                temp = v[j];
                v[j] = v[j + gap];
                v[j + gap] = temp;
            }
    puts("Shell sort result");
    puts(v);
}
//---------------------------------------------------------------------------------------
void swap (char *a, char *b) //Функция обмена (по правилу трёх стаканов)
{
  char t = *a;
  *a = *b;
  *b = t;
}
//---------------------------------------------------------------------------------------
void PyramidSort(char a[], int n) //функция пирамидальной сортировки
{
    int  i, sh = 0, b = 0;
     while (1)
      {
        b = 0;
        for (i = 0; i < n; ++i)
        {
          if (i*2 + 2 + sh < n)
          {
            if (a[i+sh] > a[i*2 + 1 + sh] || a[i + sh] > a[i*2 + 2 + sh])
            {
              if (a[i*2+1+sh] < a[i*2+2+sh])
              {
                swap (&a[i+sh], &a[i*2+1+sh]);
                b = 1;
              }
              else if (a[i*2+2+sh] < a[i*2+1+sh])
              {
                swap (&a[i+sh],&a[i*2+2+sh]);
                b = 1;
              }
            }
          }
          else if (i * 2 + 1 + sh < n)
          {
            if (a[i+sh] > a[i*2+1+sh])
            {
              swap (&a[i+sh], &a[i*2+1+sh]);
              b=1;
            }
          }
        }
        if (!b) sh++;
        if (sh+2==n)
          break;
      }
     puts("Pyramid sort result");
     puts(a);
}
//---------------------------------------------------------------------------------------
void merge(char *a, long start, long split, long stop) {
// Слияние упорядоченных частей массива в буфер temp
// с дальнейшим переносом содержимого temp в a[lb]...a[ub]
 
  // текущая позиция чтения из первой последовательности a[lb]...a[split]
  long pos1=start;
 
  // текущая позиция чтения из второй последовательности a[split+1]...a[ub]
  long pos2=split+1;
 
  // текущая позиция записи в temp
  long pos3=0;
 
  int *temp;
  temp= malloc(sizeof(char)*(stop-start+1));
 
  // идет слияние, пока есть хоть один элемент в каждой последовательности
  while (pos1 <= split && pos2 <= stop) {
    if (a[pos1] < a[pos2])
      temp[pos3++] = a[pos1++];
    else
      temp[pos3++] = a[pos2++];
  }
 
  // одна последовательность закончилась -
  // копировать остаток другой в конец буфера
  while (pos2 <= stop)   // пока вторая последовательность непуста
    temp[pos3++] = a[pos2++];
  while (pos1 <= split)  // пока первая последовательность непуста
    temp[pos3++] = a[pos1++];
 
  // скопировать буфер temp в a[lb]...a[ub]
  for (pos3 = 0; pos3 < stop-start+1; pos3++)
    a[start+pos3] = temp[pos3];
 
  free(temp);
}
//---------------------------------------------------------------------------------------
void mergeSort(char *a, long start, long stop) { //сортировка слиянием
  long split;                   // индекс, по которому делим массив
 
  if (start < stop) {                // если есть более 1 элемента
 
    split = (start + stop)/2;
 
    mergeSort(a, start, split);       // сортировать левую половину
    mergeSort(a, split+1,stop);// сортировать правую половину
    merge(a, start, split, stop);    // слить результаты в общий массив
  }
 
}
//---------------------------------------------------------------------------------------
int GetEVersion1(char *a, int len, char e)
{   //метод поиска буквы Е №1
    int i;
    for(i =0; i != len; i=i+1) //поиск буквы Е перебором символов
    {
        if(a[i] == e)
        return i; //возвращаем ненулевой результат (позиция буквы Е в массиве)
    }
    return -1; //возвращаем -1 (если буква E не найдена)
}
//---------------------------------------------------------------------------------------
int GetEVersion2(char *a, int len, char e)
{   //метод поиска буквы Е №2
    ShakerSort(a, 0, len); //предварительно сортируем массив символов по алфавиту
    int i;
    for(i =0; i != len; i=i+1) //поиск буквы Е перебором символов
    {
        if(a[i] == e)
        return i;//возвращаем ненулевой результат (позиция буквы Е в отсортированном массиве)
    }
    return -1;//возвращаем -1 (если буква E не найдена)
}
//---------------------------------------------------------------------------------------
struct node //элемент хэш-таблицы
{
    char znac; //значение (символ)
    int key;   //ключ
};
struct node hashtable[MAXN]; //объявление хэш - таблицы
//---------------------------------------------------------------------------------------
int hash(char s) //функция построения хэш-кода символа
{
    int result;
    result = s; //в качестве хэша используем ASCII код
    return result;
}
//---------------------------------------------------------------------------------------
int kvhash(char* s) //метод квадратичных проб
{
    int ObTable = 0;
    int kolsl = strlen(s);
    int kolcol;
    kolcol = 0; //число коллизий
    int i;
    for( i =0; i!=strlen(s); i=i+1)
    {
        //получаем хэш-код символа
        int zn=1;
        int hs;
        hs=hash(s[i]);
        int num;
        num = hs;
        while(1)
        {
            //добавляем значение в хэш таблицу
            if (hashtable[num].key!=0)
            {
                        kolcol++;
                        //строки равны то выходим
                        if (hashtable[num].znac==s[i]) break;
                        //находим новую позицию как квадрат, меняем знак
                        num=(num+i*zn)*(num+i*zn); zn=-zn;
                        if (zn==1) i++;
                        //если вышли за пределы хэш-таблицы, то увеличиваем ее размер
                        if (num>kolsl && num<MAXN) kolsl=num;
                        //проверяем, не вышли ли за пределы массива
                        if (num>MAXN) num=num%MAXN;
                        if (num<0) num=1;
            }
            else
            {
                        ObTable++;
                        hashtable[num].znac =s[i];
                        hashtable[num].key=hs;
                        break;
            }
        }
    }
    return 0;
}
//---------------------------------------------------------------------------------------
struct chetv_chisl //структура - четверичное число
{
    int chislo[3]; //цифры четверичного числа
    int decimal_eqviv; //десятичный эквивалент четверичного числа
};
//---------------------------------------------------------------------------------------
int chetv_chisl_to_decimal(struct chetv_chisl ch)
{
            int c3 = ch.chislo[0] * 64;
            int c2 = ch.chislo[1] * 16;
            int c1 = ch.chislo[2] * 4;
            return  c1 + c2 + c3;
}
//---------------------------------------------------------------------------------------
void SwapChetvChisl(struct chetv_chisl Arr[], int i)
{
    struct chetv_chisl temp;       //буфер
    temp = Arr[i];
    Arr[i] = Arr[i - 1];
    Arr[i - 1] = temp;
}
//---------------------------------------------------------------------------------------
void ShakerSortChetvChisl(struct chetv_chisl Arr[], int Start, int N)
{
    int Left, Right; //границы сортировки
 
    Left = Start;
    Right = N - 1;

    do
    {
        //Сдвигаем к началу массива "легкие элементы"
        int i;
        for (i = Right; i >= Left; i--)
        {
            if (Arr[i - 1].decimal_eqviv>Arr[i].decimal_eqviv)
            {
                SwapChetvChisl(Arr, i);
            }
        }
 
        Left = Left + 1;
 
        //Сдвигаем к концу массива "тяжелые элементы"
 
        for (i = Left; i <= Right; i++)
        {
            if (Arr[i - 1].decimal_eqviv > Arr[i].decimal_eqviv)
            {
                SwapChetvChisl(Arr, i);
            }
        }
 
        Right = Right - 1;
    }
    while (Left <= Right);

}
//---------------------------------------------------------------------------------------
int main(void) {
        char fioconst[20] = {'P','l','o','t','n','e','r','c','h','u','k','D','m','i','t','r','y'};
        char fio[20];
        strcpy(fio,fioconst);
 
        /*1. Используя в качестве массива набор из 8 букв своих фамилии, имени, отчества,
         * определить на каждом шаге в методе прямого выбора номера перемещаемых элементов.*/
         puts("1. Используя в качестве массива набор из 8 букв своих фамилии, имени, отчества, определить на каждом шаге в методе прямого выбора номера перемещаемых элементов.");
         selection_method(fio, 8); //сотируем строку по методу прямого выбора + выводим номера перемещаемых элементов
         strcpy(fio,fioconst);
         /*2. Используя в качестве массива набор из 8 букв своих фамилии, имени, отчества,
              * опеределить на каждом шаге в методе шейкерной сортировки левую и правую границы сортируемой части массива (L и R)*/
 
         puts("2. Используя в качестве массива набор из 8 букв своих фамилии, имени, отчества, опеределить на каждом шаге в методе шейкерной сортировки левую и правую границы сортируемой части массива (L и R)");
         strcpy(fio,fioconst);
         ShakerSort(fio, 0, 8);
         /*3. Используя в качестве массива набор из 8 букв своих фамилии, имени, отчества, провести сортировку методом Шелла.
          * Последовательность шагов h1=1, h2=2.*/
 
         puts("3. Используя в качестве массива набор из 8 букв своих фамилии, имени, отчества, провести сортировку методом Шелла. Последовательность шагов h1=1, h2=2.");
         strcpy(fio,fioconst);
         ShellSort(fio, 8);
 
         /*4. Используя в качестве массива набор из 10 букв своих фамилии, имени, отчества, построить пирамиду и отсортировать массив.*/
         puts("4. Используя в качестве массива набор из 10 букв своих фамилии, имени, отчества, построить пирамиду и отсортировать массив.");
         strcpy(fio,fioconst);
         PyramidSort(fio,10);
 
          /*5. Провести сортировку последовательности из 15 букв своих фамилии, имени, отчества методом прямого слияния.*/
         puts("5. Провести сортировку последовательности из 15 букв своих фамилии, имени, отчества методом прямого слияния.");
         strcpy(fio,fioconst);
         mergeSort(fio,0, 15);
         puts("MergeSortResult");
         puts(fio);
 
        /*6. Составить произвольную последовательность из 12 трехзначных чисел
         * в четверичной системе счисления и отсортировать её при помощи цифровой сортировки*/
         puts("6. Составить произвольную последовательность из 12 трехзначных чисел в четверичной системе счисления и отсортировать её при помощи цифровой сортировки");
         struct chetv_chisl chisl_arr [12];
        //заполняем массив случайным образом
        int i = 0;
        for(;i!=12;i++)
        {
                chisl_arr[i].chislo[0] = (rand () % 9) + 1;
                chisl_arr[i].chislo[1] = (rand () % 9) + 1;
                chisl_arr[i].chislo[2] = (rand () % 9) + 1;
        }
 
        //переводим число в десятичную систему
 
        for(;i!=12;i++)
        {
            chisl_arr[i].decimal_eqviv = chetv_chisl_to_decimal(chisl_arr[i]);
        }
        ShakerSortChetvChisl(chisl_arr, 0, 12);
        puts("ChetvChisl Arr Shaker sort result");
        for(i=0; i!=12;i++)
        {
            printf("%d%d%d\n",chisl_arr[i].chislo[0],chisl_arr[i].chislo[1], chisl_arr[0].chislo[2] );
 
        }
 
        /*7. Провести быстрый поиск (2 версии) буквы "Е" (русс.) в массиве из 15 букв своих фамилии, имени, отчества.*/
        puts("7. Провести быстрый поиск (2 версии) буквы \"Е\" (русс.) в массиве из 15 букв своих фамилии, имени, отчества.");
        char e ;
         e= (char)'e';
         if( GetEVersion1(fio, 15,e) != -1) puts("Буква Е Способом 1 найдена!");
         else puts("Буква Е Способом 1 не найдена!");
         if( GetEVersion2(fio, 15,e) != -1) puts("Буква Е Способом 2 найдена!");
         else puts("Буква Е Способом 2 не найдена!");
 
        /*8. Построить хэш-таблицу методом квадратичных проб
         * для всех букв своих фамилии, имени, отчества*/
         puts("8. Построить хэш-таблицу методом квадратичных проб для всех букв своих фамилии, имени, отчества");
         kvhash(fio);
         //выводим хэш-таблицу на экран
         for(i = 0; i <= MAXN; i++ )
         {
                if(hashtable[i].znac != 0 )
                    printf("%c %d\n", hashtable[i].znac, hashtable[i].key);
         }

    return EXIT_SUCCESS;
}

Решение задачи: «Invalid conversion from `void*' to `int*'»

textual
Листинг программы
temp= (int*)malloc(sizeof(char)*(stop-start+1));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5