@olkhovich

Как конвертировать массив типа char в int?

Дано задание на шаблоны функций: перестановка элементов в массиве следующим образом: сначала отрицательные элементы в порядке убывания, затем неотрицательные в порядке возрастания.
Есть 2 аргумента char и double
Как конвертировать массив char в int? И где может быть ошибка?
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

template <typename T>
void swap(T& first, T& second)
{
	T temp(first);
	first = second;
	second = temp;
}

template <typename T1>
void out_array(const T1* array, size_t arraySize)
{
	for (size_t i = 0; i < arraySize; ++i)
		std::cout << array[i] << " ";
	std::cout << std::endl;
}

template <class T1>
void sort_array(T1* array, size_t arraySize)
{
	T1 temp;
	for (size_t i = 0; i < arraySize - 1; i++)
	{
		for (size_t j = 0; j < arraySize - i - 1; j++)
		{
			if (array[j] < 0)
				if (array[j] < array[j + 1])
				{
					temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
			if (array[j] > 0)
				if (array[j] > array[j + 1])
				{
					temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
		}
	}
}

int main()
{
	setlocale(0, "");
	const size_t n = 10;
	double array1[n] = { 2.1,1.1,4.2,5.2,3.1,-3.1,-1.2,-2.3,-4.4,-5.6 };
	char array2[n] = { '2','1','4','5','3','-3','-1','-2','-4','-5' };
	int array3[n] = atoi(array2);
	std::cout << "Неотсортированный массив:" << std::endl;
	out_array(array1, n);
	out_array(array3, n);
	sort_array(array1, n);
	sort_array(array2, n);
	std::cout << "Отсортированный массив:" << std::endl;
	out_array(array1, n);
	out_array(array3, n);
}

Выдает ошибку:
1>lab5.cpp
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,41): warning C4838:  преобразование из "int" в "char" требует сужающего преобразования
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,66): warning C4305:  инициализация: усечение из "int" в "char"
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,41): warning C4309:  инициализация: усечение константного значения
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,46): warning C4838:  преобразование из "int" в "char" требует сужающего преобразования
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,46): warning C4309:  инициализация: усечение константного значения
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,51): warning C4838:  преобразование из "int" в "char" требует сужающего преобразования
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,51): warning C4309:  инициализация: усечение константного значения
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,56): warning C4838:  преобразование из "int" в "char" требует сужающего преобразования
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,56): warning C4309:  инициализация: усечение константного значения
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,61): warning C4838:  преобразование из "int" в "char" требует сужающего преобразования
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(52,61): warning C4309:  инициализация: усечение константного значения
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(53,35): error C2440:  инициализация: невозможно преобразовать "int" в "int [10]"
1>C:\Prog\Visual Studio 2019\lab5\lab5.cpp(53,16): message :  Не существует преобразований в типы массивов, хотя существуют преобразования в ссылки или указатели на массивы
1>Сборка проекта "lab5.vcxproj" завершена с ошибкой.
  • Вопрос задан
  • 983 просмотра
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Ошибок в этом коде довольно много.

Начнем с void swap(T& first, T& second).
Она просто не нужна т.к. есть std::swap.

template <typename T1>
void out_array(const T1* array, size_t arraySize)

Параметр arraySize тоже не нужен. Ты работаешь с сырыми массивами фиксированной длины и можешь дать своему шаблону функции понимание длины такого массива. Делается это так.
template < typename TElementType, size_t LENGTH >
void out_array( const TElementType array[ LENGTH ] )


Далее.
char array2[n] = { '2','1','4','5','3','-3','-1','-2','-4','-5' };

В этом месте сразу две ошибки. Первая - это инициализация символьными литералами. '2' не будет эквивалентно 2. С этого момента сортировка будет сортировать по коду символьной таблицы, а не по значению числа. Это ошибка, т.к. это явно не то поведение, которое ты ждешь.
Вторая ошибка - это '-3' и.т.д. Тип у такой конструкции будет int, а не char. Компилятор тебе именно об этом и пытается сказать.

int array3[n] = atoi(array2);
Эту конструкцию сложно понять. Сказать можно одно - так массив фиксированной длины инициализировать не получится.
Если этой конструкцией ты хотел описать инициализацию массива, то это можно попробовать сделать вот так:
int array3[n];
std::transform(
    std::begin( array2 ), std::end( array2 ), std::begin( array3 ),
    []( const char item ) -> int { return item; } 
);

Но это тоже скользкое решение. В твоем случае все будет нормально, в общем случае это плохое решение. Изучи документацию на функцию std::transform.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы