C++ String-Konstante.

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.

C++ String-Konstante.

Beitragvon Mathias » 1. Sep 2016, 17:24 C++ String-Konstante.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2799
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon deadc0de » 1. Sep 2016, 18:14 Re: C++ String-Konstante.

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
deadc0de
 
Beiträge: 56
Registriert: 24. Jan 2016, 18:31
Wohnort: Winnenden
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian | 
CPU-Target: 64Bit + 32Bit
Nach oben

Beitragvon Mathias » 1. Sep 2016, 19:04 Re: C++ String-Konstante.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2799
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon deadc0de » 1. Sep 2016, 19:32 Re: C++ String-Konstante.

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
deadc0de
 
Beiträge: 56
Registriert: 24. Jan 2016, 18:31
Wohnort: Winnenden
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian | 
CPU-Target: 64Bit + 32Bit
Nach oben

Beitragvon Mathias » 1. Sep 2016, 21:21 Re: C++ String-Konstante.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2799
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon deadc0de » 1. Sep 2016, 21:40 Re: C++ String-Konstante.

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
deadc0de
 
Beiträge: 56
Registriert: 24. Jan 2016, 18:31
Wohnort: Winnenden
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian | 
CPU-Target: 64Bit + 32Bit
Nach oben

Beitragvon Mathias » 1. Sep 2016, 21:51 Re: C++ String-Konstante.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2799
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon deadc0de » 1. Sep 2016, 22:19 Re: C++ String-Konstante.

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
deadc0de
 
Beiträge: 56
Registriert: 24. Jan 2016, 18:31
Wohnort: Winnenden
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian | 
CPU-Target: 64Bit + 32Bit
Nach oben

Beitragvon Requion » 2. Sep 2016, 07:24 Re: C++ String-Konstante.

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.
Requion
 
Beiträge: 106
Registriert: 3. Feb 2016, 09:39
Wohnort: nahe Grimma
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0) | 
CPU-Target: 32/64Bit,ARM(RPi)
Nach oben

Beitragvon deadc0de » 2. Sep 2016, 12:20 Re: C++ String-Konstante.

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
deadc0de
 
Beiträge: 56
Registriert: 24. Jan 2016, 18:31
Wohnort: Winnenden
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian | 
CPU-Target: 64Bit + 32Bit
Nach oben

Beitragvon Mathias » 2. Sep 2016, 17:08 Re: C++ String-Konstante.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2799
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon deadc0de » 2. Sep 2016, 17:16 Re: C++ String-Konstante.

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
deadc0de
 
Beiträge: 56
Registriert: 24. Jan 2016, 18:31
Wohnort: Winnenden
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian | 
CPU-Target: 64Bit + 32Bit
Nach oben

Beitragvon Mathias » 2. Sep 2016, 17:28 Re: C++ String-Konstante.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2799
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon deadc0de » 2. Sep 2016, 17:56 Re: C++ String-Konstante.

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
deadc0de
 
Beiträge: 56
Registriert: 24. Jan 2016, 18:31
Wohnort: Winnenden
OS, Lazarus, FPC: Windows(10,8.1,7), Archlinux, Debian | 
CPU-Target: 64Bit + 32Bit
Nach oben

Beitragvon Mathias » 2. Sep 2016, 18:57 Re: C++ String-Konstante.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2799
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Programmierung



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast

porpoises-institution
accuracy-worried