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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2012, 23:52   #1
Slavik3
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 18
По умолчанию невозможно преобразовать char[] в char

Код:
#include <iostream>
using namespace std;

char __stdcall str(TCHAR*c)
{
	setlocale(LC_CTYPE,"Russian");
	const int AlfSz = 28;//количество букв алфавита 
	char alf[AlfSz]="abcdefghijklmnopqrstuvwxyz";	
	int shift = 1;//здвиг
	char slovo[128]="slovo";	
	int len = strlen(slovo);
	char new_slovo[128]; 
	for (int i=0; i<len; i++)
	{
		for(int j=0;j<AlfSz;j++)
		{
			if(slovo[i]==alf[j])
			{ 
				int k = j + shift;
				if (k > AlfSz)
				k -= AlfSz;
				new_slovo[i]=alf[k];
			}
		}
	}
	new_slovo[len] = '\0';
	//cout<<"зашифрованое слово "<<new_slovo<<endl;
	
//дешифровка
	char dshifrslovo[128];
	for (int i=0; i<128; i++)
	{
		for(int j=0;j<AlfSz;j++)
		{
			if(new_slovo[i]==alf[j])
			{ 
				int k = j - shift;
				if (k > AlfSz)
				k -= AlfSz;
				dshifrslovo[i]=alf[k];
			}
		}
	}
//	cout<<"дешифрованое слово "<<dshifrslovo<<endl;
	return new_slovo;  
	//return dshifrslovo[len];	
}
нужно передать в ретурне значения, выводит ошибки
1. невозможно преобразовать char[] в char
2. тип возвращаемого значения не соответствует типу функции
Как я понял это одна ошибка, но исправить ее у меня никак не получается, если написать return new_slovo[128]; выводит -51, если убрать в "char new_slovo[128];" убрать "[128]" выводит новые ошибки.
И еще вопрос, как вернуть два значения? делать две функции?
Slavik3 вне форума Ответить с цитированием
Старый 17.10.2012, 00:06   #2
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

Вы возвращаете переменную с типом char*, а прототип ф-ции у вас char.
Т.е. исправьте вот эту строчку
Код:
char __stdcall str(TCHAR*c)
На
Код:
char* __stdcall str(TCHAR*c)
Совет
Сделайте число 128 константой и замените все 128 на SIZE, так будет легче управлять нужным вам размером
Код:
#define SIZE 128

Последний раз редактировалось Axrik; 17.10.2012 в 00:10.
Axrik вне форума Ответить с цитированием
Старый 17.10.2012, 10:12   #3
Slavik3
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 18
По умолчанию

Спасибо, И еще вопрос, как вернуть два значения? делать две функции?
Slavik3 вне форума Ответить с цитированием
Старый 17.10.2012, 19:05   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
Совет
Совет, конечно, хорош, но поскольку автор пишет на плюсах, а не на чистом Си, то вместо дефайна стоит использовать
Код:
const int Size = 128;
Цитата:
как вернуть два значения?
Варианта два. Первый, наименее прозрачный в использовании - передавать переменные, в которые хотите записать результат в вашу функцию по ссылке или по указателю:
Код:
void x2andx3(int x, int& x2, int& x3)
{
x2 = x * x;
x3 = x * x * x;
}
void x2x3_v2(int x, int* x2, int* x3)
{
*x2 = x * x;
*x3 = x * x * x;
}

void f()
{
int var = 2;
int square, cube;
x2x3(var, square, cube);   //Значения square теперь 4, а cube - 8
var = 3;
x2x3(var, &square, &cube);   //Теперь square == 9, cube == 27
}
Способ плох тем, что возникают проблемы при чтении кода - не всегда очевидно, что переменные, передаваемые в качестве аргументов, после выполнения функции меняют свои значения. (способ с передачей по ссылке принципиально ничем не отличается от передачи по указателю, просто не нужно получать адрес переменной, а потом разыменовывать указатель).

Второй вариант - запаковать оба возвращаемые значения в структуру:
Код:
struct twonumbers
{
int a, b;
};

twonumbers x2x3(int x)
{
twonumbers nn;
nn.a = x * x;
nn.b = x * x * x;
}
void f()
{
int var = 2;
int square, cube;
twonumbers s_c = x2x3(2);
square = s_c.a;
cube = s_c.b;
}
Способ гораздо более наглядный - изменение переменных происходит самым явным образом - присваиванием. Стоит, однако, помнить, что если вы хотите вернуть не два числа, а, например, два массива, то вам нужно перегрузить для структуры как минимум конструктор копирования и operator=, которые будут заботиться о правильной передаче данных через эту структуру - будут выделять память под массив и копировать в него то, что нужно.

Впрочем, если вашу одну функцию можно естественным образом разбить на две разные, которые друг от друга не зависят, то проще будет сделать именно так. Тем более что каждая будет заниматься только своим делом, что тоже повышает наглядность. Например, шифрование и дешировка прекрасно разбиваются на две отдельные функции.

А вот если у вас в функции одновременно вычисляются два тесно связанных результата, то лучше это делать именно в одной функции. Например, мы считаем векторное произведение двух векторов - глупо было бы в одной функции считать x-координату получающегося вектора, в другой y, в третьей z. Лучше объединить их в структуру (класс) вектора и вычислять одновременно. Или нужно из строки получить отдельно, скажем, все гласные и все согласные буквы. Тогда просто идем по массиву, каждую букву записываем либо в один массив, либо в другой - заполняем их одновременно вместо того, чтобы два раза пробегать по нему в двух разных функциях.

И еще вопрос:
Код:
char __stdcall str(TCHAR*c)
Вам обязательно нужно делать функцию именно __stdcall, а TCHAR* использовать вместо char*. Если необязательно, то первое лучше убрать, а второе - заменить на строку обычных чаров.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как исправить ошибку invalid conversion from const char* to char Ника К Помощь студентам 5 01.06.2012 00:13
невозможно преобразовать 'const char' в 'char triest Помощь студентам 1 10.12.2011 13:41
Проблема с программой. Нельзя преобразовать тип set of char к char Lasso Помощь студентам 5 07.06.2011 12:03
C++ Builder AnsiString преобразовать в Char ROD C++ Builder 3 07.04.2009 12:12
Преобразовать из string в array of char vitalik007 Общие вопросы Delphi 6 07.09.2007 01:15