mehrere/einzelne Werte aus eine Procedure holen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

mehrere/einzelne Werte aus eine Procedure holen

Beitrag von Pure_Beginner »

Hallo Leute,

bin stolz wie tausen Affen !!
Hab es geschafft die Feiertage zu errechnen. :D
leider weiss ich nicht genau wie ich es schaffe einzelne Feiertage oder alle aus der Procedure abzufragen. :cry:
Warscheinlich sollte ich eine Structure oder ein Liste erstellen und über Pointer oder Zeiger (keine Ahnung was der Unterschied ist) darauf zugreifen.

Hier mein Code
Berechnung des Osterdatums (unwichtig)

Code: Alles auswählen

Procedure.i Ostern()
  Protected.i a, b, c, d, e, f, g, h, i, k, l, m, n, p
  If Jahr < 1 
    MessageRequester("Fehler", "Datum nicht möglich")
    ProcedureReturn
  Else
    If Jahr > 1582
      ;Gregorianischer Kalender
      
      a = Mod(Jahr, 19)
      b = Jahr / 100
      c = Mod(Jahr, 100)
      d = b / 4
      e = Mod(b, 4)
      f = (b + 8) / 25
      g = (b - f + 1) / 3
      h = Mod((19 * a + b - d - g + 15), 30)
      i = c / 4
      k = Mod(c, 4)
      l = Mod((32 + 2 * e + 2 * i - h - k), 7)
      m = (a + 11 * h + 22 * l) / 451
      n = (h + l - 7 * m + 114) / 31
      p = Mod((h + l - 7 * m + 114), 31)
      
      ProcedureReturn Date(jahr, n, p + 1,0,0,0)
      
    Else
      ; Julianischer Kalender
      a = Mod(Jahr, 4)
      b = Mod(Jahr, 7)
      c = Mod(Jahr, 19)
      d = Mod((19 * c + 15), 30)
      e = Mod((2 * a + 4 * b - d + 34), 7)
      f = (d + e + 114) / 31
      g = Mod((d + e + 114), 31)
      
      ProcedureReturn  Date(Jahr, f, g + 1,0,0,0)
    EndIf
  EndIf
EndProcedure

Berechnung der Feiertage(wie bekomme ich die da raus?)

Code: Alles auswählen

Procedure Feiertage()
  Protected Ostern.i, Rosenmontag.i,Aschermittwoch.i, Karfreitag.i, Ostersonntag.i, Ostermontag.i, Weissersonntag.i, Christihimmelfahrt.i, i.i,
Pfingstsonntag.i, Pfingstmontag.i, Frohnleichnahm.i, Ergebnis.i, diff.i, kirchenjahr.i, Bussundbeettag.i, Advent1.i, Advent2.i, Advent3.i, 
Advent4.i, Neujahr.i, Heiligedreikoenige.i, Valentinstag.i, TagderArbeit,MariaHimmelfahrt.i, TagderDeutschenEinheit.i, Reformationstag.i,
AllerHeiligen.i, Heiligabend.i, Weihnachten1.i, Weihnachten2.i, Silvester.i

  
  Dim Feiertag.i(26)
  Dim FeiertagName.s(26)
  Protected monat.i, tag.i
  
  Ostern = Ostern()
  
  ;feste feiertage
  Neujahr = Date(Jahr, 1, 1,0,0,0)
  Heiligedreikoenige = Date(Jahr, 1, 6,0,0,0)
  Valentinstag = Date(Jahr, 2, 14,0,0,0)
  TagderArbeit = Date(Jahr, 5, 1,0,0,0)
  MariaHimmelfahrt = Date(Jahr, 8, 15,0,0,0)
  TagderDeutschenEinheit = Date(Jahr, 10, 3,0,0,0)
  Reformationstag = Date(Jahr, 10, 31,0,0,0)
  AllerHeiligen = Date(Jahr, 11, 1,0,0,0)
  Heiligabend = Date(Jahr, 12, 24,0,0,0) 
  Weihnachten1 = Date(Jahr, 12, 25,0,0,0)
  Weihnachten2 = Date(Jahr, 12, 26,0,0,0)
  Silvester = Date(Jahr, 12, 31,0,0,0)
 
  
  ;bewegliche feiertage in abhängigkeit zu ostern
  Rosenmontag = AddDate(Ostern, #PB_Date_Day, -48)
  Aschermittwoch = AddDate(Ostern, #PB_Date_Day, -46)
  Karfreitag =  AddDate(Ostern, #PB_Date_Day, -2)
  Ostersonntag =  AddDate(Ostern, #PB_Date_Day,0)
  Ostermontag = AddDate(Ostern, #PB_Date_Day, 1)
  Weissersonntag =  AddDate(Ostern, #PB_Date_Day, 7)
  Christihimmelfahrt = AddDate(Ostern, #PB_Date_Day, 39)
  Pfingstsonntag = AddDate(Ostern, #PB_Date_Day, 49)
  Pfingstmontag =  AddDate(Ostern, #PB_Date_Day, 50)
  Frohnleichnahm =  AddDate(Ostern, #PB_Date_Day, 60)
  
  ;berechnung des kirchenjahres
  Ergebnis = Mod(DayOfWeek(Date(Jahr,12,25,0,0,0) + 6),7)
  diff =  -Ergebnis -1
  kirchenjahr =  AddDate(Date(Jahr, 12, 25, 0, 0, 0), #PB_Date_Day,diff -20)
  
  ;bewegliche feiertage in abhängigkeit zum kirchenjahr
  Bussundbeettag = AddDate(kirchenjahr, #PB_Date_Day, -11)
  Advent1 = AddDate(kirchenjahr, #PB_Date_Day,0)
  Advent2 = AddDate(kirchenjahr, #PB_Date_Day,7)
  Advent3 = AddDate(kirchenjahr, #PB_Date_Day,14)
  Advent4 = AddDate(kirchenjahr, #PB_Date_Day,21)
  
  Feiertag(0) = Rosenmontag
  Feiertag(1) = Aschermittwoch
  Feiertag(2) = Karfreitag
  Feiertag(3) = Ostersonntag
  Feiertag(4) = Ostermontag
  Feiertag(5) = Weissersonntag
  Feiertag(6) = Christihimmelfahrt
  Feiertag(7) = Pfingstsonntag
  Feiertag(8) = Pfingstmontag
  Feiertag(9) = Frohnleichnahm
  Feiertag(10) = Bussundbeettag
  Feiertag(11) = Advent1
  Feiertag(12) = Advent2
  Feiertag(13) = Advent3
  Feiertag(14) = Advent4
  Feiertag(15) = Neujahr
  Feiertag(16) = Heiligedreikoenige
  Feiertag(17) = Valentinstag
  Feiertag(18) = TagderArbeit
  Feiertag(19) = MariaHimmelfahrt
  Feiertag(20) = TagderDeutschenEinheit
  Feiertag(21) = Reformationstag
  Feiertag(22) = AllerHeiligen
  Feiertag(23) = Heiligabend
  Feiertag(24) = Weihnachten1
  Feiertag(25) = Weihnachten2
  Feiertag(26) = Silvester
  
  
  FeiertagName(0) = "Rosenmontag"
  FeiertagName(1) = "Aschermittwoch"
  FeiertagName(2) = "Karfreitag"
  FeiertagName(3) = "Ostersonntag"
  FeiertagName(4) = "Ostermontag"
  FeiertagName(5) = "Weißer Sonntag"
  FeiertagName(6) = "Chr. Himmelfahrt"
  FeiertagName(7) = "Pfingstsonntag"
  FeiertagName(8) = "Pfingstmontag"
  FeiertagName(9) = "Frohnleichnahm"
  FeiertagName(10) = "Buß und Bettag"
  FeiertagName(11) = "erster Advent"
  FeiertagName(12) = "zweiter Advent"
  FeiertagName(13) = "dritter Advent"
  FeiertagName(14) = "vierter Advent"
  FeiertagName(15) = "Neujahr"
  FeiertagName(16) = "Hl. drei Könige"
  FeiertagName(17) = "Valentinstag"
  FeiertagName(18) = "Tag der Arbeit"
  FeiertagName(19) = "Maria Himmelfahrt"
  FeiertagName(20) = "Tag d.D. Einheit"
  FeiertagName(21) = "Reformationstag"
  FeiertagName(22) = "aller Heiligen"
  FeiertagName(23) = "Heiligabend"
  FeiertagName(24) = "Weihnachtstag 1"
  FeiertagName(25) = "Weihnachtstag 2"
  FeiertagName(26) = "Silvester"  
EndProcedure
Für Euere Hilfe wäre ich sehr Dankbar,
stehe immer wieder vor diesem Problem, habs noch nicht ganz verinnerlicht(nächster evolutionärer Schritt).

Grüße Christian


Ps
bin nicht sicher ob das ein Anfängerproblem ist, wenn nicht bitte verschieben.
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: mehrere/einzelne Werte aus eine Procedure holen

Beitrag von STARGÅTE »

Pure_Beginner hat geschrieben:Warscheinlich sollte ich eine Structure oder ein Liste erstellen und über Pointer oder Zeiger (keine Ahnung was der Unterschied ist) darauf zugreifen.
Ja solltest du ^^
Hier eine Anregung:

Code: Alles auswählen

Structure Feiertage
	Neujahr.i
	Heiligedreikoenige.i
	Valentinstag.i
	;...
EndStructure

Procedure Feiertage(*Feiertage.Feiertage, Jahr)
	
	With *Feiertage
		
		\Neujahr = Date(Jahr, 1, 1, 0, 0, 0)
		\Heiligedreikoenige = Date(Jahr, 1, 6, 0, 0, 0)
		\Valentinstag = Date(Jahr, 2, 14, 0, 0, 0)
		
	EndWith
	
EndProcedure


Define MeineFeiertage.Feiertage

Feiertage(@MeineFeiertage, 2013)

Debug FormatDate("%dd.%mm.%yyyy", MeineFeiertage\Valentinstag)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: mehrere/einzelne Werte aus eine Procedure holen

Beitrag von Pure_Beginner »

@STARGÅTE

Danke für den Tipp, werde mich gleich dranmachen

Grüße
Christian
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: mehrere/einzelne Werte aus eine Procedure holen

Beitrag von Pure_Beginner »

@Stargate

habs umgestetz und funktioniert.

Aber was mach ich da eigentlich ?

Arbeite ich mit Pointern oder Zeigern ?

und warum muss es im Procedure aufruf heisen (*feiertage.feiertage) ?

könntest Du evtl. versuchen mir das etwas näher zu bringen(bin kein Progammiere und daher etwas limitiert)

Grüße und besten Dank
Christian
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: mehrere/einzelne Werte aus eine Procedure holen

Beitrag von STARGÅTE »

Oben erstellst du eine Struktur, also eine Art Inhaltsverzeichnis für einen Speicherbereich, den du mit dieser Struktur reservierst.

mit Define MeineFeiertage.Feiertage reservierst du dir nun einen Speicherbereich mit der Struktur. Mit dem Namen MeineFeiertage greifst du dann darauf zu.

Prozeduren können keine kompletten Strukturen übergeben werden oder zurückgegeben werden.
Darum nutzen wir bei der Prozedure nur eine Adresse (oder Pointer ist gleichbedeutend) zu unserem Speicherbereich.

*Feiertage.Feiertage (wichtig ist der *) ist also nur eine Adresse und nicht der ganze Inhalt. Aber wir weisen die Adresse mit unserer Struktur aus, um darauf zuzugreifen.

ganz unten gebe ich nun die Adresse von MeineFeiertage mit @MeineFeiertage an die Prozedur, und erlauben der Prozedur nun, im Speicherbereich von MeineFeiertage rumzuschreiben.
Daher ist auch kein Rückgabewert nötig.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: mehrere/einzelne Werte aus eine Procedure holen

Beitrag von NicTheQuick »

Pointer ist nur das englische Wort für Zeiger, also meint beides das selbe.

Ein Pointer ist in PB im Grunde gesehen meistens eine strukturierte Variable, die nicht an einer bestimmten Speicherstelle sitzt, sondern bei der man die Speicherstelle ändern kann.

Code: Alles auswählen

Structure meineStruktur
	a.i
	b.i
EndStructure

;Wir definieren als Beispiel zwei Variablen
Define.MeineStruktur variable1, variable2

variable1\a = 1
variable1\b = 10

variable2\a = 2
variable2\b = 200

;Und jetzt definieren wir einen Zeiger mit der selben Struktur
Define *Zeiger.MeineStruktur

;Anfänglich zeigt der Zeiger auf die Speicheradresse 0
Debug "*Zeiger zeigt auf Speicheradresse " + Str(*Zeiger)

;Würden wir jetzt auf die Elemente der Struktur zugreifen,
;würden wir eine Speicherzugriffsverletzung auslösen,
;weil man von Adresse 0 nicht lesen darf.

;Debug *Zeiger\a		;<-- Zeile auskommentieren um Fehler zu erhalten

;Deswegen müssen wir den Zeiger auf eine gültige Speicheradresse
;zeigen lassen, z.B. auf variable1 oder variable2. Das geht so:

*Zeiger = @variable1

;Jetzt zeigt *Zeiger auf variable1 und für können die Werte von variable1
;über *Zeiger auslesen

Debug "*Zeiger zeigt auf Speicheradresse " + Str(*Zeiger)
Debug *Zeiger\a
Debug *Zeiger\b

;Wir können auch darauf schreiben:
*Zeiger\a = 3

;Gleichzeitig ändert sich der Wert in variable1
Debug variable1\a

;Das selbe geht natürlich auch mit variable2:
*Zeiger = @variable2

;Jetzt zeigt *Zeiger auf variable2 und für können die Werte von variable2
;über *Zeiger auslesen

Debug "*Zeiger zeigt auf Speicheradresse " + Str(*Zeiger)
Debug *Zeiger\a
Debug *Zeiger\b
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: mehrere/einzelne Werte aus eine Procedure holen

Beitrag von Pure_Beginner »

Danke für eure Antworten.

in der Theorie einleuchtend,

werde mir das ganze noch mehrmals durchlesen und versuchen zu verstehen.

Besten Dank für eure Antworten und schönen Ostermontag
Christian
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Antworten