Teil eines Array übergeben

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
ccmueller
Beiträge: 10
Registriert: Sa 7. Feb 2009, 14:28

Teil eines Array übergeben

Beitrag von ccmueller »

Hallo,

ich habe ein array ergebnisvektor[j,i]

Ich möchte nun die Funktion mean darauf anwenden.

Also z.b. showmessage(floattostr(mean(ergebnisvektor2[12,i])))

das funktioniert auch.

Mein Problem ist, dass meine Werte in Ergebnisvektor erst mit dem Index i=1 anfangen. i=0 ist nicht definiert wird aber leider bei der Berechnung von mean berücksichtigt.
Wie kann ich den Ergebnisvektor übergeben, dass nur die Werte i= 1...n übergeben werden.

Danke im Voraus.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Teil eines Array übergeben

Beitrag von Socke »

ccmueller hat geschrieben:Mein Problem ist, dass meine Werte in Ergebnisvektor erst mit dem Index i=1 anfangen. i=0 ist nicht definiert wird aber leider bei der Berechnung von mean berücksichtigt.

Verstehe ich das richtig, dass der Index 0 zwar existiert, aber einen für deine Anwendung ungültigen oder nicht zu beachtenden Wert beinhaltet? (Deklarationen von Variablen und den verwendeten Typen sind immer hilfreich)
ccmueller hat geschrieben:Wie kann ich den Ergebnisvektor übergeben, dass nur die Werte i= 1...n übergeben werden.

Du erstellt ein zweites Array und kopierst alle Werte dort hinein.

Im Falle der mean()-Funktionen aus der Unit math (ich habe jetzt mal geraten, dass du diese meinst), kannst du das aber auch über Zeiger lösen. Erster Parameter ist dann ein Zeiger auf das erste zu beachtende Element und das zweite Argument ist die Anzahl der zu beachtenden Einträge. Den Zeiger musst du auf den entsprechenden Typ deiner Array-Elemente casten.

Code: Alles auswählen

var
  a: array [1..3] of single;
  m: float;
begin
  a[1] := 1.1;
  a[2] := 2.2;
  a[3] := 3.3;
  m := mean(PSingle(@a[2]),2);
end;


Edit: Anstatt des Typecasts kannst du auch die Compilerdirektive {$T+} verwenden; damit liefert der @-Operator automatische den Datentyp mit.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

ccmueller
Beiträge: 10
Registriert: Sa 7. Feb 2009, 14:28

Re: Teil eines Array übergeben

Beitrag von ccmueller »

Danke!

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Teil eines Array übergeben

Beitrag von Antrepolit »

Warum so kompliziert?
Man kann das Array doch einfach bei 0 anfangen lassen...

Code: Alles auswählen

var
  a: array [0..2] of single;
  m: float;
begin
  a[0] := 1.1;
  a[1] := 2.2;
  a[2] := 3.3;
  ...
end;
Grüße, Antrepolit

care only if your os is really burning

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Re: Teil eines Array übergeben

Beitrag von schnullerbacke »

i+1
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Teil eines Array übergeben

Beitrag von ErnstVolker »

Hallo,

ich habe in diesem Zusammenhang eine ähnliche Frage:

Folgendes Listing:

Code: Alles auswählen

begin
   a[0]:=1.1;
   a[1]:=0.5;
   a[2]:=3.2;
   mitt:=mean(a);
   max:=MinValue(a,index);
   writeln(mitt:3:1);
   writeln('');
   writeln(max:3:1);
   writeln('');
   writeln(index);
   readln;
end.


Ich kann "max" mal mit MaxValue oder mit MinValue aufrufen und bekomme das identische Ergebnis: 1.1 und Index 0.
Erwarten würde ich für den Aufruf mit MinValue als Ergebnis 0.5 und index 1, bei MaxValue als Ergebnis 3.2 und index 2.

mean ist OK. Liefert 1.6.

Was mache ich falsch?

Gruß

Volker

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Teil eines Array übergeben

Beitrag von theo »

Welches MinValue meinst du?
Falls es das aus der Unit Math ist, wie kommst du darauf, dass der zweite Parameter ein Index sei?

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Teil eines Array übergeben

Beitrag von ErnstVolker »

Nun ja, ich hab' die Hilfe falsch interpretiert.

Es gibt die Funktion vier mal, und zwei Aufrufvarianten beinhalten ein "N" als Integer. Ich dachte hier würde ähnlich wie bei einer Deklaration mit "var" eben der Index zurückgegeben.

Es war der Wunsch Vater des Gedanken. Ich bräuchte eine Funktion die mir den Max-Wert einschließlich Position aus einem Array liefert.
Ansonsten Funktionieren MaxValue und MinValue tadellos.

Ich habe zwei Arrays. Eines enthält Drehmomente eines Motors, das Andere die zugehörige Drehzahl. Mit MaxValue wollte ich aus dem Momentenarray entsprechend das Maximum und mit Index die Position herausbekommen um aus dem Drehzahlarray über den Index die zugehörige Drehzahl zu holen. Beide Arrays sind gleich lang.

Gruß

Volker

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Teil eines Array übergeben

Beitrag von theo »

Wie wär's mit "sich-nicht-so-anstellen"? :D

Den Grössten Wert aus einem Array bestimmen ist keine Quantenphysik.

Wenn man zu faul dazu ist, setzt man den Cursor auf "MinValue" in Source-Code und drückt "Alt+Hoch" und dann "Umschalt+Ctrl+Runter".

Dort liest man dann wie MinValue funktioniert, kopiert das und bastelt sich die gewünschte Funktion selber.

Ist schneller gemacht als zig Forenbeiträge zu verfassen. :wink:

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Teil eines Array übergeben

Beitrag von indianer-frank »

Sind die Werte denn überhaupt unimodal? Oder anders gefragt, was ist die Position des Maximums in

Code: Alles auswählen

const a: array[0..5] of double = (1,2,-3,0,2,-1);

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Re: Teil eines Array übergeben

Beitrag von schnullerbacke »

@indianer,
zweimal 2 ist ein Widerspruch, hast du das mal probiert?
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Teil eines Array übergeben

Beitrag von ErnstVolker »

Naja ich war halt ein wenig verwöhnt.
Bei den numerischen Mathematikprogrammen (siehe Foto) funktioniert es so. Und ich dachte die Entwickler der Unit "math" hätten das eingebaut.
Oder es gibt eine unit vector, aus der man es Entnehmen kann.

Bei C oder C++ wird's mit Sicherheit Header geben mit denen das geht, ohne das Rad neu zu erfinden.

Aber eine weitere Frage hätte ich noch: Wie kann man bei einem StringGrid eine beliebige Spalte feststellen? Es gibt "FixedCols:=2" z.B. Dann sind die ersten beiden Spalten des StringGrid fest. Wie kann ich z.B nur Spalte 2 oder 3 feststellen? Irgendwie der Art: "FixedCol[2]:=true" würde mir gefallen. Ich habe im Objektinspektor rauf und runter gesucht, nix gefunden.

Volker
Dateianhänge
maxmin.jpg

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Teil eines Array übergeben

Beitrag von indianer-frank »

schnullerbacke hat geschrieben:@indianer,
zweimal 2 ist ein Widerspruch, hast du das mal probiert?

Nein das ist kein Widerspruch sondern genau der Kern der Frage: Was macht eine Prozedur/Funktion bei einer Eingabe, bei der es zwei oder mehr maximale Werte gibt?

Liefert sie den ersten Index, den letzten, den Mittelwert, oder was?

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Re: Teil eines Array übergeben

Beitrag von schnullerbacke »

indianer-frank hat geschrieben:
schnullerbacke hat geschrieben:@indianer,
zweimal 2 ist ein Widerspruch, hast du das mal probiert?

Nein das ist kein Widerspruch sondern genau der Kern der Frage: Was macht eine Prozedur/Funktion bei einer Eingabe, bei der es zwei oder mehr maximale Werte gibt?

Liefert sie den ersten Index, den letzten, den Mittelwert, oder was?


Nach der Logik wird immer das erste Auffinden angezeigt werden, alles andere wäre Unfug.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Teil eines Array übergeben

Beitrag von Socke »

schnullerbacke hat geschrieben:Nach der Logik wird immer das erste Auffinden angezeigt werden, alles andere wäre Unfug.

Wenn du über alle Einträge von Vorne nach Hinten (0 -> x) iterierst schon; in der anderen Richtung liegst du falsch und diese ist meines Erachtens genau so legitim. Ich hatte auch mal in der Delphi-Hilfe gelesen, dass der Compiler durchaus die Zählreihenfolge verändern kann, wenn diese effizienter ist und das gleiche Ergebnis liefert (auch wenn der Fall hier nicht gegeben ist).

Mathematisch muss man sagen, dass in (1, 2, 0, 2, -1) zwei globale Maxima vorhanden sind. Daher muss für die Anwendung definiert werden, welches dieser Maxima beachtet werden soll (wenn nur eines beachtet werden soll). Den Titel "das Maximum" kann man nur ohne Indexbezug vergeben, da dann nur der identische Wert Maximum ist (es kann also nur ein Maximum geben).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten