Array-Operator zur Stringearbeitung [Erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Array-Operator zur Stringearbeitung [Erledigt]

Beitrag von Jan »

Ich kann ja einzelne Zeichen aus einem String direkt ansprechen durch cString[n]. Aber wie mache ich das bei einer Zuweisung? Ich dachte,

Code: Alles auswählen

cString[1] := Upper(cString[1])
würde gehen. Klappt aber nicht. Wo liegt da mein Denkfehler?

VX gibt mir dazu im Command Window diese Meldung aus:
#Invalid input, no handler available!
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Klaus Stebner
UDF-Programmierer
UDF-Programmierer
Beiträge: 66
Registriert: Fr, 29. Feb 2008 20:53
Wohnort: Furtwangen

Re: Array-Operator zur Stringearbeitung

Beitrag von Klaus Stebner »

Hallo Jan,

nach upper steht eine eckige Klammer!

Ändere Mal in :

Code: Alles auswählen

cString[1] := Upper(cString[1])
Gruß Klaus
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung

Beitrag von Jan »

Hallo Klaus,

hast Recht. Aber nicht ganz. Das war nur ein Typo beim Schreiben meines beitrages.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung

Beitrag von Martin Altmann »

Moin,
ich denke, das liegt an dem Ziel!
Mach mal:

Code: Alles auswählen

cString := Upper( cString[1] ) + substr( cString, 2 )
Oder:

Code: Alles auswählen

cString := Upper( left( cString, 1 ) ) + substr( cString, 2 )
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung

Beitrag von brandelh »

Bist du sicher, dass es das Zeichen mit dem Index tatsächlich gibt ?
Das ist nämlich der Nachteil der neuen Syntax !

cTemp := substr("ABC",5,1) ergibt halt "" ohne Fehler.
cTemp := "ABC"[5] ... ich hoffe das ist erlaubt, soll aber ja nur zeigen, dass hier versucht wird per Index auf einen zu kurzen String zuzugreifen, das knallt dann.
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2827
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: Array-Operator zur Stringearbeitung

Beitrag von georg »

Guten Morgen,

Code: Alles auswählen

cstring := "abc"
C: "abc"
cstring[1] := upper(cstring[1])
C: "A"
Ausgeführt im xppdbg. Geht also.

Wobei ich Huberts Hinweis wichtig finde, dass bei Verwendung des Array-Operators genau auf die Länge geprüft werden muss.

Ein einzelnes Array-Element kann problemslos ein lValue sein.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung

Beitrag von Jan »

Ja, lt. Onlinehilfe geht das. Und der String hat definitiv einen Wert, das kann ich im Debugger sehen.

Im Command-Window kann ich mir cString[1] ausgeben lassen. Das klappt also. Die Zuweisung ist das Problem. Selbst wenn ich ein

Code: Alles auswählen

cString[1] := "E"
mache, gibt es die oben beschriebenen Fehlermeldung.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung

Beitrag von Martin Altmann »

Ah! Moment!
Ist cString local? Oder private? Das klappt nämlich nur in bestimmten Fällen!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung

Beitrag von Jan »

Moin Martin,

cString ist PUBLIC.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung

Beitrag von brandelh »

Jan hat geschrieben:Moin Martin,
cString ist PUBLIC.
Jan
Handbuch: [ ]Operator - Array-Operator (binär): Zugriff auf ein bestimmtes Arrayelement hat geschrieben: Erweiterte Funktionalität des Array-Operators
Der Array-Operator ist nicht auf Werte vom Datentyp "Array" beschränkt, sondern kann auch auf Zeichenketten und numerische Werte angewandt werden. Hinweis: In der aktuellen Xbase++ Version ist der Operator bei Zuweisungen nur bei LOCAL oder STATIC Variablen, denen die Zeichenkette bzw. der numerischen Wert zugewiesen ist, anwendbar.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung

Beitrag von Jan »

Hallo Hubert,

aaahhh! Ok, Danke für den Hinweis. Werde das mal entsprechend umbauen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung [Erledigt]

Beitrag von Martin Altmann »

Moin,
hatte ich damals aber beim XUG-Meeting in OS auch drauf hingewiesen 8)

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung [Erledigt]

Beitrag von brandelh »

Martin Altmann hat geschrieben:Moin,
hatte ich damals aber beim XUG-Meeting in OS auch drauf hingewiesen 8)
und wieder hört keiner auf dich :wink:
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Array-Operator zur Stringearbeitung [Erledigt]

Beitrag von Manfred »

Jaja,

so ist das Leben. Der eine hört nicht, der andere liest nicht.... :lol:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung [Erledigt]

Beitrag von Jan »

Och menno, das Treffen ist soooo lange her. Wer erinnert sich denn da noch an alle Einzelheiten?

Nein, im Ernst. Ich selber nutze die Stringverarbeitung mittels Makrooperator seitdem regelmäßig. Aber ich arbeite auch nahezu grundsätzlich mit LOCALs. Und da hat das natürlich immer wunderbar funktioniert. Nur in diesem Projekt, da ist nahezu alles PUBLIC deklariert (oder auch garnicht). Und da das bei mir immer funktioniert hat, habe ihc an den Fallstrick PUBLIC einfach nicht mehr gedacht.

Gibt es eigentlich einen rationalen Grund, warum das mit PUBLICs nicht funktioniert? Würde mich mal interessieren.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung [Erledigt]

Beitrag von brandelh »

Eine LOCAL wird vom Compiler direkt auf eine Speicheradresse umgesetzt.

Variable[5] ist also nicht die 5. Stelle der Variablen (egal welcher Name) sondern der POINTER auf den Speicher verschoben um 5 Bytes.
Eine Public ist zunächst nur ein NAME (ähnlich einem Text-Alias), der wird in einer Tabelle von Namen gesucht (ähnlich einem Array(Name, SpeicherAdresse)).
Dies könnte man intern abfangen und auf die richtige Adresse sinngemäß anwenden, bisher ist das aber nicht geschehen ;-)
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Array-Operator zur Stringearbeitung [Erledigt]

Beitrag von UliTs »

brandelh hat geschrieben:Variable[5] ist also nicht die 5. Stelle der Variablen (egal welcher Name) sondern der POINTER auf den Speicher verschoben um 5 Bytes.
Bei numerischen Werten ist es das entsprechende Bit von "Variable" und eine Zuweisung wird entsprechend umgesetzt, dass nur dieses Bit verändert wird!
Bei Zeichen-Werten ist es das entsprechende Zeichen von "Variable" und eine Zuweisung wird entsprechend umgesetzt, dass nur dieses Zeichen verändert wird. Das wird sicher mit einem Zeiger realisiert; wenn Du ihn aber mit dem Zeiger auf die String-Variable vergleichst, ist er in Deinem Bespiel (Variable[5]) aber nur um 4 Zeichen verschoben (bei 8-Bit-Zeichensätzen = 4 Bytes). :-)

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten