C++ String-Konstante.

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

C++ String-Konstante.

Beitrag von Mathias »

Kennt jemand eine Lösung, wie man sowas mit C++ macht ?

Code: Alles auswählen

var
  s: string = #3 + ' Hello World ' + #3;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

deadc0de
Beiträge: 56
Registriert: So 24. Jan 2016, 18:31
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian
CPU-Target: 64Bit + 32Bit
Wohnort: Winnenden
Kontaktdaten:

Re: C++ String-Konstante.

Beitrag von deadc0de »

Etwa so.

Code: Alles auswählen

 
include <iostream>
include <string> // Nötig bei Strings in C++
 
int main(){
std::string a = "Hallo, Welt"; //Speichert den String in Variable a
}
 

Mit dem + Operator kannst du Verketten

Dann gibt es noch C-Strings, die Funktionieren im Grunde genau wie ein Array, sollten aber aufgrund der Typsicherheit nicht in C++ verwendet werden.
Hat das deine Frage beantwortet? Ansonsten wäre es Hilfreich, wenn ich wüsste, für was du es benötigst.
Wissen ist Macht und ich weis, das ich nichts weis

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ String-Konstante.

Beitrag von Mathias »

Danke, hat sich erledigt.

Code: Alles auswählen

String text = "\3 Hello World \3";


Hat das deine Frage beantwortet? Ansonsten wäre es Hilfreich, wenn ich wüsste, für was du es benötigst.

Ich habe es benötigt, weil ich eine Laufschrift für den Arduino schreibe.
Ich wollte links und rechts von "Hello World" ein Herz.

Dann gibt es noch C-Strings, die Funktionieren im Grunde genau wie ein Array, sollten aber aufgrund der Typsicherheit nicht in C++ verwendet werden.

Meinst du diese Lösung ?

Code: Alles auswählen

char s[] = "\3 Hello World \3"

Die wäre sicher Resorcen schonender als der String.
Nur, wie könnte ich da die Länge des Stringes ermitteln ?
Bein Code mit dem String, kann ich einfach text.length(), schreiben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

deadc0de
Beiträge: 56
Registriert: So 24. Jan 2016, 18:31
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian
CPU-Target: 64Bit + 32Bit
Wohnort: Winnenden
Kontaktdaten:

Re: C++ String-Konstante.

Beitrag von deadc0de »

Ja, diese Lösung bietet sich an. Die Sache mit der der Länge geht sehr einfach mit dem "sizeof" Operator. Mit diesem kannst du sehr schnell die Länge eines C-Strings bestimmen. Ressourcen schonender ist es in jedem Fall, was auf dem Arduino sicher ein Vorteil ist.
Wissen ist Macht und ich weis, das ich nichts weis

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ String-Konstante.

Beitrag von Mathias »

Ich habe es jetzt mit char s[] getestet, dies funktioniert wunderbar.

Aber dafür kann ich nachträglich nichts mehr ändern.

Hier gibt es einen Syntax-Fehler

Code: Alles auswählen

char text[] = "\3 Hello World \3";
 
void setup()
{
   text = text + "abc"; // Fehler
        ...
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

deadc0de
Beiträge: 56
Registriert: So 24. Jan 2016, 18:31
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian
CPU-Target: 64Bit + 32Bit
Wohnort: Winnenden
Kontaktdaten:

Re: C++ String-Konstante.

Beitrag von deadc0de »

Versuche es mal so:

Code: Alles auswählen

 
char text[] = "\3 Hello World \3";
 
void setup()
{
   text += "abc"; //
        ...
 


Ansonsten ist die "main" Funktion unbedingt nötig, hast du da eine? Sonst Probiere ich das ganze mal aus, weil Eigentlich ist die Syntax richtig, soweit ich das beurteilen kann.
Wissen ist Macht und ich weis, das ich nichts weis

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ String-Konstante.

Beitrag von Mathias »

Ansonsten ist die "main" Funktion unbedingt nötig, hast du da eine?

Nicht direkt, aber in der Arduino-Bibliothek, gibt es eine main.cpp, und dort werden Setup() und loop() aufgerufen.

Machen die beiden Operatoren nicht das Gleiche ?

Code: Alles auswählen

text += "abc";
text = text + "abc";
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

deadc0de
Beiträge: 56
Registriert: So 24. Jan 2016, 18:31
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian
CPU-Target: 64Bit + 32Bit
Wohnort: Winnenden
Kontaktdaten:

Re: C++ String-Konstante.

Beitrag von deadc0de »

Doch, die machen das selbe. Aber die eine Variante lässt sich schneller lesen. Ich schaue mir die Arduino Bibliothek mal in Ruhe an. Vielleicht liegt es auch daran. Weil die Syntax ist ja richtig.
Wissen ist Macht und ich weis, das ich nichts weis

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: C++ String-Konstante.

Beitrag von Requion »

deadc0de hat geschrieben:Versuche es mal so:

Code: Alles auswählen

 
char text[] = "\3 Hello World \3";
 
void setup()
{
   text += "abc"; //
        ...
 


Ansonsten ist die "main" Funktion unbedingt nötig, hast du da eine? Sonst Probiere ich das ganze mal aus, weil Eigentlich ist die Syntax richtig, soweit ich das beurteilen kann.

"text" ist in dem Falle ja das Array "text[]". Deshalb ist

Code: Alles auswählen

text = "randomtext"
nicht möglich.
Um Werte in ein C-Style String zu bringen wird strcpy() verwendet.

Code: Alles auswählen

strcpy(text, text + "abc");

Da ist aber noch die größe des Arrays zu beachten.
Durch deine Initialisierung mit "\3 Hello World \3" ist das Array meines Wissens nach auch nur 15 Zeichen lang, d.h. ein erweitern würde "out of bounds" gehen und eventuell anderen Speicher überschreiben.
Deshalb sollten C-Style strings nicht mehr verwendet werden. Da gibt es einiges zu beachten.

Noch bisschen Lesestoff dazu http://www.learncpp.com/cpp-tutorial/66-c-style-strings/

Eine Möglichkeit um das Größenproblem zu umgehen wäre gleich dem String (Array) eine feste, bekannte größe zu geben.

Code: Alles auswählen

int size(255);
char text[size] = "\3 Hello World \3";

So kannst du den String innerhalb der Größe beliebig ändern, verlängern und verkürzen. Allerdings würdest du dann den Speicher für 255 Zeichen reservieren, auch wenn er nicht benutzt wird. Außerdem funktioniert dann sizeof(text) nicht mehr zur Überprüfung der stringlänge. Dafür kann dann aber die Funktion "std::strlen(text)" verwendet werden. Dafür noch "#include <cstring>" einfügen. Außerdem ist es auf diese Art (mit der "size" Variable) einfacher den String an Funktionen zu übergeben und darin zu manipulieren.

Und "strncpy()" ist auch interessant. Da gibst du die maximale Anzahl an Zeichen mit um ein Overflow zu vermeiden.
Da könntest du dann

Code: Alles auswählen

strncpy(text, text + "abc", size)
machen.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

deadc0de
Beiträge: 56
Registriert: So 24. Jan 2016, 18:31
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian
CPU-Target: 64Bit + 32Bit
Wohnort: Winnenden
Kontaktdaten:

Re: C++ String-Konstante.

Beitrag von deadc0de »

Mist, das mir das nicht selber gekommen ist. Sorry, habe halt anscheinend zu lange nichts mehr in C/C++ gemacht. :D
Wissen ist Macht und ich weis, das ich nichts weis

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ String-Konstante.

Beitrag von Mathias »

Code: Alles auswählen

int size(255);

Das sieht auch so komisch aus, da verwende ich lieber:

Code: Alles auswählen

int size = 255;


Und "strncpy()" ist auch interessant. Da gibst du die maximale Anzahl an Zeichen mit um ein Overflow zu vermeiden.

Das wäre fast, wie bei den alten Pascal-Strings.

Gibt es unter C nicht was ähnliches, wie die dynamische Array unter FPC ?

Code: Alles auswählen

var s:array of Char

Oder muss man da auf Vector zurückgreifen, welcher einen grossen Overhead hat ?

So wie es aussieht, ist man als Lazarusianer richtig verwöhnt. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

deadc0de
Beiträge: 56
Registriert: So 24. Jan 2016, 18:31
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian
CPU-Target: 64Bit + 32Bit
Wohnort: Winnenden
Kontaktdaten:

Re: C++ String-Konstante.

Beitrag von deadc0de »

Ne, geht nicht soweit ich weiß. Ja, mit Lazarus wird einem schon viel Arbeit abgenommen. :D C# ist da ja sehr ähnlich.
Wissen ist Macht und ich weis, das ich nichts weis

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ String-Konstante.

Beitrag von Mathias »

Was ich so komisch finde, ich habe schon vielfach gehört, das C/C++ eine Sprache für Tipfaule Leute ist.
Aber im Vergleich zu Pascal ist da eher das Gegenteil. Nur schon eine For-To-Schleife ist der Horror unter C.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

deadc0de
Beiträge: 56
Registriert: So 24. Jan 2016, 18:31
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian
CPU-Target: 64Bit + 32Bit
Wohnort: Winnenden
Kontaktdaten:

Re: C++ String-Konstante.

Beitrag von deadc0de »

2 Grundverschiedene Sprachen. C/C++ ist eher etwas um Speicher zu sparen. Na, merkste was? Heute ist Speicher sparen im kb Bereich einfach nur Unnötig, deshalb ist der Sinn von C/C++ auch eher Fraglich. Pascal, JAVA, Python usw. machen es dem Entwickler einfach, sowas braucht man in der Modernen Programmierung.
Wissen ist Macht und ich weis, das ich nichts weis

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ String-Konstante.

Beitrag von Mathias »

2 Grundverschiedene Sprachen. C/C++ ist eher etwas um Speicher zu sparen. Na, merkste was? Heute ist Speicher sparen im kb Bereich einfach nur Unnötig, deshalb ist der Sinn von C/C++ auch eher Fraglich.

Da hast du leider recht.
Ein einfaches Hello World, bracht bei C++ 8,6KB und mit FPC 178KB.
Aber das liegt nicht unbedingt an der Sprache Pascal, Turbo-Pascal braucht sogar nur 2,8KB,
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten