Prośba o poprawienie procedury readCHAR

0

Siema.
Mam prośbe mógłby ktokolwiek, pomóc mi poprawić poniższą procedurę?
Działa ona tak samo jak read, z taką różnicą, że ma przyjmować tylko pojedynczą literę T lub N.
Procedura spisuję się dobrze dopóki nie klikne 2x enter pod rząd, wtedy wywala program oraz traktuje tak Tblbalblalb jako T tak samo z N,
nie widzi jak gdyby tego drugiego warunku.
Dziękuje bardzo za pomoc.
Kod:

procedure readCHAR(var outp:char); // POPRAWNOSC WPROWADZANYCH ZNAKOW T i N
var
    b: set of 'N'..'T';
    inp:string;
begin
  b:=['T','N'];
  readln(inp);
  while not (inp[1] in b) and (inp[2]=' ') do
     begin
       writeln('Blednie podana wartosc. podaj ponownie');
       readln(inp);
      end;
outp:=inp[1];
end;

Do nadgorliwych modów: “Orthodoxy means not thinking–not needing to think. Orthodoxy is unconsciousness.”

1
function readCHAR(const AcceptedChars:String):Char;
var inp:String;
begin
  while true do
  begin
    ReadLn(inp);
    if (Length(inp)=1)and(Pos(inp[1],AcceptedChars)>0) then
    begin
      Result:=inp[1];
      Exit;
    end;
    WriteLn('Blednie podana wartosc. podaj ponownie');
  end;
end;

Wywołanie:

if readCHAR('TN')='T' then ...
0

Dzięki ale nie działa.
Wywala:

matrixcalculator.pas(40,39) Fatal: Syntax error, ")" expected but "," found

na lini z ifem, chodzi mu o ten przecinek w pos. Używam freepascala

usunięcie cytowania całego poprzedniego posta + dodanie znaczników <quote> dla treści błędu kompilacji - fp

0

Wiec zmień nazwę swojej zmiennej globalnej lub funkcji globalnej (o nazwie Pos) bo ona przesłania pożyteczną funkcje biblioteczną: http://ideone.com/saqJ20

0

Dzięki wielkie działa, często robie ten błąd :(.
W mojej poprzedniej konwencji:

procedure readCHAR(var outp:char); // POPRAWNOSC WPROWADZANYCH ZNAKOW T i N
var
    AcceptedChars,inp:string;
begin
  AcceptedChars:='TN';
  readln(inp);
  while not ((Length(inp)=1)and(Pos(inp[1],AcceptedChars)>0)) do
     begin
       writeln('Blednie podana wartosc. podaj ponownie');
       readln(inp);
    end;
outp:=inp[1];
end;

poprawienie znaczników - fp

0
var
    b: set of 'N'..'T';

Jak już coś to:

var
  B: set of Char = ['T', 'N'];

bo Twój zbiór zawiera wszystkie znaki od N do T, a pewnie nie o to chodziło;


Rozwiązanie z łańcuchem masz wyżej, a poniżej przykład z przekazywanym zbiorem dozwolonych znaków w parametrze oraz wpisywanym poprawnym znakiem do drugiego parametru (tak, jak w Twoim przykładowym kodzie):

type
  TValidChars = set of AnsiChar;

  procedure ReadChar(const AValidChars: TValidChars; var AOutValue: AnsiChar);
  var
    strInput: AnsiString;
  begin
    while True do
    begin
      Write('Enter the character: ');
      ReadLn(strInput);

      if (Length(strInput) = 1) and (strInput[1] in AValidChars) then
      // lub sprawdzanie ze statycznym zbiorem
      // if (Length(strInput) = 1) and (strInput[1] in ['t', 'T', 'n', 'N']) then
      begin
        AOutValue := strInput[1];
        Exit;
      end
      else
        WriteLn('Incorrect character - enter again.'#10);
    end;
  end;

Użycie:

var
  chrInput: AnsiChar;
begin
  ReadChar(['t', 'T', 'n', 'N'], chrInput);

  Write(#10'Entered character: ''', chrInput, '''');
  ReadLn;
end.

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