Seite 1 von 1

Grundlagen [memvar, public, parameters]

Verfasst: Mo, 07. Mär 2016 9:03
von Wonderer
Hallo,

ich habe hier ein Programm an dem ich Änderungen vornehmen soll. Leider bekomme ich schon den mir vorliegenden Quellcode nicht kompiliert. Ich habe das Ganze jetzt immer weiter vereinfacht um nach dem Ausschlussverfahren herauszufinden wo das Problem liegt.
Scheinbar liegt es an der Deklaration mit der Anweisung 'parameters'.

folgenden Code habe ich jetzt:

Code: Alles auswählen

memvar meineVariable

parameters param1, param2

procedure Main

  public meineVariable := "something"
	
  prozedurAufruf()

return

procedure prozedurAufruf()

  CLEAR SCREEN
  SET COLOR TO N/W,W/N
  @ 1,1 SAY meineVariable

return
und da erhalte ich diese Fehlermeldung:
C:\Clipper>xpp /b vartest2
Xbase++ (R) Compiler 1.90.331 Apr 26 2006
Copyright (c) Alaska Software. All rights reserved.
File: vartest2.prg Line: 18
vartest2.prg(4:0): warning XBT0106: Procedure MAIN does not end with RETURN
vartest2.prg(5:0): error XBT0247: Redefinition of function or procedure
1 error(s) found in file vartest2.prg!
Was ich auch noch nicht so richtig verstanden habe ist das mit MEMVAR / PUBLIC.

Ich bekomme die gleiche Fehlermeldung bei diesem Code:

Code: Alles auswählen

public meineVariable

procedure Main

  meineVariable := "something"
	
  prozedurAufruf()

return

procedure prozedurAufruf()

  CLEAR SCREEN
  SET COLOR TO N/W,W/N
  @ 1,1 SAY meineVariable

return
Wenn ich aber wie schon im ersten geteilten Code statt PUBLIC mit MEMVAR deklariere dann bekomme ich keine Fehlermeldung.
Ohne die Anweisung PARAMETERS erfolgt das Kompilieren auch ohne Probleme.

Ok, während des Schreibens noch etwas ausprobiert - wenn ich die Anweisung PARAMETERS verschiebe innerhalb die procedure MAIN dann erhalte ich den Fehler nicht mehr.

Code: Alles auswählen

// CODE erfolgreich kompiliert und ohne Fehler ausfuehrbar
memvar meineVariable

procedure Main

  parameters param1, param2
  public meineVariable := "something"
	
  prozedurAufruf()

return

procedure prozedurAufruf()

  CLEAR SCREEN
  SET COLOR TO N/W,W/N
  @ 1,1 SAY meineVariable

return
Zusammegefasst mein Problem - im ursprünglichen Quellcode wird ganz am Anfang PUBLIC verwendet. Das lässt sich nicht kompilieren.
Wenn ich auf MEMVAR umstelle dann funktioniert es - was ist falsch an der Deklaration von PUBLIC?!? :?:

Re: Grundlagen [memvar, public, parameters]

Verfasst: Mo, 07. Mär 2016 9:12
von georg
Hallo,


die Antwort ist recht einfach:

PUBLIC und PRIVATE sind ausführbare Anweisungen und dürfen daher nur innerhalb von Funktionen (oder Prozeduren) NACH der Deklaration von LOCAL bzw. STATIC auftauchen.

Einiges dazu habe ich in der WiKi zusammengefasst: http://wiki.xbaseentwickler.de/index.ph ... en-Klassen

Re: Grundlagen [memvar, public, parameters]

Verfasst: Mo, 07. Mär 2016 9:33
von Manfred
im schlimmsten Fall die Schalter vom Compiler entsprechend stellen und dann nachbearbeiten.

Re: Grundlagen [memvar, public, parameters]

Verfasst: Mo, 07. Mär 2016 9:41
von georg
Hallo, Manfred -


da nützen die Schalter vom Compiler nichts, wenn PUBLIC ausserhalb einer Funktion bzw. Prozedur angegeben wird. Der einzig gangbare Weg ist MEMVAR, da dies (ähnlich wie STATIC) auch ausserhalb einer Funktion bzw. Prozedur verwendet werden kann.

Re: Grundlagen [memvar, public, parameters]

Verfasst: Mo, 07. Mär 2016 9:42
von Manfred
nee Georg. Das war anders gemeint. Die Schalter an und dann meckert der Compiler wenn er was nicht vernünftig deklariert bekommen hat und dann sollte man handeln.

Re: Grundlagen [memvar, public, parameters]

Verfasst: Mo, 07. Mär 2016 9:51
von brandelh
Es gibt einen Schalter der die automatischen Generierung von einer Prozedur am Anfang einer Datei verhindert:

/n Keine implizite Startprozedur (MAIN)

Unter Clipper wurde ohne /N eine Funktion / Prozedur mit dem Namen der PRG erzeugt.

Das ist natürlich nicht empfehlenswert, ich setze daher immer /N ... schon seit Clipper.

Aber laut Doku wäre zu vermuten, dass der Anfang der Datei zu einer automatischen Procedure MAIN wird und das trifft dann auf die Zeile procedure MAIN, also eine doppelte Deklaration !

Re: Grundlagen [memvar, public, parameters]

Verfasst: Mo, 07. Mär 2016 9:54
von Herbert
Schau dir zu den Publics einmal dieses Thema dazu an:
http://xbaseforum.de/viewtopic.php?f=31 ... lit=public

Re: Grundlagen [memvar, public, parameters]

Verfasst: Mo, 07. Mär 2016 9:57
von Wonderer
danke für eure Antworten und Hinweise - das bringt mich jetzt weiter.. :roll:

Re: Grundlagen [memvar, public, parameters]

Verfasst: Mo, 07. Mär 2016 17:06
von UliTs
Vielleicht ist einfach nur die Reihenfolge vertauscht.
Mach mal daraus

Code: Alles auswählen

procedure Main
parameters param1, param2
memvar meineVariable
...
Klappt es dann zu Deiner Zufriedenheit?

Uli

Re: Grundlagen [memvar, public, parameters]

Verfasst: Di, 08. Mär 2016 9:30
von Wonderer
ja, danke. das mit der Position von PARAMETERS funktioniert so. die Fehlermeldung war irgendwie irreführend :roll:

Re: Grundlagen [memvar, public, parameters]

Verfasst: Di, 08. Mär 2016 9:50
von georg
Tja, die Fehlermeldung ist irreführend wenn man nicht weiss, dass PARAMETERS, PRIVATE und PUBLIC ausführbare Anweisungen sind. Das ist eben der Preis für die Kompatibilität zu Clipper.

Re: Grundlagen [memvar, public, parameters]

Verfasst: Di, 08. Mär 2016 10:32
von UliTs
Dadurch dass davor keine procedure oder function Anweisung war interpretiert dies Xbase++ so, dass es sich um die procedure Main handelt.
Anschließend wird dann aber doch die procedure Main definiert und Xbase++ glaubt, dass es doppelt vorkommt ...