Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2013, 12:43   #1
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию error C2664: PrintArray: невозможно преобразовать параметр 1 из "int **" в "const int **"

Вот такая ошибка появляется.
Код:
#include "stdafx.h"
#include "iostream"

void PrintArray(const int **arr, int rows, int cols);

int _tmain(int argc, _TCHAR* argv[])
{
	int **arr;

	arr = new int*[3];
	for (unsigned int iy=0; iy!=3; ++iy)
		arr[iy]=new int[4];

	for (unsigned int iy=0; iy!=3; ++iy)
		for (unsigned int ix=0; ix!=4; ++ix)
			arr[iy][ix]=iy+ix;

	PrintArray(arr, 3, 4);  // error C2664: PrintArray: невозможно преобразовать параметр 1 из "int **" в "const int **"

	system("pause");
	return 0;
}

void PrintArray(const int **arr, int rows, int cols)
{
	for (unsigned int iy=0; iy!=rows; ++iy)
	{
		for (unsigned int ix=0; ix!=cols; +ix)
			std::cout << arr[iy][ix];
		std::cout << std::endl;
	}
	std::cout << std::endl;
}
Если в вызове функции явно указать константу, то все норм:
Код:
PrintArray((const int **)(arr), 3, 4);
Вот и в чем вопрос, Почему при вызове функции надо писать const int **?
revizor вне форума Ответить с цитированием
Старый 07.05.2013, 12:53   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А зачем ты слово const поставил в описании функции? Ты все равно по указателю передаешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.05.2013, 13:10   #3
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А зачем ты слово const поставил в описании функции? Ты все равно по указателю передаешь.
const в описании функции уже убрал. Да вот программа вообще неправильно работает. Сейчас запустил ее и она печатает одни сплошные нули и еще к тому же зависает.

Stilet, как правильно написать функцию для печати массива? У меня не получается
revizor вне форума Ответить с цитированием
Старый 07.05.2013, 13:28   #4
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Код:
#include <iostream>

void PrintArray(int **arr, int rows, int cols);

int main(void)
{
	int **arr;

	arr = new int*[3];
	for (unsigned int iy=0; iy!=3; ++iy)
		arr[iy]=new int[4];

	for (unsigned int iy=0; iy!=3; ++iy)
		for (unsigned int ix=0; ix!=4; ++ix)
			arr[iy][ix]=iy+ix;

	PrintArray(arr, 3, 4);

	system("pause");
	return 0;
}

void PrintArray(int** arr, int rows, int cols)
{
	for (unsigned int iy=0; iy!=rows; ++iy)
	{
		for (unsigned int ix=0; ix!=cols; ++ix)
			std::cout << arr[iy][ix];
		std::cout << std::endl;
	}
	std::cout << std::endl;
}
либо меняйте

Код:
const int **arr
Код:
int** const arr
Различайте константные указатели и указатели на константы.

Последний раз редактировалось Stilet; 07.05.2013 в 13:39.
tools вне форума Ответить с цитированием
Старый 07.05.2013, 13:43   #5
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Спасибо tools.

У меня еще один вопрос Смотрите, вот две функции.
Код:
void PrintArray(int **arr, int rows, int cols)
{
	for (unsigned int iy=0; iy!=rows; ++iy)
	{
		for (unsigned int ix=0; ix!=cols; +ix)
			std::cout << arr[iy][ix] << " ";
		std::cout << std::endl;
	}
	std::cout << std::endl;
}

void PrintArray2(int **arr, int rows, int cols)
{
	for (unsigned int iy=0; iy!=rows; ++iy)
	{
		for (unsigned int ix=0; ix!=cols; ++ix)
			std::cout << arr[iy][ix] << " ";
		std::cout << std::endl;
	}
	std::cout << std::endl;
}
Имена у них разные, а содержимое у них полностью одинаковое. Первая неправильно работает, а вторая правильно. Почему так?
Прям чудеса какие-то.
revizor вне форума Ответить с цитированием
Старый 07.05.2013, 13:44   #6
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Первая это моя, а вторую скопировал у tools.
revizor вне форума Ответить с цитированием
Старый 07.05.2013, 14:07   #7
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Нашел ошибку. В 5-ой строчке стоит +ix вместо ++ix.
Тему можно закрывать)
revizor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неявное преобразование типа "string" в "int" невозможно artscorp C# (си шарп) 4 10.02.2013 20:59
Какова разница между "int** &a" и "int** a" в кач-ве параметра функции? dollemika Помощь студентам 3 15.01.2012 17:16
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
C++, препроцессор, как из "int" сделать "char"? Максай Помощь студентам 3 05.09.2008 08:16