Unsymetrisches Array

Delphi übernehmen die bestimmt nicht - Pascal ist anders aufgebaut als Java und die C-Familie (so weit die OOP das zulässt)

ot:
Und deine Nachricht hab ich beantwortet - du bist dran :ätsch!
 
jau bastla

Kann sein, dass die C#-Entwickler ordentlich bei Java geklaut haben?
Den C#-Code versteh' sogar ich, obwohl ich nur Java kann :D

Wer da beim wem geklaut hat dürfte ja wohl klar sein!

oder willst Du behauten dass Java vor C existierte...

Die Frage aber, verstehe ich nicht ganz - in einer anderen Sprache als Java - warum den überhaupt?

Und wenn schon, dann bitte in welcher - gibt bekanntlich etliche Möglichkeiten
 
Macht er nicht irgendwie eine Ausbildung, oder sowas?

Könnte doch eine Aufgabe sein, die darauf zielt, dass man sich auch mal mit anderen Sprachen auseinander setzt und so zumindest die Grundlagen kennt.
 
ot

hatte mir überlegt, ob ich das in Assembler machen soll...
glaube aber, das kaum wer das dann noch interpretieren könnte.
..


Ich schreibe solche Funktionen in der Regel in Pascal oder AnsiC,
da dies auf jeder CPU unterstützt werden. Solches wird aber hier
sicherlich nicht gesucht...
In Pascal ist der Nachteil für das Gewünschte jedoch der, dass das Array (wie alle Variablen) im Header schon deklariert sein will.
Laufzeiterzeugung funktioniert nicht!
Der user muss also schon von vornherein festlegen Max. wie viele Personen und Noteneinträge es geben wird.

Ich persönlich würde das Array aber direkt nach Schüler und Eintragen dimensionieren.
Wäre so für spätere statistische Zwecke einfacher als Datensätze abrufbar. Wenn Teilnoten existieren gleich in "real"

_raySchNt [1..30,1...15] (30Schüler 15 Noten)

vielleicht wundert ihr euch über meine Variablenbezeichnung... (ich empfehle jedem sich an eine Stuktur zu halten., da sonst in einem grossen Programm die Variablen nicht mehr auseinander gehalten werden können. Für jeden der solches später interpretieren soll ist das eine Kriegserklärung.

Hier nutze ich immer die Konventionen des Steuerungsbaus
die Erste Stelle wird als Herkunftsbezeichner genutzt:
_ = lokal
I = Eingang
Q = Ausgang (wäre eigentlich O für Output aber wegen Verwechslungen mit 0 wurde Q eingeführt)
die nächsten Stellen dienen der Typ
x = bool statisch (dynamische p=positive, n=negativ-Flanke)
b = byte
w = word
d = duble
l = long
i = integer
ui=unsignedinteger
s = string
 
Hi, habe da wahrscheinlich einige ein wenig überfordert.

so hänge ich hier mal ein Beispiel rein, dass illustriert was ich meinte...
Das Beispiel ist als FB Gehalten und wird in ein Programm eingebunden

-Header

VAR_INPUT
Isi_Of_Hrs: SINT:=0;
(*Cal to Begin Houers*)
Isi_To_Hrs: SINT:=0;
(*Cal to End Houers *)
Isi_Of_Day: SINT:=0;
(*Cal to Day*)
Iai_Wk_Dat: ARRAY [1..7,0..23,1..4] OF INT:=[672(0)];
(*Input-Array of Week-Data / dreidimensionales Array*)
(* Tag, Stunde, 1/4Std*)
END_VAR
VAR
si_Hours: SINT:=0;
(*Counter to Houers*)
r_Hrs_Sum: REAL:=0.0;
(*Cal to Houers Data*)
i_Hrs_Sum: INT:=0;
(*Call to Hour*)
siCallDay: SINT:=0;
(*Cal to after Day*)
END_VAR
VAR_OUTPUT
Call_To_Day: REAL:=0.0;

-main

(* Initialzation *)
si_Hours := 0 ;
i_Hrs_Sum:= 0 ;
IF (Isi_Of_Day = 1) THEN
siCallDay := 7 ;
ELSE
siCallDay := Isi_Of_Day -1 ;
END_IF ;

IF (Isi_To_Hrs >= Isi_Of_Hrs) THEN
(* to Day *)​
FOR si_Hours := Isi_Of_Hrs TO (Isi_To_Hrs -1) BY 1
DO i_Hrs_Sum:= (Iai_Wk_Dat[Isi_Of_Day,si_Hours,1]/4)
+ (Iai_Wk_Dat[Isi_Of_Day,si_Hours,2]/4)
+ (Iai_Wk_Dat[Isi_Of_Day,si_Hours,3]/4)
+ (Iai_Wk_Dat[Isi_Of_Day,si_Hours,4]/4);
r_Hrs_Sum := r_Hrs_Sum + int_to_real(i_Hrs_Sum) ;
END_FOR ;
Call_To_Day := r_Hrs_Sum ;
r_Hrs_Sum := 0.0 ;
ELSE
(* to Night *)​
IF (Isi_Of_Day > 0) THEN
(* previous midnight *)​
FOR si_Hours := Isi_Of_Hrs TO 23 BY 1
DO i_Hrs_Sum:= (Iai_Wk_Dat[siCallDay,si_Hours,1]/4)
+ (Iai_Wk_Dat[siCallDay,si_Hours,2]/4)
+ (Iai_Wk_Dat[siCallDay,si_Hours,3]/4)
+ (Iai_Wk_Dat[siCallDay,si_Hours,4]/4);
r_Hrs_Sum := r_Hrs_Sum + int_to_real(i_Hrs_Sum);
END_FOR ;
END_IF ;
IF (Isi_To_Hrs > 0) THEN
(* after midnight *)​
FOR si_Hours := 0 TO (Isi_To_Hrs -1) BY 1
DO i_Hrs_Sum:= (Iai_Wk_Dat[Isi_Of_Day,si_Hours,1]/4)
+ (Iai_Wk_Dat[Isi_Of_Day,si_Hours,2]/4)
+ (Iai_Wk_Dat[Isi_Of_Day,si_Hours,3]/4)
+ (Iai_Wk_Dat[Isi_Of_Day,si_Hours,4]/4);
r_Hrs_Sum := r_Hrs_Sum + int_to_real(i_Hrs_Sum) ;
END_FOR ;
END_IF ;
Call_To_Day := r_Hrs_Sum ;
r_Hrs_Sum := 0.0 ;
END_IF ;
 
Das Array will natürlich gefüllt werden...

VAR_INPUT
IaI_W_Dat: ARRAY [1..7,0..23,1..4] OF INT:=[672(0)];
(*Wochendaten*)
Iasi_Trf: ARRAY [1..7,0..1] OF SINT:=[14(0)];
(*Woch-Tarif*)
END_VAR
VAR_OUTPUT
Qar_WkDt: ARRAY [0..7,0..2,0..1] OF REAL:=[48(0.0)];
(*Tag 1-7/Tot 0, HT 1, NT 2/Sum 0, DS 1*)
END_VAR
VAR
r_Sum_D: REAL:=0.0;
(*Sum to Day*)
r_Sum_W: REAL:=0.0;
(*Sum to Week*)
rHt_Sum: REAL:=0.0;
(*Sum to rate H*)
rHt_S_W: REAL:=0.0;
(*Sum to Week rate H*)
rNt_Sum: REAL:=0.0;
(*Sum to rate N*)
rNt_S_W: REAL:=0.0;
(*Sum to Week rate N*)
siFr_Hr: SINT:=0;
(*from Hour*)
siTo_Hr: SINT:=0;
(*to Hour*)
siCntDy: SINT:=0;
(*Day-counter*)
siHrs_H: SINT:=0;
(*Hours to rate High*)
siHrs_L: SINT:=0;
(*Hours to rate Low*)
END_VAR

-main
(* Array Configuration:

First 1..7 = Day
0 = Week

Secund 0 = Total
1 = rate High (H)
2 = rate Low (N)

Third 0 = Summ
1 = Mean
*)

(* initialize *)
siCntDy := 0 ;
siFr_Hr := 0 ;
siTo_Hr := 0 ;
r_Sum_D := 0.0 ;
r_Sum_W := 0.0 ;
rHt_Sum := 0.0 ;
rHt_S_W := 0.0 ;
rNt_Sum := 0.0 ;
rNt_S_W := 0.0 ;

WHILE siCntDy < 7 DO
siCntDy := siCntDy + 1 ;
CASE siCntDy OF (* select to day *)
1: siFr_Hr := Iasi_Trf[1,1] ;
siTo_Hr := Iasi_Trf[1,0] ;​
2: siFr_Hr := Iasi_Trf[2,1] ;
siTo_Hr := Iasi_Trf[2,0] ;​
3: siFr_Hr := Iasi_Trf[3,1] ;
siTo_Hr := Iasi_Trf[3,0] ;​
4: siFr_Hr := Iasi_Trf[4,1] ;
siTo_Hr := Iasi_Trf[4,0] ;​
5: siFr_Hr := Iasi_Trf[5,1] ;
siTo_Hr := Iasi_Trf[5,0] ;​
6: siFr_Hr := Iasi_Trf[6,1] ;
siTo_Hr := Iasi_Trf[6,0] ;​
7: siFr_Hr := Iasi_Trf[7,1] ;
siTo_Hr := Iasi_Trf[7,0] ;​
END_CASE ;
r_Sum_D := Call_To_Day (0, 24, siCntDy, IaI_W_Dat); (* sum of to day *)
r_Sum_W := r_Sum_W + r_Sum_D ; (* sum of to week *)
IF (siTo_Hr > siFr_Hr) THEN (* sum of to rate *)
rHt_Sum := Call_To_Day (siFr_Hr, siTo_Hr, siCntDy, IaI_W_Dat);
rNt_Sum := Call_To_Day (siTo_Hr, siFr_Hr, siCntDy, IaI_W_Dat);
rHt_S_W := rHt_S_W + rHt_Sum ;
rNt_S_W := rNt_S_W + rNt_Sum ;
siHrs_H := siTo_Hr - siFr_Hr ;
siHrs_L := 24 - siHrs_H ;
ELSE
rNt_Sum := r_Sum_D ;
siHrs_H := 0 ;
siHrs_L := 24 ;
END_IF ; (* move to outputarray of day-data *)
Qar_WkDt[siCntDy,0,0] := r_Sum_D ;
Qar_WkDt[siCntDy,0,1] := r_Sum_D / 24.0 ;
Qar_WkDt[siCntDy,1,0] := rHt_Sum ;
Qar_WkDt[siCntDy,1,1] := rHt_Sum / sint_to_real(siHrs_H);
Qar_WkDt[siCntDy,2,0] := rNt_Sum ;
Qar_WkDt[siCntDy,2,1] := rNt_Sum / sint_to_real(24 - siHrs_H);
END_WHILE ;
IF (siCntDy = 7) THEN (* move to Output-array of week-data *)
Qar_WkDt[0,0,0] := r_Sum_W ;
Qar_WkDt[0,0,1] := r_Sum_W / 7.0 ;
Qar_WkDt[0,1,0] := rHt_S_W ;
Qar_WkDt[0,1,1] := rHt_S_W / 7.0 ;
Qar_WkDt[0,2,0] := rNt_S_W ;
Qar_WkDt[0,2,1] := rNt_S_W / 7.0 ;
siCntDy := 0 ;
END_IF ;
 
Zuletzt bearbeitet:
Das ganze wird gekapselt und dem user steht eine direkt ein zu bindende Funktion zur Verfügung.

In dieser sind noch weiter vier FB integriert.

Sys_Init_Fra.jpg

Das Ganze liegt so direkt unter Grafikprogrammierung FBD vor.

Wichtig ist zu wissen, dass eine solche Funktion nicht einfach auf einen PC portierbar ist. Da auf CPU's ein Scanner implantiert ist, wird das Programm beständig abgearbeitet, und jeder Input wird dynamisch übergeben. Auf einem PC muss das durch eine Schleife erzeugt werden!
 
Also wirklich besser folgen kann ich jetzt nicht.


Deine Namens-Schemata hab ich noch halbwegs kapiert, aber ab dem Beispiel ... :D
 
ja palladin,

schon klar, dass der Ablauf da ein wenig komplex ist; hatte nur gerade das in Arbeit

Da ich annehme, dass der Fragesteller ein Lernender ist, habe ich mir gedacht, dass er so mal Pascal zu Gesicht bekommt.

Dabei ist klar ersichtlich, dass alle Variablen dimensioniert im Header deklariert sein müssen.
Das Zweite ist, dass ich da immer einen beschreibenden Text zugeordnet habe; liegt immer innerhalb von (* .. *)
und zum dritten sind alle Variablen-Bezeichner immer mit Bezug auf deren Funktion "benamst"!
So Zähler mit "i" sind ein Gräuel, weil nicht mehr erkennbar ist, zu was der gehört.

Dazu habe ich in den Arrays z.B. Qar_WkDt[siCntDy,0,0] klar erkennbar, das die erste Dimension durch den Zähler siCntDy "Tageszähler" Zugewiesen ist.

So sollte für spätere Leser das Verstehen einigermassen nachvollziehbar sein.
 
Oben