Delphi-PRAXiS

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 ;)

lun87 20. Nov 2006 11:29

Re: Arry Problem ! Benötige Hilfe...
 
Ich kann leider nicht DezinHex verwenden, da wir mit div und mod arbeiten sollen. Mein Prog funktioniert auch soweit, bis auf das er die Werte aus dem Feld falsch ausgibt bzw nen Fehler... Ich habe echt keine Ahnung mehr.

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 DezinDual (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, erg : integer;
    n : array of string;
begin
  ewert := strtoint(zahledt.text);
  //DezinDual (ewert);
  DezinDual (ewert);
  //ausgabepanel.Caption := inttostr(erg);
  ausgabepanel.caption := inttostr(Feld[n]); ----> hier ist der Fehler = Array Type required... Hab ich in der Funktion u. Proc
  //ausgabepanel.caption := IntToHex(ewert,4);
end;

end.


Werd einfach weiter probieren bis es funzt.

mfg Lun87

NormanNG 20. Nov 2006 11:40

Re: Arry Problem ! Benötige Hilfe...
 
Hi,

Corpsman hat doch oben schon den Fehler beschrieben. Du hast eine Funktion, verwendest aber das Ergebnis nicht. Du verwendest lokale Variablen die den gleichen Namen haben. Diese sind aber "lokal" zur jeweilien Methode und haben, außer das sie den gleichen Namen tragen, nichts miteinander zu tun.

lun87 20. Nov 2006 11:52

Re: Arry Problem ! Benötige Hilfe...
 
so langsam verzweifel ich hiermit...-.- irgendwie steig ich da net hinter.. das was ihr mir sagt verstehe ich aber ich verstehe nicht warum er diese lokale variable (Feld) in der ja ALLES gespeichert ist an eine andere variable übergibt die dann eine ausgabe ermöglicht... Ist es nicht möglich in der function ein FEld zu haben was meine Werte speichert und die ich dann mittels einer anderen variable ausgebe?

Delphi-Quellcode:
function DezinDual (var ewert, ergebnis : 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;
 Feld[n] := ergebnis;
end;


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

end.

mfg
Lun87

mkinzler 20. Nov 2006 12:05

Re: Arry Problem ! Benötige Hilfe...
 
Der array ist ja nur lokal definiert und man kann auf ihn nur in dem einen Durchlauf der Funktion zugreifen.

lun87 20. Nov 2006 12:23

Re: Arry Problem ! Benötige Hilfe...
 
Jut gut das wusste ich nicht, dachte man kann von überall zugreifen. Naja dann werd ich das Prog löschen und anders versuchen... hab ja mehrere Anläufe... (inttoHex etc.) entspricht zwar nicht meiner übung die ich haben wollte aber naja... deswegen gibt der nur eine zahl aus...

Habt ihr vielleicht einen Typ für Anfänger? Wie sollen sie am besten rangehen an Delphi? Gibt es Übungen im Netz mit Lösung ?
Ich danke Euch bis hierhin

mfg
Lun87


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr.

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