Ошибка в переменных: Невозможно преобразовать "void *" в "int **" - C (СИ)
Формулировка задачи:
после компиляции выдает ошибку: error C2440: =: невозможно преобразовать "void *" в "int **"
1> Для преобразования "void*" к указателю на тип, не являющемуся "void", требуется явное приведение
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main (int argc, char **argv)
{
int i, j, el, m, k, kol= 0, w, last, first, mid, row, col, **ar;
srand (time (0));
printf ("row col> ");
scanf ("%d%d", &row, &col);
printf ("\n-----\nMatrix:\n");
ar= malloc (sizeof (int *) * row);
for (i= 0; i < row; i++)
{
ar[i]= malloc (sizeof (int) * col);
for (j= 0; j < col; j++)
{
ar[i][j]= rand () % 99;
printf ("%2d ", ar[i][j]);
}
printf ("\n");
}
// Sorting by selection
for (j= 0; j < col; j++)
for (m= 0; m < row - 1; m++)
for (i= m + 1; i < row; i++)
{
if (ar[i][j] < ar[m][j])
{
w= ar[m][j];
ar[m][j]= ar[i][j];
ar[i][j]= w;
}
}
printf("\n-----\nSorting by selection:\n");
for (i= 0; i < row; i++)
{
for (j= 0; j < col; j++)
printf ("%2d ", ar[i][j]);
printf("\n");
}
printf ("\nFind elemet: ");
scanf ("%d", &el);
// Consecutive search
printf("\n-----\nConsecutive search:\n");
for (j= 1; j < col; j+=2)
{
for (i= 0; i < row; i++)
{
if (ar[i][j] == el)
{
kol++;
printf("col %2d in row %2d\n", j + 1, i + 1);
}
}
}
if (kol == 0)
printf("Not found\n");
// Binary search
printf ("\nBinary search:\n");
for (j= 0; j < col; j+= 2)
{
first= 0;
last= row - 1;
while (first <= last)
{
mid= (first + last) / 2;
if (ar[mid][j] < el)
first= mid + 1;
else if (ar[mid][j] > el)
last= mid - 1;
else
{
kol++;
int buf= mid;
while (buf > 0 && ar[--buf][j] == el);
while (++buf < row && ar[buf][j] == el)
printf ("col %2d in row %2d\n", j + 1, buf + 1);
break;
}
}
}
if (kol == 0)
printf("Not found\n");
return 0;
}Решение задачи: «Ошибка в переменных: Невозможно преобразовать "void *" в "int **"»
textual
Листинг программы
ar= (int **)malloc (sizeof (int *) * row);
Объяснение кода листинга программы
В данном коде происходит выделение памяти под массив указателей на int.
row- это переменная, которая содержит количество строк в массиве.ar- это переменная, которая будет содержать указатели на начало каждой строки массива. Выполняется следующие действия:- Вычисляется размер памяти, необходимый для хранения row указателей на int. Это делается с помощью оператора sizeof, который возвращает размер памяти, занимаемый типом данных int *.
- Используя функцию malloc, выделяется память под массив указателей на int. При этом в качестве аргумента функции передается размер памяти, который был вычислен на предыдущем шаге.
- Результат работы функции malloc сохраняется в переменной
ar.