💚 BITTE helfen Sie uns das LibreOffice Forum zu erhalten! 💚
Helfen Sie uns bitte noch HEUTE!

❤️ DANKE >><< DANKE ❤️

Vielen Dank für Ihre SPENDE.

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Warum kompiliert das überhaupt? LO 7.3.7.2

Alles zur Programmierung im LibreOffice.
Antworten
Benutzeravatar
Basilisk
Beiträge: 77
Registriert: Do 26. Jun 2014, 14:06

Warum kompiliert das überhaupt? LO 7.3.7.2

Beitrag von Basilisk » Sa 15. Jun 2024, 20:46

Das sollte eine recht überschaubare Funktion sein, die textuell zurückgibt, in welchem Bereich eine Zahl liegt.

Code: Alles auswählen

Sub Main
MsgBox CC(0)
End Sub

Function CC(l As Long) As String
Dim s1 As String
If l <= 0 Then
    s1 = "l <= 0"
Else If l > 1 Then
    s1 = "l > 1"
Else
    s1 = "Else"
End If
MsgBox s1
CC = s1
End If
End Function
Ja, da sind zwei Zeilen mit "End If". Kommentiere ich eines davon aus, kompiliert es nicht mehr, sonder beschwert sich, dass End Function ein unerwartetes Symbol ist. Startet man den Testlauf mit Main, verhält es sich, als wäre das erste "End If" gar nicht vorhanden. Macht man den Test mit 1 statt 0, so scheint alles zu funktionieren. Ich habe das ganze aus einem größeren Programm, dass sich erratisch verhielt, auf das hier eingedampft. Hier scheint der Fehler zu liegen, aber welcher? Wo?

Ich starre jetzt schon über eine Stunde mal hierauf und mal hierauf. Ich komme nicht dahinter.

Kann jemand das Phänomen nachvollziehen?

Benutzeravatar
karolus
Beiträge: 2283
Registriert: Fr 10. Dez 2010, 10:01

Re: Warum kompiliert das überhaupt? LO 7.3.7.2

Beitrag von karolus » Sa 15. Jun 2024, 22:23

Hallo
Einbuchstabige Symbole sind meistens schlecht, ein l als Symbol ist aber beschissen schlecht, weil es leicht mit I (GROSSES i) oder gar mit der 1 (eins ) verwechselt werden kann

In deiner Funktion gibts zwei if…then ergo müssen da auch zwei end ifs sein!

Code: Alles auswählen

Function CC( number As Long) As String
    If  number <= 0 Then
        CC = "number<= 0"
    exit function
    end if
    If  number >  1 Then
 	CC = "number > 1"
    exit function
    end if	
    CC = "Else"
End Function
Du solltest aber sowas gleich mit select case ……end select erschlagen:

Code: Alles auswählen

Function CC( number As Long) As String
    select case number
        case <=0
            CC = "number <= 0"
         case <= 1 
            CC = "Else"
         case Else
             CC = "number > 1"
    end select
End Function
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.3.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Benutzeravatar
Basilisk
Beiträge: 77
Registriert: Do 26. Jun 2014, 14:06

Re: Warum kompiliert das überhaupt? LO 7.3.7.2

Beitrag von Basilisk » Sa 15. Jun 2024, 23:10

karolus hat geschrieben:
Sa 15. Jun 2024, 22:23
Einbuchstabige Symbole sind meistens schlecht, ein l als Symbol ist aber beschissen schlecht, weil es leicht mit I (GROSSES i) oder gar mit der 1 (eins ) verwechselt werden kann
Ok, aber das scheint hier nicht das Problem zu sein.

Code: Alles auswählen

Sub Main
MsgBox CC(1)
End Sub

Function CC(x As Long) As String
Dim s1 As String
If x <= 0 Then
    s1 = "x <= 0"
Else If x > 1 Then
    s1 = "x > 1"
Else
    s1 = "Else"
End If
MsgBox s1
CC = s1
End If
End Function
karolus hat geschrieben:
Sa 15. Jun 2024, 22:23
In deiner Funktion gibts zwei if…then ergo müssen da auch zwei end ifs sein!
Das "If x > 1 Then" ist aber Teil eines "Else If x > 1 Then" und dieses Konstrukt hat doch laut Hilfe

Code: Alles auswählen

If condition Then
    statements
[{ElseIf|Else If} expression Then
    statements]
[Else
    statements]
{EndIf|End If}
nur ein End If. Es ist kein weiterer If ... Then Block innerhalb eines statements eines äußeren If ... Then Blocks und es sind auch keine hintereinandergeschalteten If ... Then Blocks, oder überseh ich da was?

Außerdem habe ich inzwischen entdeckt, dass alles wie erwartet geht, wenn man das Leerzeichen zwischen Else und IF im Else If ... Then löscht.

Code: Alles auswählen

Function CC(x As Long) As String
Dim s1 As String
If x <= 0 Then
    s1 = "x <= 0"
ElseIf x > 1 Then
    s1 = "x > 1"
Else
    s1 = "Else"
End If
MsgBox s1
CC = s1
End Function
Es scheint, als wäre die Behauptung aus der Hilfe "Instead of Else If you can write ElseIf, ..." falsch.
karolus hat geschrieben:
Sa 15. Jun 2024, 22:23
Du solltest aber sowas gleich mit select case ……end select erschlagen:
Danke. Das hab ich im Produktivcode gemacht, weil hier keiner Zeit hat, bis ich meine akademischen Rätsel löse. Trotzdem verunsichert mich das.

Benutzeravatar
karolus
Beiträge: 2283
Registriert: Fr 10. Dez 2010, 10:01

Re: Warum kompiliert das überhaupt? LO 7.3.7.2

Beitrag von karolus » So 16. Jun 2024, 09:37

Hallo
nur ein End If. Es ist kein weiterer If ... Then Block innerhalb eines statements eines äußeren If ... Then Blocks und es sind auch keine hintereinandergeschalteten If ... Then Blocks, oder überseh ich da was?
Du übersiehst daß für den inneren [else if|if] … then Block die gleichen Regeln gelten wie für den if … then Block aussenrum!

der Unterschied zwischen else if und elseif besteht darin daß du bei letzterem nicht seperat mit end if abschliessen darfst|musst!
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.3.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Benutzeravatar
Basilisk
Beiträge: 77
Registriert: Do 26. Jun 2014, 14:06

Re: Warum kompiliert das überhaupt? LO 7.3.7.2

Beitrag von Basilisk » Mi 3. Jul 2024, 16:54

karolus hat geschrieben:
So 16. Jun 2024, 09:37
der Unterschied zwischen else if und elseif besteht darin daß du bei letzterem nicht seperat mit end if abschliessen darfst|musst!
So scheint es, aber es ist trotzdem unbefriedigend, dass in der Dokumentation Quatsch steht.

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten