Deutsch
Quelltexte/ Codesnippets

Befehlszeilentrennung

 

RudiB.
Hallo zusammen,

ich stehe wohl an einer für mich schier unlösbaren Aufgabe.
Ich möchte ein Programm-Listing mit Befehlszeilentrennung durch Doppelpunkte, aufsplitten in separate Programmzeilen.
Als Sonderfall soll jedoch eine Zeile mit "Case" oder "CaseNot" beibehalten werden.

Hier mal ein absolut Sinnfreies Listing und danach das Listing bereinigt.
CLS
Declare a$,b$:Declare c$,d$
Declare e$:Print "Hallo \
zusammen !":Declare INT GROBI: GROBI=500
a$=" der Hund geht zum \
hell brennenden Feuer um sich \
zu wärmen: ABER!!\
die Katze steht ihm im weg"
b$="nicht LEER"
c$="Test"
d$="fertig"
Print:Print:Case b$="":Print" B ist LEER":Print GROBI
Print c$,d$,GROBI
waitinput

...und so solls dann aussehen.....was ich absolut nicht hinkriege !!!!
CLS
Declare a$,b$
Declare c$,d$
Declare e$
Print "Hallo \
zusammen !"
Declare INT GROBI
GROBI=500
a$=" der Hund geht zum \
hell brennenden Feuer um sich \
zu wärmen: ABER!!\
die Katze steht ihm im weg"
b$="nicht LEER"
c$="Test"
d$="fertig"
Print
Print
Case b$="":Print" B ist LEER"
Print GROBI
Print c$,d$,GROBI
waitinput

....z.B: alleine schon der String in VAR a$ mit einem Doppelpunkt darin stellt eine Herausforderung dar...weil hier auch noch die eigentliche Befehlszeile mit einem Backslash aufgesplittet wird...

auch hier im Forum wird das erste Listing mit den Strings farblich nicht korrekt dargestellt....

Stehe gerade voll auf dem Schlauch...
Kann mir hier jemand auf die Sprünge helfen ???
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
15.10.2022  
 




RudiB.
ach......, das wichtigste vergessen....die Aufsplittung der Befehlszeilen mit Backslash soll natürlich, wie im unteren Listing, beibehalten werden.
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
15.10.2022  
 




RudiB.
Das ist mein Versuch (LISTING) das Problem zu lösen...
cls
Declare zeile$,x%,pos%,pos2%,new_zeile$,next_zeile$,org_zeile$,End_kommentar$,kom%,array$[]
Declare Zeit&,Datei$
Datei$=Loadfile$("ÖFFNE:","*.prf")
Zeit&=&gettickcount
Assign #1,Datei$
reset #1
Print "Working.....Please Wait"

WhileNot EOF(#1)

    input #1,zeile$
    Org_Zeile$=Zeile$
    '-----------------------------------------------------------------------------------------------------------------------
    '          Ganzzeilige Kommentare und Blockkommentare in Leerzeilen wandeln
    '-----------------------------------------------------------------------------------------------------------------------

    If (Left$(Trim$(Zeile$),1)="'") Or (Left$(Trim$(Zeile$),2)="//")

        Zeile$=""
        Print Org_zeile$
        continue

    EndIf

    If Left$(Zeile$,2)="/*"

        Print Org_zeile$
        kom%=1
        continue

    EndIf

    If Left$(Zeile$,2)="*/"

        Print Org_zeile$
        kom%=0
        continue

    EndIf

    If kom%=1

        Zeile$=""
        Print Org_zeile$
        continue

    EndIf

    '-----------------------------------------------------------------------------------------------------------------------
    '-----------------------------------------------------------------------------------------------------------------------
    '          Doppelpunkte in Strings umwandeln
    '-----------------------------------------------------------------------------------------------------------------------

    IfNot right$(trim$(Zeile$),1)=chr$(92)

        If instr(chr$(58),Zeile$)

            pos%=0

            Whileloop Len(Zeile$)

                If mid$(Zeile$,&loop,1)=chr$(34)

                    pos%=Not(pos%)

                EndIf

                If (pos%=1) And (mid$(Zeile$,&loop,1)=Chr$(58))

                    New_Zeile$=New_Zeile$+chr$(247)

                Else

                    new_Zeile$=new_Zeile$+mid$(Zeile$,&loop,1)

                EndIf

            EndWhile

            If pos%=1

                Zeile$=Translate$(Zeile$,chr$(58),chr$(247))

            Else

                Zeile$=New_Zeile$
                new_zeile$=""

            Endif

        EndIf

    Endif

    '-----------------------------------------------------------------------------------------------------------------------
    '          Endkommentare abschneiden
    '-----------------------------------------------------------------------------------------------------------------------

    If (Instr("'",Trim$(Zeile$),2)) Or (Instr("//",Trim$(Zeile$),2))

        pos%=0
        End_kommentar$=""

        Whileloop Len(Zeile$)

            If mid$(Zeile$,&loop,1)=chr$(34)

                pos%=Not(pos%)

            EndIf

            If (mid$(Zeile$,&loop,1)="'") And (pos%=0)

                End_kommentar$=Right$(Zeile$,Len(Zeile$)-&loop+1)
                Zeile$=Left$(Zeile$,&loop-1)
                Break

            EndIf

            If (mid$(Zeile$,&loop,2)="//") And (pos%=0)

                End_kommentar$=Right$(Zeile$,Len(Zeile$)-&loop+1)
                Zeile$=Left$(Zeile$,&loop-1)
                Break

            EndIf

        EndWhile

    EndIf

    '-----------------------------------------------------------------------------------------------------------------------
    '          Doppelpunkt Befehlszeilen-Trennung
    '-----------------------------------------------------------------------------------------------------------------------

    IfNot right$(trim$(Zeile$),1)=chr$(92)

        If Instr(":",Zeile$)

            pos%=0
            pos2%=1
            new_zeile$=""

            While 1

                Pos%=Instr(":",Zeile$,pos2%)

                If pos%=0

                    Break

                EndIf

                If right$(Zeile$,1)=":"'Sprungmarker

                    break

                EndIf

                If (Left$(Trim$(lower$(Zeile$)),5)="case ") or (Left$(Trim$(lower$(Zeile$)),8)="casenot ")

                    Pos2%=Instr(":",Zeile$,pos%+1)

                    If pos2%=0

                        Break

                    EndIf

                EndIf

                new_Zeile$=Left$(Zeile$,pos%-1)
                new_Zeile$=Translate$(new_Zeile$,chr$(247),chr$(58))
                Print new_zeile$
                new_Zeile$=""
                Zeile$=right$(Zeile$,Len(Zeile$)-pos%)

            EndWhile

        EndIf

    Endif

    Zeile$=Translate$(Zeile$,chr$(247),chr$(58))
    Print zeile$+" "+End_kommentar$
    End_kommentar$=""
    new_zeile$=" "

EndWhile

Close #1
Print &gettickcount-Zeit&
Print "FERTIG"
Waitinput
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
15.10.2022  
 




Walter
Hier ein erster Ansatz, der einfach feststellt, ob man sich bei einem Doppelpunkt innerhalb eines Strings befindet oder nicht.
Bzgl. Case muss erst noch geklärt werden, ob nur der erste Doppelpunkt danach bleiben soll bzw. wie man mit weiteren verfährt.
'## Kommentarzeilen sind hier nicht berücksichtigt
'## case ist hier noch nicht berücksichtigt
cls
Declare Datei$
declare StringAn%,i%,in$,out$,a$[]
StringAn%=0' 0=Außerhalb eines Strings, 1=Innerhalb eines Strings
Datei$=Loadfile$("ÖFFNE:","*.prf")
Assign #1,Datei$
reset #1
Print "Working.....Please Wait"

WhileNot EOF(#1)

    input #1,in$
    a$[]=explode(in$)' Zeichen der Zeile in ein Array schreiben
    'Alle Zeichen der Zeile durchlaufen
    for i%,len(in$)
    ' Feststellen, ob man sich innerhalb eines Strings befindet
    case a$[i%-1]=Chr$(34) and StringAn%=0:StringAn%=1
    case a$[i%-1]=Chr$(34) and StringAn%=1:StringAn%=0

    if a$[i%-1]=":"

        If StringAn%=0'  :  ist nicht innerhalb eines Strings - Zeile teilen

            print out$
            out$=""

        else

            out$=out$+a$[i%-1]'  :  ist innerhalb eines Strings - Zeile fortsetzen

        endif

    else

        out$=out$+a$[i%-1]

    endif

    endfor
    print out$
    out$=""

EndWhile

Close #1
Print "FERTIG"
waitinput
 
19.10.2022  
 




RudiB.
Hallo Walter,

...schön das doch noch jemand auf dieses Thema antwortet.

Dein Ansatz ist ja richtig, doch der Teufel steckt ja im Detail...
Wenn ich z.B.: Eine Programmzeile die einen String beinhaltet, aber dann mit einem Backslash auf mehrere Zeilen aufgeteilt wird.
siehe hier....
a$=" der Hund geht zum \
hell brennenden Feuer um sich \
zu wärmen: ABER!!\
die Katze steht ihm im weg"

hier haperst dann gewaltig...

Ich weiß schon eine Lösung für mein Problem im allgemeinen, jedoch würde ich gerne auch eine Lösung dafür finden, wenn ich eine Datei Zeilenweise einlese ....
Es gibt auch hierfür eine Lösung .... hier müsste dann aber jede Zeile durch mehrere Abfragen laufen, was natürlich sehr viel Zeit kostet.....

Ich hab eben gehofft, jemand hat eine zündende Idee, auf die ich nicht komme...

Gruß aus München
Rudi
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
19.10.2022  
 




Walter
Mein Programmstück kommt mit Deinem Code
a$=" der Hund geht zum \
hell brennenden Feuer um sich \
zu wärmen: ABER!!\
die Katze steht ihm im weg"

aber bestens zurecht...
 
19.10.2022  
 




Walter
Sorry - schon gesehen.
Schau ich mir weiter an...
 
19.10.2022  
 




RudiB.
DANKE...
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
19.10.2022  
 




Walter
Bähhh - war nur ein kleiner Fehler drin...
Jetzt geht das!
'## Kommentarzeilen nicht berücksichtigt
'## case nicht berücksichtigt
cls
Declare Datei$
declare StringAn%,i%,in$,out$,a$[]
StringAn%=0
Datei$=Loadfile$("ÖFFNE:","*.prf")
Assign #1,Datei$
reset #1
Print "Working.....Please Wait"

WhileNot EOF(#1)

    input #1,in$
    a$[]=explode(in$)' Zeichen der Zeile in Array schreiben
    'Alle Zeichen der Zeile durchlaufen
    for i%,len(in$)
    ' Feststellen, ob man sich innerhalb eines Strings befindet

    if (a$[i%-1]=Chr$(34)) and (StringAn%=0)

        StringAn%=1

    elseif (a$[i%-1]=Chr$(34)) and (StringAn%=1)

        StringAn%=0

    endif

    if a$[i%-1]=":"

        If StringAn%=0' : ist nicht innerhalb eines Strings - Zeile teilen

            print out$
            out$=""

        else

            out$=out$+a$[i%-1]' : ist innerhalb eines Strings - Zeile fortsetzen

        endif

    else

        out$=out$+a$[i%-1]

    endif

    endfor
    print out$
    out$=""

EndWhile

Close #1
Print "FERTIG"
waitinput
 
19.10.2022  
 




RudiB.
Ich arbeite ja auch dran.... aber scheinbar seh ich den Wald vor lauter Bäumen nicht.... oft ist es so einfach...hab ich schon so oft hier im Forum erlebt...
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
19.10.2022  
 




RudiB.
wow....kurz probiert mit dem Test-Listing, wie hast Du jetzt das gemacht????
..muss Deinen Code mal anschauen...
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
19.10.2022  
 




Walter
Hier nun samt case / caseNot:
Dabei hab ich mich daran gehalten, dass normalerweise alle  auf case folgenden Befehle in derselben Zeile bei true abgearbeitet werden, während bei false sofort in die nächste Zeile gesprungen wird.
(Aus der Hilfe: Case N : BEF
Hat der Ausdruck N einen Wert <> 0, wird BEF ausgeführt, ansonsten geht die Programmausführung in die nächste Zeile...)
' Das Codestück teilt Befehlszeilen bei ":" in neue Zeilen auf,
' außer
' a) der ":" befindet sich innerhalb eines Stringliterals; oder
' b) bei case/caseNot. Hier bleiben alle ":" in derselben Zeile _nach_ einem
' case/caseNot erhalten (allerdings bisher noch ohne Berücksichtigung von
' Umbrüchen langer Codezeilen)
' Kommentarzeilen sind nicht berücksichtigt;
' die müssen ggf vorher ausgeschieden werden
cls
Declare Datei$
declare StringAn%,i%,in$,out$,a$[]
declare caseAn%,pos%
StringAn%=0
CaseAn%=0
Datei$=Loadfile$("ÖFFNE:","*.prf")
Assign #1,Datei$
reset #1
Print "Working.....Please Wait"

WhileNot EOF(#1)

    input #1,in$
    a$[]=explode(in$)' Zeichen der Zeile in Array schreiben
    ' Falls case oder caseNot drin: Position feststellen
    pos%=instr("case ",lower$(in$))
    case pos%=0:pos%=instr("casenot ",lower$(in$))

    if pos%=0' KEIN case drin

        'Alle Zeichen der Zeile durchlaufen
        for i%,len(in$)
        ' Feststellen, ob man sich innerhalb eines Strings befindet

        if (a$[i%-1]=Chr$(34)) and (StringAn%=0)#

            StringAn%=1

        elseif (a$[i%-1]=Chr$(34)) and (StringAn%=1)

            StringAn%=0

        endif

        if a$[i%-1]=":"

            If StringAn%=0' : ist nicht innerhalb eines Strings - Zeile teilen

                print out$
                out$=""

            else

                out$=out$+a$[i%-1]' : ist innerhalb eines Strings - Zeile fortsetzen

            endif

        else

            out$=out$+a$[i%-1]' anderes Zeichen als :

        endif

        endfor

    else' case bzw caseNot drin

        'Alle Zeichen der Zeile bis zu case durchlaufen
        for i%,pos%-1
        ' Feststellen, ob man sich innerhalb eines Strings befindet

        if (a$[i%-1]=Chr$(34)) and (StringAn%=0)

            StringAn%=1

        elseif (a$[i%-1]=Chr$(34)) and (StringAn%=1)

            StringAn%=0

        endif

        if a$[i%-1]=":"

            If StringAn%=0' : ist nicht innerhalb eines Strings - Zeile teilen

                print out$
                out$=""

            else

                out$=out$+a$[i%-1]' : ist innerhalb eines Strings - Zeile fortsetzen

            endif

        else

            out$=out$+a$[i%-1]' ein anderes Zeichen als :

        endif

        endfor

    endif

    if pos%>0

        ' Rest der case-Zeile in eine neue Zeile schreiben
        print mid$(in$,pos%,len(in$)-pos%+1)

    else

        print out$
        out$=""

    endif

EndWhile

Close #1
Print "FERTIG"
waitinput

Gerne nachfragen, sofern die Kommentare nicht ausreichen.
Fehler sind natürlich möglich...
 
19.10.2022  
 




Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

7.943 Betrachtungen

Unbenanntvor 0 min.
Member 862464112.05.2024
Cyberangle03.02.2023
RudiB.02.02.2023
Normann Strübli31.01.2023
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

RudiB. (13x)
Walter (8x)
Georg Teles (3x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie