Problem z konwertem int to char w ćwiczeniu.

0

Witam.
Uczę się dopiero C++ i mam problem z takim jednym programem.
Ma on za zadanie wyświetlić znak odpowiadający wprowadzonej liczbie i zrobiłem tak

#include <cstdlib>
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

char * check_key(int key);

int main(int argc, char *argv[])
{
    int i;
    cin >> i;
    while(i != 0){
     cout << check_key(i);  
    cin >> i;      
    }

    system("pause");
    return EXIT_SUCCESS;
}

char * check_key(int key){
switch(key){            
 case VK_SPACE:
  return "[SPACE]";    
 break;

 case VK_SHIFT:
  return "[SHIFT]";    
 break;

 case VK_RETURN:
  return "\n[ENTER]";    
 break; 

 case VK_BACK:
  return "[BACKSPACE]";    
 break; 

 case VK_TAB:
  return "[TAB]";    
 break; 

 case VK_LCONTROL:
  return "[L-CTRL]";    
 break; 

 case VK_RCONTROL:
  return "[R-CTRL]";    
 break; 

 case VK_DELETE:
  return "[DEL]";    
 break; 

 case VK_CAPITAL:
  return "[CAPS LOCK]";    
 break; 

 default:
  return key;
 break;            

}          
}

i jak próbuje skompilować to debugger pisze że nie może konwertować z int do char w return key;
czyli jak mam ro zrobić żeby działało ?

0
ProQix Polaczeq napisał(a)
char * check_key(int key)
[...]
return key;

Funkcja przyjmuje int i zwraca char*. Musisz zatem zwrócić właściwy typ.
Jak naprawic program, to już zalezy od tego co chcesz otrzymać. W przypadku nieznanego klawisza możesz zwrócić NULL, przy wywołaniu funkcji sprawdzać czy taki przypadek nie wystapił i odpowiednio reagować. Patrząc jednak na ten kod proponowałbym raczej go napisać porządnie.

0

Nie rozumiem za bardzo... Ty chcesz po prostu wprowadzić cyfrę i otrzymać znak z tablicy ASCII który mu odpowiada?

0

Nie, wątkotwórca używa złych narzędzi.
Jak sama nazwa wskazuje, "cin" (Character INput) jest wejściem znakowym. Klawisze takie jak Alt, Ctrl czy Shift nie generują znaków, gdyż są modyfikatorami. Stąd wywołanie "cin >> i" jest błędne, także z innych powodów.
Zatem fakt, że kompilator się burzy nie ma znaczenia, gdyż program i tak nie będzie robił tego, czego autor oczekuje. Pod Windows AFAIR wcisnięcia klawiszy generują eventy i to ich trzeba użyć, a nie wejścia znakowego.

0

Rozumiem dzięki za pomoc.

0

O, uwaga! Ujemny ma rację.
Jeśli celem Twojego programu było wypisanie na ekranie nazwy klawisza, którego numer VK wpiszesz z klawiatury (jakąś liczbę), to wtedy nie korzystaj z eventów, tylko w default zwracaj np. "UNKNOWN" (chociaż coś mnie tu zęby bolą...).
Jeśli natomiast chcesz, żeby Ci program napisał na ekranie "wcisnąłeś Alt" kiedy naciśniejsz klawisz Alt, to nie tędy droga.

0

Może to trochę banalne i zapewne na około, ale na pewno działa;p

void znak(int i)
{
    if(i>32&&i<127)
    {
        cout<<(char)i;
    }
    else
    {
        switch(i)
        {
            case 32:
                    cout<<"spacja";
                    break;

            case 16:
                    cout<<"shift";
                    break;

            case 13:
                    cout<<"enter";
                    break;

            case 8:
                    cout<<"backspace";
                    break;

            case 9:
                    cout<<"tab";
                    break;

            case 17:
                    cout<<"ctrl";
                    break;

            case 47:
                    cout<<"delete";
                    break;

            case 20:
                    cout<<"caps lock";
                    break;

            default:
                    cout<<"znaku nie mozna wyswietlic";
                    break;
        }
    }
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0