AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Inkompatible Typen: lokales dynamisches Array und Integer??
Thema durchsuchen
Ansicht
Themen-Optionen

Inkompatible Typen: lokales dynamisches Array und Integer??

Ein Thema von gordon freeman · begonnen am 25. Mär 2005 · letzter Beitrag vom 25. Mär 2005
Antwort Antwort
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#1

Inkompatible Typen: lokales dynamisches Array und Integer??

  Alt 25. Mär 2005, 12:07
Hi Leute,
warum bekomme ich bei dieser Procedure eine Meldung, dass inkompatible Typen vorliegen:

Delphi-Quellcode:
procedure TForm1.Primfaktoren(Zahl:integer;var Faktoren:array of integer);
var teiler, zaehler, i : integer;
begin
repeat
  SetLength(Faktoren,0); //<- Hier taucht die Meldung einmal auf
  teiler:=0;
  repeat
    teiler := teiler +1;
    zaehler:=0;
    for i:=1 to teiler do
      if teiler mod i = 0 then
        zaehler := zaehler + 1;
  until
    (zahl mod teiler = 0) and (zaehler = 2);
    zahl := zahl div teiler;
    setLength(Faktoren,length(Faktoren)+1); //<- Hier nochmals
    Faktoren[length(Faktoren)] := teiler;
until
  zahl = 1;
end;

Die Funktion soll die übergebene Zahl in ihre Primfaktoren aufteilen und diese Primfaktoren dann in einen Array schreiben, der zurückgegeben wird. Aufrufen tu ich die Prozedur folgendermaßen:

Delphi-Quellcode:
var X: array of integer;

(...)

procedure TForm1.Button1.Click(Sender:TObject);
begin
Primfaktoren(132,X);
end;

(...)

end.

//EDIT1: Es sollte SetLength(Faktoren,0); heißen, voher stand statt 0 ein i!
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Inkompatible Typen: lokales dynamisches Array und Integ

  Alt 25. Mär 2005, 12:12
Vielleicht hast du die Variable Faktoren irgendwo anders schon deklariert?
Benjamin
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Inkompatible Typen: lokales dynamisches Array und Integ

  Alt 25. Mär 2005, 12:16
Das Problem ist, dass die Variable i zu diesem Zeitpunkt noch keinen Wert zugewiesen bekommen hat, sie ist also faktisch undefiniert. Da steht höchstens irgendein Wert drin, der vorher an dieser Stelle im Speicher stand. Und das kann auch ein negativer Wert sein, und deswegen wird der Compiler sich wohl beschweren.

MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Inkompatible Typen: lokales dynamisches Array und Integ

  Alt 25. Mär 2005, 12:16
du kannst das ganze so lösen:
Delphi-Quellcode:
type
  TDynArr = Array of Integer;
[...]
procedure TForm1.Primfaktoren(Zahl:integer;var Faktoren: TDynArr);
begin
[...]
dann kommt die meldung nicht mehr...
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Inkompatible Typen: lokales dynamisches Array und Integ

  Alt 25. Mär 2005, 15:16
Zitat von BenjaminH:
Vielleicht hast du die Variable Faktoren irgendwo anders schon deklariert?
Nein, hab das ganze in einem extra Programm ohne irgendwas anderes getestet, selber Fehler!

Zitat von Binärbaum:
Das Problem ist, dass die Variable i zu diesem Zeitpunkt noch keinen Wert zugewiesen bekommen hat, sie ist also faktisch undefiniert. Da steht höchstens irgendein Wert drin, der vorher an dieser Stelle im Speicher stand. Und das kann auch ein negativer Wert sein, und deswegen wird der Compiler sich wohl beschweren.
Hab mich vertippt, hab's oben geändert, statt i sollte da 0 stehen!

Zitat von Sir Thornberry:
du kannst das ganze so lösen:
Delphi-Quellcode:
type
  TDynArr = Array of Integer;
[...]
procedure TForm1.Primfaktoren(Zahl:integer;var Faktoren: TDynArr);
begin
[...]

dann kommt die meldung nicht mehr...
Ja jetzt klappt es
Aber das ganze macht ja jetzt nichts anderes, als ich geschrieben habe, sondern schiebt dazwischen nur 'ne Type-Deklaration, sodass nicht ein Array verändert wird, sondern ein selbstdefinierter Type, der ja aber letztendlich nur ein Array ist....
Warum ging meine Version denn nicht???
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Inkompatible Typen: lokales dynamisches Array und Integ

  Alt 25. Mär 2005, 15:20
liegt einfach an delphi. Wenn du in zwei unterschiedlichen Units den Typ "TDynArray" deklarierst sind diese auch untereinander incompatibel (laut compiler) so das du es explizit auf das TDynArray der anderen Unit casten müsstest. Und genauso verhält es sich wenn du es im ProcedureKopf deklarierst, es ist dann eben eine neudeklaration des arrays..
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  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 17:51 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