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