2016-01-12 2 views
0

Я пытаюсь передать данные в функцию и записать ее в массив, но я продолжаю получать ошибку, которая указывает «неверное преобразование из« char »в« char ».« Я понимаю, что char [] является функцией и char * является указателем, но, насколько мне известно, я не объявлял ни один из элементов в качестве указателя.непреднамеренно объявленный указатель

У меня есть два вектора заявил:

std::vector <char> broken(message.begin(), message.end()); 

std::vector <char> encoded(50); 

И я пытаюсь пройти первый вектор с помощью функции и добавить результат на второй функции следующим образом:

for (index = 0; index <= length - 1; index++) 
    { 
     encoded[index] = cipher(broken[index], length); 
    } 

При этом, как функция:

char cipher(char broken[], int length) 
{ 
char index; // declare index 

if(broken[index] < 123 && broken[index] > 96) // if characters are lowercase, 
{            // make them uppercase 
    broken = broken - 32; 
} 

for(index = 0; index <= length - 1; index ++) 
{ 
      broken[index] = broken[index] * (2/3); 
      broken[index] = broken[index] - 12; 
      broken[index] = broken[index]^2; 
} 

cout << "Message encoded." << endl; 

system ("pause"); 

return(broken[index]); 
} 

Сообщение об ошибке указывает, что программа принимает e этих элементов как указатель, но я не знаю, почему.

Используемый компилятор Bloodshed Dev C++ 4.9.9.2. Я был бы признателен за любой свет, который любой может пролить на это, так как я первый студент C++ и совершенно новичок в этом.

Спасибо!

+1

'cipher' выглядит, как он хотел, чтобы иметь возможность перебирать 'broken' (он не уйдет далеко от неинициализированного« индекса »), но вы вызываете его так, как будто он принимает один символ« char »- читает сообщение об ошибке. – LogicStuff

+7

"* Я понимаю, что char [] является функцией, а char ** - указателем" - Что? (и на стороне заметки, кто-нибудь знает, как правильно помещать звездочки в комментарии без выделения курсивом или унитализацией и без создания блока кода?) –

+1

И вы не будете вводить символ ** s ** в верхнем регистре с 'if'. – LogicStuff

ответ

1

char broken[] говорит, что broken является указателем. Это потому, что почти во всех контекстах имя массива распадается на указатель на его первый элемент. Вот где компилятор жалуется. Функция

char cipher(char broken[], int length); 

занимает char* и int. Это называют так:

cipher(broken[index], length) 

, который пытается передать char в качестве первого аргумента, где char* ожидается.

1

То, что вы хотели написать, вероятно, является функцией, которая кодирует один символ:

char cipher(char brokenChar) 
{ 

if(brokenChar < 123 && brokenChar > 96) // if characters are lowercase, 
{            // make them uppercase 
    broken = broken - 32; 
} 

//there is only one char: 
    brokenChar = brokenChar * (2/3); 
    brokenChar = brokenChar - 12; 
    brokenChar = brokenChar^2; 


return brokenChar; 
} 

Теперь вы можете закодировать все ваше сообщение с циклом:

std::vector <char> encoded(message.size());//maybe there are more than 50 characters 

for (index = 0; index <= message.size() - 1; index++) 
    { 
     encoded[index] = cipher(message[index]); 
    } 

Однако шифр не делает что вы ожидаете от этого:

  1. brokenChar = brokenChar * (2/3) дает всегда 0, потому что 2/3 равно нулю (вы можете ввести brokenChar*2/3, который, вероятно, что вы хотите)
  2. brokenChar = brokenChar^2 не означает brokenChar*brokenChar (я предполагаю, что это ваше намерение), но побитовое xor (содействие brokenChar к int, кстати), так что шифр не будет всегда возвращать -10 независимо от того, что вход является.

И если вы хотите, чтобы расшифровать ваше сообщение, ваша функция кодирования должна быть биективен, что это не даже если операции будут работать как задумано

+0

Я решил все другие проблемы кодирования и математики, но вы правы: функция декодирования просто не работает. Как я могу изменить исходную функцию, чтобы сделать ее биективной так, чтобы ее можно было декодировать? – Timpanus

+0

@Timpanus Существует множество возможностей: например, можно выбрать два символа (например, 'sum = 'h'' и' key =' Z'') и вычислить 'encoded = (orig + sum)^key'. А чем 'decoded = (закодированный^ключ) -sum'. – ead

Смежные вопросы