Char in Int delphi

...komplette Frage anzeigen

4 Antworten

also ich habe mir dein Listing durchgelesen. Du schreibst, dass bei der Zeile:

y[j]:=x[c];

der Compiler den Fehler: "Incompatible Typen char und int" meldet.

y ist of Integer und x ist of Integer. Die Typen sind identisch.

y hat als Indextypen integer und x hat als Indextypen char.

deine Laufvariablen sind richtig und der Elementtyp beider Arrays ist identisch also auch Zuweisungskompatibel.

Die Fehlermeldung kann nicht von dieser Zeile Code stammen.

ich habe folgende Funktion bei mir erfogreich kompiliert:

procedure dummy;
var
  x: array['a'..'z'] of integer;
  y: array[1..26] of integer;
  c: char;
  i,j,p: integer;
begin
   for c:='a' to 'z' do x[c]:=0;
   for i:= 1 to 26 do y[i]:=0;
   j := 1;
   for c:='a' to 'z' do
     begin
          y[j]:=x[c];
          j:=j+1;
     end;
end;

also schau bitte nochmal genau, welcher Fehler wo gemeldet wird.

gruss, dj

DataJockey 21.03.2012, 12:34

ich habe sogar mal deinen Code durch meinen Compiler gejagt. Kein Problem. folgender Output bei mir:

[DCC Hinweis] Unit1.pas(44): H2077 Auf 'i' zugewiesener Wert wird niemals benutzt
[DCC Warnung] Unit1.pas(92): W1050 WideChar in Set-Ausdrücken auf ByteChar verkürzt.  Ziehen Sie die Verwendung der Funktion 'CharInSet' aus der Unit 'SysUtils' in Betracht.
[DCC Hinweis] Unit1.pas(94): H2077 Auf 'i' zugewiesener Wert wird niemals benutzt
[DCC Warnung] Unit1.pas(98): W1036 Variable 'j' ist möglicherweise nicht initialisiert worden
Erfolg

die WideChar in Set Meldung kannst du ignorieren. ist nen XE2 Ding.

gruss, dj

0
NatzerJony 22.03.2012, 13:33

du hast recht :o doch vorgestern, war dort der fehler. naja kann vielleicht damit zusammen hängen das ich das vorher nicht abgespeichert habe, da hab ich bei delphi schon die dollsten sachen erlebt.

Nun spuckt er aber bei dieser Zeile eine Exception aus, der Klasse EAccessViolation.

0
DataJockey 22.03.2012, 16:48
@NatzerJony

da greifst du neben den array. wenn dein Code noch der Selbe ist, dann musst du j initialisieren. in deinem Fall auf 1, wie in meinem Beispielcode.

gruss, dj

0

Char = Buchstabe
Integer = Ganzzahl

Das ganze ist nicht wirklich kompatibel, es sei denn die Buchstaben sind Zahlen :)
Oder möchtest du den "Zahlenwert" des Buchstabens in das Integer-Array übertragen?

Dory1 20.03.2012, 20:51

Kannst du dein Problem noch etwas genauer beschreiben?

0
NatzerJony 20.03.2012, 20:55
@Dory1

hab bei der antwort davor meinen bisherigen code gepostet.

0
Dory1 20.03.2012, 21:01
@NatzerJony

Die Prozeduren sind total durcheinander, kann man kaum lesen. Was versuchst du da eigentlich genau?

0
NatzerJony 20.03.2012, 21:05
@Dory1

ich versuche ein programm, dass eine textdatei ausliest udn die anzahl der darin stehenden buchstarben in einem array ausgibt. das geht auch. jetz will ich das die buchstarben, die am meisten vorkommen zuerst stehen. dazu wollte ich dies mit quicksort sotieren. da tritt das problem in der zeile auf: y[j]:=x[c]; Incompatible Typen char und int.

tut mir leid, aber hier kann man nur jeweils eine zeile als code anzeigen lassen

0

Also hab glaub ich den Fehler.

x: array['a'..'z'] of integer; 
y: array[1..26] of integer; 

In x stehen so nur Character, und daher kommt dann der Fehler ;)

NatzerJony 20.03.2012, 21:28

ja das hab ich dann auch mal gemerkt :) aber wie bekomm ich es jetz hin, dass ich den wert, der meinetwegen 'b' zugeordnet wird, da das ja ein int wert sein muss, y zugeordnet.?

0
k0b3r 22.03.2012, 11:13
@NatzerJony

es gibt die Funktion ord() mit der bekommst du von jedem character die Ordinalzahl, also die Ordnungszahl als Integer zurück. Damit kannst du dann auch in Delphi character mit Integren vergleichen.

0

kannst du vlt. mal n bisschen was an Code posten, was du bisher hast? Bin zwar schon länger mit Delphi fertig aber ich schau gern mal drüber ;)

Wenn du nur den Ordinalwert des Characters haben willst, bekommst du den über die ord()-Methode.

NatzerJony 20.03.2012, 20:55

ich kann hier nur eine zeile in der code ansich. aber ich kann das gerne so dir zeigen:

var Form1: TForm1; quelle: string; x: array['a'..'z'] of integer; y: array[1..26] of integer;

procedure TForm1.Button1Click(Sender: TObject); var f: textfile; i: integer; begin i:=1; if OpenDialog1.Execute then begin form1.memo1.clear; AssignFile(f, OpenDialog1.FileName); Reset(f); Readln(f, quelle); Memo1.Lines.Add(quelle); while not eof(f) do begin Readln(f, quelle); Memo1.Lines.Add(quelle); end; CloseFile(f);

    end

end;

procedure TForm1.Button2Click(Sender: TObject); var c: char; i,j,p: integer;

procedure quick(l,r:integer); var key,ls,rs,hilf:integer;

begin //Quick

ls:=l; rs:=r; key:=y[(l+r) div 2]; repeat while y[ls]key do rs:=rs-1; if ls<=rs then begin hilf:=y[ls]; y[ls]:=y[rs]; y[rs]:=hilf; ls:=ls+1; rs:=rs-1 end until ls>rs; if l<rs then quick(l,rs); if ls<r then quick(ls,r) end; //Quick

begin form1.Memo1.Text := StringReplace(form1.Memo1.Text,sLineBreak,' ',[rfReplaceAll]); quelle:=form1.memo1.Text; for c:='a' to 'z' do x[c]:=0; for i:=1 to length(quelle) do if quelle[i] in ['a'..'z'] then x[quelle[i]]:=x[quelle[i]]+1; i:=0;

for c:='a' to 'z' do begin y[j]:=x[c]; j:=j+1; end;

  quick(1,26);

(*for c:='a' to 'z' do begin form1.StringGrid1.Cells[i,0]:=c; form1.StringGrid1.Cells[i,1]:=inttostr(x[c]); i:=i+1; end; *)

 for p:=1 to 26 do
          form1.StringGrid1.cells[0,p-1]:=inttostr(y[p]);

end;

end.

ich hoffe das hilft.

0
k0b3r 20.03.2012, 21:09
@NatzerJony

sorry aber das kann man nicht lesen, kannst du es bitte nochmal neu posten? Wenn du es kopiert hast einfach alles markieren und dann auf das „Codebeispiel einfügen“ drücken... dann geht es

0
NatzerJony 20.03.2012, 21:24
@k0b3r
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Button2: TButton;
    Edit2: TEdit;
    StringGrid1: TStringGrid;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  quelle: string;
  x: array['a'..'z'] of integer;
  y: array[1..26] of integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var f: textfile;
    i: integer;
begin
     i:=1;
     if OpenDialog1.Execute
        then begin
            form1.memo1.clear;
            AssignFile(f, OpenDialog1.FileName);
            Reset(f);
            Readln(f, quelle);
            Memo1.Lines.Add(quelle);
            while not eof(f) do
                begin
                    Readln(f, quelle);
                    Memo1.Lines.Add(quelle);
                end;
            CloseFile(f);

        end
end;

procedure TForm1.Button2Click(Sender: TObject);
var c: char;
    i,j,p: integer;

procedure quick(l,r:integer);
var  key,ls,rs,hilf:integer;

begin //Quick

  ls:=l; rs:=r; key:=y[(l+r) div 2];
  repeat
    while y[ls]<key do ls:=ls+1;
    while y[rs]>key do rs:=rs-1;
    if ls<=rs then begin
                     hilf:=y[ls]; y[ls]:=y[rs]; y[rs]:=hilf;
                     ls:=ls+1; rs:=rs-1
                   end
  until ls>rs;
  if l<rs then quick(l,rs);
  if ls<r then quick(ls,r)
end;  //Quick


begin
    form1.Memo1.Text := StringReplace(form1.Memo1.Text,sLineBreak,' ',[rfReplaceAll]);
    quelle:=form1.memo1.Text;
   for c:='a' to 'z' do
    x[c]:=0;
   for i:=1 to length(quelle) do
        if quelle[i] in ['a'..'z']
        then
              x[quelle[i]]:=x[quelle[i]]+1;
        i:=0;

   for c:='a' to 'z' do
     begin
          y[j]:=x[c];
          j:=j+1;
     end;

      quick(1,26);


   (*for c:='a' to 'z' do
      begin
      form1.StringGrid1.Cells[i,0]:=c;
      form1.StringGrid1.Cells[i,1]:=inttostr(x[c]);
      i:=i+1;
      end; *)

     for p:=1 to 26 do
              form1.StringGrid1.cells[0,p-1]:=inttostr(y[p]);

end;

end.
0

Was möchtest Du wissen?