• Ошибка в блоке try-catch, почему возникает данная проблема? Как исправить баг?

    @kostyakos52000 Автор вопроса
    Roman, спасибо за совет, однако данный способ здесь не совсем подходит, так как при вводе нескольких чисел, например 6 ааа 7 ааа 8, будет возвращено первое число и со стороны пользователя не совсем понятно что произошло
    решение через stoi
    int inp_int()
    {
    	string str;
    	int number; //init
    	cout << "Введите целое число: ";
    try
    {
    	cin >> str;
    	number = stoi(str);
    	if (!number)
    		throw NULL;
    }
    catch (...)
    {
    	cout << "Ошибка";
    	return inp_int();
    }
    cin.clear(); // очистка состояния потока
    cin.ignore(INT_MAX, '\n');
    return number;
    }


    также, пока разбирался с stoi, практически решил проблему вопроса(добавил очистку потока ввода):
    исправленный код
    int inp_int()
    {
    	int number; 
    	cout << "Введите целое число: ";
    	try
    	{
    		cin >> number;
    		if (cin.fail())
    			throw NULL;
    	}
    	catch (...)
    	{
    		cin.clear(); // очистка состояния потока
    		cin.ignore(INT_MAX, '\n');
    		cout << "Ошибка";
    		return inp_int();
    	}
    	cin.clear(); // очистка состояния потока
    	cin.ignore(INT_MAX, '\n');
    	return number;
    }


    однако осталась небольшая проблема(при вводе числа с последующими символами программа отрабатывает)
    скриншот
    5cd887b8edc85813343854.jpeg
  • Почему не компилируется? Что значит 27d и откуда оно берётся?

    @kostyakos52000 Автор вопроса
    pfemidi, спасибо за ответ, всё получилось.
    если вдруг кому-то пригодится, то прикладываю:
    исправленный код
    <b>a dw 30 ; test</b>
    ...
    some code
    ...
    	;ввод в переменную кода клавиши
    	mov ah,0 ;ожидание нажатия клавиши 
    	int 16h
    	cmp al,27d ;проверка кода клавиши ESC
    	je endprg_; 
    <b>	mov byte ptr [a],al      ;debug but must work</b>
    	;вычисление формулы периода
    	mov ax, a
    	add ax, 50
    	mov bl, 2
    	div bl
    	mov time, ax
    	mov di, 200
    	mov	bx, time
    	call sound

    полный код программы
    .286 
    	.model	small
            .stack 256h
            .data
    
    	
    
    msg label byte ;стуктура для ввода символов с клавиатуры
    maxnum db 6 ; переменная для перевода символов в число
    reallen db (?)
    numfld db 6 dup (?)
    x dw ?
    mult10 dw 1
    
              
    txt db 'введите тон звучания ',10,13,'$'
    txt1 db 'введите длительность звуания' 
    a dw 30 ; test
    ton  dw  200 ; test
    time dw 100
    
            .code
    asbin proc
      mov MULT10,0001
      mov x,0
      mov cx,10
      lea si,numfld-1
      mov bl,reallen
      sub bh,bh
    
    b20:
      mov al,[si+bx]
    	and ax,000fh
    	mul MULT10
    	add X,ax
    	mov ax,MULT10
    	mul cx
    	mov MULT10,ax
    	dec bx
    	jnz b20
    	ret
    asbin endp 
    
    sound proc
    	mov 	al,0B6h  ;загрузка управлющего слова в  таймер
    	out	43h,al   ;
    	mov	dx,0014h ; задание мах периода звука
    	mov	ax,4F38h
    
    
    	div	di       ; вычисление фактиеского преиода звука
    	out	42h,al   ;загрузка младшего байта периода звука в таймер
    	mov	al,ah
    	out	42h,al   ; загрузка старшего 
    	in	al,61h  ;чтение порта состояния динамика
    	mov	ah,al   ;сохраниение значение порта состояния в 
    	or	al,3     ;включение звука установкой 2х младших бит в единицу
    	out	61h,al  ;динамик начинает звучать
    
    l1:	mov	cx,2801h  ;задержка в 1 млсек
    l2:	loop	l2  ;цикл задержки
    	
    	dec	bx ;уменьшение длительности звучания на 1 дискрету !!!делаем звук бесконечным, нужно добавить выход по нажатию клавиши
    	
    	jnz	l1   ;цикл отработки длительности звучания динамика
    	mov	al,ah  ;выключение звука от динамика
    	out	61h,al
    ret
    sound endp
    
    main	proc	far
    	pusha
    
    ;mov ax,@data
    ;mov ds,ax
    ;mov ah,9
    ;lea dx,txt1
    ;int 21h
    
    
    ;mov ah,0ah ; ввод символов с клавиатуры в буфер msg
    ;lea dx,msg ; .
    ;int 21h ;    .
    ;call asbin ; преобразование символов в число
    ;mov ax, x ;ввод переменной а
    ;mov a,ax
    
    
    
    	
    
    fill:
    	;ввод в переменную кода клавиши
    	mov ah,0 ;ожидание нажатия клавиши 
    	int 16h
    	cmp al,27d ;проверка кода клавиши ESC
    	je endprg_; 
    	mov byte ptr [a],al      ;debug but must work
    	;вычисление формулы периода
    	;mov byte ptr ax, [a]
    	mov ax, a
    	add ax, 50
    	mov bl, 2
    	div bl
    	mov time, ax
    	mov di, 200
    	mov	bx, time
    	call sound
    	;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    	;...
    	;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    	loop fill
    endprg_:	
    	popa        ;восстановление из стека регистров 
             mov ah,4ch  ; возврат в ОС
             int 21h
    	
     main	endp
    	end main

    задание которое выполняет данный код

    составить программу на ассемблере для генерации звуковых сигналов, период которых вычисляется по формуле T = (a+5)/2*0.01 c. Переменная "a" определяется кодом нажатия клавиши. Прерывание программы по Esc.
  • Почему не компилируется? Что значит 27d и откуда оно берётся?

    @kostyakos52000 Автор вопроса
    спасибо за ответ, однако при написании:
    a db 30 ; test
    программа не компилируется
  • Как корректно заполнить бинарное дерево, если ключи совпадают?

    @kostyakos52000 Автор вопроса
    res2001, номер поезда мне кажется будет подходящим ключом, хотя ключом может быть любое поле