AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programm Analye

Ein Thema von FACS · begonnen am 9. Aug 2015 · letzter Beitrag vom 9. Aug 2015
Antwort Antwort
FACS

Registriert seit: 9. Aug 2015
1 Beiträge
 
#1

Programm Analye

  Alt 9. Aug 2015, 09:14
Hallo Welt,

habe mal eine Allgemeine Frage zu einem von mir geschriebenen Quellcode:

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Math;

type

  { Trechen_programm }

  Trechen_programm = class(TForm)
    Berechnen_Knopf: TButton;
    Beenden_Knopf: TButton;
    Label2: TLabel;
    Panel1: TPanel;
    s_Eingabe: TEdit;
    Label1: TLabel;
    s_Ausgabe: TEdit;
    procedure Beenden_KnopfClick(Sender: TObject);
    procedure Berechnen_KnopfClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  rechen_programm: Trechen_programm;

implementation

{$R *.lfm}

{ Trechen_programm }

procedure Trechen_programm.FormShow(Sender: TObject);
begin

  rechen_programm.Caption := 'Funktionsberechnung';
  s_Eingabe.Caption := '';
  s_Ausgabe.Caption := '';
  Panel1.Caption := '';
  Berechnen_Knopf.Caption := 'Berechnen';
  Beenden_Knopf.Caption := 'Beenden';

end;

procedure Trechen_programm.Beenden_KnopfClick(Sender: TObject);
begin

  close;

end;

procedure Trechen_programm.Berechnen_KnopfClick(Sender: TObject);
var i, x, z : integer;

begin

  i := 0;
  x := 0;
  z := 0;

  x := StrToInt (s_Eingabe.Text);

  while x <> 1 do begin
     if (x mod 2 = 0) then begin
         x := (x / 2); [B]//Bezüglich dieser Zeile gibt mir Lazarus aus unit1.pas(73,15) Error: Incompatible types: got "Double" expected "LongInt"[/B]
         Panel1.Caption := IntToStr (x);
     end

     else
         x := (x * 3) + 1;
         z := z + 1;
         s_Ausgabe.Text := IntToStr (z);
     end;
end;
end.
Das Programm wurde mit Lazarus entwickelt und nimmt die oben Fettgedruckte Zeile nicht! Wäre super, wenn ich von euch hilfsbereiten Support erhalten würde.
Vielen Dank im Voraus!

Geändert von mkinzler ( 9. Aug 2015 um 14:59 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

AW: Programm Analye

  Alt 9. Aug 2015, 09:54
Hallo FACS...

Willkommen hier
Zitat:
x := (x / 2); //Bezüglich dieser Zeile gibt mir Lazarus aus unit1.pas(73,15) Error: Incompatible types: got "Double" expected "LongInt"
Die Fehlermeldung ist logisch. X ist als Integer (Ganzzahl) deklariert. Mit der Division "könnte" ein Nachkommaanteil herauskommen. Deshalb funktioniert die Zuweisung nicht.
Wenn das Ergebnis grundsätzlich eine Ganzzahl sein soll verwende div statt /.

PS: Und schau dir die Hilfe zu div an damit du verstehst.

PS2: Bitte setze deinen Quelltext in Delphi Tags. (der Button mit dem Helm)
  Mit Zitat antworten Zitat
hanvas

Registriert seit: 28. Okt 2010
166 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Programm Analye

  Alt 9. Aug 2015, 10:05
Hallo

x := (x / 2); //Bezüglich dieser Zeile gibt mir Lazarus aus unit1.pas(73,15) Error: Incompatible types: got "Double" expected "LongInt"
Wenn Du statt / den Operator DIV verwendest sollte alles i.O sein.

Da der Compiler während des Compilierens im Allgemeinen keine Annahme darüber trifft wie das Ergebnis aussieht gibt es häufig zwei Operatoren zur Division. In Delphi wäre das eben / und DIV. Der Operator DIV führt eine Division zweier Ganzzahlen durch und vergisst den Rest, / führt eine normale Division durch und hat einen Rest - das Ergebnis ist eine Fließkommezahl.

Falls Du von C od. C++ kommst, darin unterscheidet sich Pascal von C oder C++. In C artigen Sprachen wird der Operator / sowohl für die ganzzahlige Division wie auch für die normale Division verwendet. Der Unterschied wird durch die Datentypen der beteiligten Operanden bestimmt.

C 3 / 2 Ergebnis ist 1
3 / 2.0 Ergebnis ist 1.5

Delphi 3 DIV 2 Ergebis ist 1
3 / 2 Ergebnis ist 1.5

hth Ha-Jö
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#4

AW: Programm Analye

  Alt 9. Aug 2015, 10:27
Das ganze mal als Aufgabe erfasst:
- mit dem "Ist Mod 2 gleich 0" steht da ja, das nur gerade und somit restlos durch 2 teilbare Zahlen anschließend durch 2 ganzzahlig geteilt werden.
- ganzzahliges teilen geht in Pascal mit "div"
- ganzzahliges teilen von positiven 2er Potenzen geht auch binär mit "shr" und auch ein MOD mit 2er Potenzen geht binär mit "and"

Delphi-Quellcode:
if ((x and 1) = 0) then begin
    x := (x shr 1);
    Panel1.Caption := IntToStr (x);
end
- wenn dir das so seltsam vorkommt.. bist du damit nicht allein und in Pascal muss man das nicht so machen (aber hilft beim Verständnis wie die Ganzzahlen intern gespeichert sind)
- wenn du verstehst warum dies auch funktioniert, dann klappt es auch ganz von alleine mit dem warum fürs "div"
- Funktion als Text: bei geraden Zahlen ist das LSB immer 0 und das Rechtsschieben um 1 entspricht der Division durch 2
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Programm Analye

  Alt 9. Aug 2015, 15:08
Und selbst wenn die Division "aufgehen" sollte ohne Nachkommastellen, bei 4:2 zum Beispiel, wird für dem Comoputer das Ergebnis 1,9999999999999999999999999999999999999 im ungünstigsten Fall sein. (4:2 war nur ein Beispiel zur Verdeutlichung.) Das liegt daran, dass die Umwandlung Dezimal/Binär und Binär/Dezimal nicht immer genau sein kann, da manche Dezimalzahlen nicht 1:1 binär abgebildet werden können.

Aber wie schon gesagt, Delphi erwartet bei der Division mit / eine Fließkommazahl als Ergebnis.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz