Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Array Problem ! Benötige Hilfe... (https://www.delphipraxis.net/81045-array-problem-benoetige-hilfe.html)

lun87 19. Nov 2006 19:27


Array Problem ! Benötige Hilfe...
 
Delphi-Quellcode:
unit UZahlensysteme;

interface

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

type
  TForm1 = class(TForm)
    zahledt: TEdit;
    ausgabepanel: TPanel;
    RadioGroup1: TRadioGroup;
    RadioGroup2: TRadioGroup;
    wandelnbutton: TButton;
    clearbutton: TButton;
    procedure clearbuttonClick(Sender: TObject);
    procedure wandelnbuttonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.clearbuttonClick(Sender: TObject);
begin
  zahledt.text := ' ';
  ausgabepanel.caption := ' ';
end;


function DezinHex (var ewert : integer):integer;
var ergebnis, n : integer;
    Feld : array [1..n] of integer;               -----> Constand expression expected
begin
  n := 1;
  repeat
    ergebnis := ewert div 2;
    Feld[n] := ewert mod 2;
    inc(n);
  until (ergebnis <= 0);
  ewert := ergebnis;
end;


procedure TForm1.wandelnbuttonClick(Sender: TObject);
var ewert : integer;
begin
  ewert := strtoint(zahledt.text);
  DezinHex (ewert);
  ausgabepanel.caption := inttostr(ewert);
end;

end.
Mein Programm soll folgendes bewerkstelligen:

Es soll (1.Version) eine Dezimalzahl in eine Hexadezimalzahl umwandeln. Es soll den Eingabewert durch 2 teilen bis ergebnis = 0 ist und dort dann aufhören. Dabei soll er wiederum auch den eingabewort mod 2 nehmen und die 1 oder 0 in dem Fall in ein Feld packen... das genauso lange bis until... eintritt. Danach möchte ich den Hexadezimal-Code ausgeben. Worin liegt mein Problem? :gruebel:

mfg Lun87

[edit=SirThornberry]Delphi-Tags gesetzt - Mfg, SirThornberry[/edit]
[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

mkinzler 19. Nov 2006 19:40

Re: Arry Problem ! Benötige Hilfe...
 
Delphi-Quellcode:
 Feld : array [1..n] of integer; -----> Constand expression expected
Das geht so nicht . Versuche mal
Delphi-Quellcode:
 Feld : array of integer;
...
setLength( Feld, n);

Corpsman 19. Nov 2006 19:46

Re: Arry Problem ! Benötige Hilfe...
 
was mkinzler versucht zu sagen ist:

Delphi-Quellcode:
function DezinHex (var ewert : integer):integer;
var ergebnis, n : integer;
Feld : array of integer;
begin
n := 0;// Alle Dynamischen Array's fangen mit 0 an.
repeat
setlength(Feld,high(Feld)+2);
ergebnis := ewert div 2;
Feld[n] := ewert mod 2;
inc(n);
until (ergebnis <= 0);
ewert := ergebnis;
end;
Allerdings solltest du deiner Function einen Rückgabe wert Geben. Das machst dann mit Result :=

und auf dein Array must ja auch noch Lesend zugreifen, sonst bringt es dir ja gar nichts das du es gebaut hast.

marabu 19. Nov 2006 19:49

Re: Arry Problem ! Benötige Hilfe...
 
Herzlich willkommen in der Delphi-PRAXiS, lun87.

Wenn du im Beitragseditor deinen Quelltext markierst und dann auf den Button "Delphi" klickst, dann sieht dein Code viel schöner aus.

Deine Funktion DezInHex() könnte eine bessere Signatur vertragen:

Delphi-Quellcode:
 function DezInHex(ewert: Cardinal): String;
Cardinal ist ein vorzeichenloser Typ (gibt es den in D6 bereits?) und der Rückgabewert ist besser eine Zeichenkette.

Freundliche Grüße vom marabu

Chemiker 19. Nov 2006 19:57

Re: Arry Problem ! Benötige Hilfe...
 
Hallo lun87,


Mit der function IntToHex kann man Integer-Werte in Hex-Zahlen konvertieren.
Delphi-Quellcode:
Label1.Caption:= IntToHex(1000,4);
Das Ergebnis ist '03E8' = 1000 (Integer-Zahl)
Die 4 bedeutet die Anzahl-Zeichen die zurückgegeben werden.

Bis bald Chemiker

[edit=SirThornberry]Delphi-Tags gesetzt - Mfg, SirThornberry[/edit]

lun87 19. Nov 2006 20:08

Re: Arry Problem ! Benötige Hilfe...
 
Delphi-Quellcode:
function DezinHex (var ewert : integer):integer;
var ergebnis, n : integer;
Feld : array of integer;
begin
n := 0;
repeat
setlength(Feld,high(Feld)+2);
result := ewert div 2;
ergebnis := result;
Feld[n] := ewert mod 2;
inc(n);
until (ergebnis <= 0);
ewert := ergebnis;
end;
Das Problem ist wir sollen das mit div und mod machen. Meine andere Frage wäre jetzt.. der hat in ergebnis immer 2, wie sage ich ihm
das er nach einem durchlauf jez das "neue" ergebnis nimmt also wenn ich 40 in edit eintrage (40/2 = 20) dass er dann mit 20 weiter arbeitet?

mfg
Lun87

PS: Ich bin neu in Delphi, hoffe Ihr nehmt mir das nicht übel :(

Corpsman 19. Nov 2006 20:37

Re: Arry Problem ! Benötige Hilfe...
 
Ich hab so das gefühl das ich hier deine Hausaufgaben löse ...

Delphi-Quellcode:
function DezinHex (ewert : integer):String;
var Erg:String;
begin
  erg :='';
  while ewert > 0 do begin
    erg := inttostr(ewert mod 2) + erg;
    ewert := ewert div 2;
  end;
  result:= erg;
end;
Der Code ist aber Blind gecoded. Mit etwas Glück sind noch genug Fehler drin so das sich noch ein kleiner Lerneffeckt einstellt ;)

[Edit]

Ach ja fast vergessen. Für negative Eingaben geht das natürlcih nicht ;)

das macht man dann in dem man vom Ergenbiss das 2 er Komplement bildet und Binär 1 Addiert.

d.h. du kannst dann noch jede Menge Logik einbauen so das Ewert immer >= 0 ist ;)

marabu 19. Nov 2006 20:52

Re: Arry Problem ! Benötige Hilfe...
 
Den Vorsatz VAR bei deinem Parameter ewert brauchst du nicht, da du dort ja nichts zurückgeben willst. Hexadezimale Zahlen kannst du nur als String darstellen, genauso wie dezimale Zahlen und jede andere auch - der Computer arbeitet intern nur mit den dualen Zahlen in Binärdarstellung. Hexadezimal sind Zahlen zur Basis 16. Durch deine Rechenoperationen div 2 und mod 2 liegst du da aber etwas daneben.

Delphi-Quellcode:
function IntToDual(i: Cardinal): String;
const
  BASIS = 2;
  DIGITS: String[BASIS] = '01';
begin
  Result := '';
  repeat
    result := DIGITS[Succ(i mod BASIS)] + Result;
    i := i div BASIS;
  until (i = 0);
end;
Mit ein paar Änderungen kannst du das an die Basis 16 anpassen. Allerdings musst du es morgen auch noch erklären können...

Gute Nacht

lun87 19. Nov 2006 21:21

Re: Arry Problem ! Benötige Hilfe...
 
Delphi-Quellcode:
unit UZahlensysteme;

interface

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

type
  TForm1 = class(TForm)
    zahledt: TEdit;
    ausgabepanel: TPanel;
    RadioGroup1: TRadioGroup;
    RadioGroup2: TRadioGroup;
    wandelnbutton: TButton;
    clearbutton: TButton;
    procedure clearbuttonClick(Sender: TObject);
    procedure wandelnbuttonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.clearbuttonClick(Sender: TObject);
begin
  zahledt.text := ' ';
  ausgabepanel.caption := ' ';
end;

{function DezinDual (var ewert : integer):String;
var n, divwert, modwert : integer; Feld : array of integer;
begin
 n := 0;
while ewert > 0 do
 begin
  setlength(Feld,high(Feld)+2);
  divwert := ewert div 2;
  ewert := divwert;
  modwert := ewert mod 2;
  Feld[n] := modwert;
  inc(n);
 end;
end; }

function DezinHex (ewert : integer):String;
var Erg:String;
begin
  erg :='';
  while ewert > 0 do begin
    erg := inttostr(ewert mod 2) + erg;
    ewert := ewert div 2;
  end;
  result:= erg;
end;

procedure TForm1.wandelnbuttonClick(Sender: TObject);
var ewert, ergebnis, Feld, n, erg : integer;
begin
  ewert := strtoint(zahledt.text);
  //DezinDual (ewert);
  DezinHex (ewert);
  ausgabepanel.Caption := inttostr(erg);
  //ausgabepanel.caption := inttostr(Feld[n]);
  //ausgabepanel.caption := IntToHex(ewert,4);
end;

end.
mein letzter stand der dinge, gehe nun ins bett... hab kopfschmerzen
danke euch alle

mfg
Lun87

Corpsman 20. Nov 2006 08:24

Re: Arry Problem ! Benötige Hilfe...
 
DezinHex ist eine Function wenn du die keiner Variable zuweist bringt dir der Aufruf gar nichts.


Delphi-Quellcode:
  ausgabepanel.Caption :=  DezinHex (ewert);
Ist da deutlich besser ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz