Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

1

02.04.2013, 21:05

Wie gebe ich meinen char-Array zurück?

Hey Leute,
ich wollte mal fragen, wie ich am besten den char-Array in meiner Funktion "ToUpper()" zurückgebe.(Ich weiß diese Funktion gibts schon in nem fertigen header usw. wollte mich aber mal selbst ansowas setzen^^)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
char ToUpper(char str[])
{
  for(int i=0;i<SoA(str);i++)
  {
     char chr=str[i]; 
     if((chr>=97)&&(chr<=122))
     {
        str[i]&=0xdf; 
     }
   }
   return str[]; <---
}


Hier der Aufruf:

C-/C++-Quelltext

1
2
3
char upper[]="this should be big now";

std::cout << "To Upper: " << ToUpper(upper) << std::endl;


Mein Fehler:

Quellcode

1
1>c:\users\arthur\desktop\intrmdtlvl.h\intrmdtlvl.h(20) : error C2059: Syntaxfehler: ']'

Hab den Fehler im Code mit nem Pfeil markiert.
Achja: SoA() ist eine kleine Funktion um die Größe des Arrays zu berechnen.

Ich bin noch bei den Grundlagen usw. wollte diese eigentlich festigen aber dann kommt sowas ._.'

EDIT: Was ich vergessen zu sagen habe, ist dass Google mir auch nicht grad das beste ausgespuckt hat.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »m3xx« (02.04.2013, 22:46)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

02.04.2013, 22:37

Keine Ahnung was bei dir SoA ist.
Aber zum Problem: erstmal ist der Return Typ nur char und nicht char* wie es sein sollte. Zum anderen sind die [] beim return falsch. Warum versuchst du es damit?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

3

02.04.2013, 22:39

Ich weiß nicht, ich habe so noch nicht mit einem char-Array in einer Funktion gearbeitet bzw überhaupt mit einem Array in einer Funktion, scheint etwas komplizierter zu sein als mit einer gewöhnlichen Variable.
Wie würde das mit dem char* funktionieren?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

02.04.2013, 23:08

Die Übergabe eines normalen Arrays an eine Funktion ist nichts anderes, als würdest du einen Pointer auf das erste Element an die Funktion übergeben.
Sprich:
toUpper(char str[]) { ist dasselbe wie toUpper(char* str) {

Und wie es funktionieren würde: Einfach deinen Return Typ auf char* ändern. Also noch ein Sternchen ran.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

02.04.2013, 23:22

Du solltest grundsätzlich std::string statt char* benutzen, das erspart dir unglaublich viel Ärger.
Lieber dumm fragen, als dumm bleiben!

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

02.04.2013, 23:31

Du solltest grundsätzlich std::string statt char* benutzen, das erspart dir unglaublich viel Ärger.

Er experiementiert ja auch nur. Ich denke mal er wollte grundsätzlich einen besseren Umgang mit Zeigern und Arrays erlernen. Dafür ist eine derartige Übung recht gut.
Aber ansonsten hat Jonathan natürlich recht, im alltäglichen Gebrauch sollte man std::string beinahe immer den Vorzug geben.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

03.04.2013, 13:31

Ich glaube ihm war nicht klar, was Zeiger und Arrays gemeinsam haben. Ansonsten hätte er ja verstanden, warum er den Stern an den Rückgabetyp hängen kann. Ich versteh schon nicht warum so viele C++ Bücher am Anfang groß viel zu Char-Arrays sagen. Viel einfacher wäre es erst mal String vorzustellen und dann später darauf einzugehen. Festzuhalten für dich wäre aber, du solltest dir die Klasse String angucken. Und was die Char-Arrays angeht. Wenn du damit arbeiten möchtest/musst, dann solltest du ein vernünftiges Verständnis von Zeigern haben. Allgemein solltest du das für Arrays haben. Wobei auch was Arrays angeht, solltest du dir gewisse Klassen für Datenstrukturen mal genauer ansehen. Bei C++ ist ein gutes umfangreiches Buch einfach Gold wert.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

03.04.2013, 15:46

Eine Funktion in C++ kann kein Array als Rückgabetyp haben. Deine Funktion verändert aber sowieso bereits das übergebene Array...

Leider folgen rohe Arrays in C und infolgedessen auch in C++ teilweise sehr obskuren Regeln. (So ist der Parameter str deiner Funktion ToUpper() rein technisch gesehen z.B. kein Array, auch wenn die Deklaration wie die eines Arrays aussieht und praktisch überall sonst auch tatsächlich eine bestimmte Art von Array deklarieren würde, nur gerade dort eben nicht.) C++ bietet mit std::vector, std::array und std::unique_ptr je nach Situation verschiedene Alternativen zu rohen Arrays. Arrays und vor allem ihr Zusammenspiel mit Pointern sind allerdings sehr wesentliche Grundlagen der Sprache und gerade Strings eignen sich imo ideal dafür, diese Grundlagen zu erlernen. Auch wenn für später, schon allein aus Komfortgründen, auf jeden Fall std::string zu empfehlen ist, find ich es sehr gut, wenn man nicht gleich von Anfang an std::string benutzt, sondern erstmal den Umgang mit Arrays lernt, bevor man dazu übergeht, Strings als reine Black-Box zu behandeln. Dazu vielleicht ein paar Tips für Anfänger:
  • Lern wie Arrays und Pointer zusammenhängen. Man hört bzw. liest leider sehr oft, dass Arrays in C und C++ nichts anderes seien als Pointer. Das ist völlig falsch. Wann auch immer du so etwas liest, glaub kein Wort von dem, was dort steht. Ein Array kann in C und C++ implizit in einen Pointer auf das erste Element konvertiert werden, so wie z.B. auch ein int implizit in einen bool konvertiert werden kann (ein Wert von Null wird zu false, alles andere zu true). Arrays sind trotzdem völlig andere Gebilde als Pointer, genauso wie ein int trotzdem etwas völlig anderes ist als ein bool.
  • Lern, was der [] Operator wirklich tut und wieso er auf Arrays überhaupt funktioniert.
  • Und wann immer du ein Array an eine Funktion übergeben willst, tu das, indem du explizit einen Zeiger auf das erste Element übergibst. Auf diese Art kannst du unnötiger Verwirrung durch eine der sehr obskuren Eigenheiten von C bzw. C++ geschickt aus dem Weg gehen...

m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

9

03.04.2013, 18:36

Was ein String ist weiß ich ;)
Ich kenne auch "string.h"^^
Ich bin, wie Architekt bereits erwähnte, halt dabei zu experimentieren. Gehört ja auch dazu ;)
Ich weiß das man ohne Buch niemals gutes C++ lernen wird. Bin halt aber noch bei den Grundlagen mit Heikos Buch. Außerdem habe ich mir heute in der Buchhandlung "Der C++ Programmierer" bestellt, müsste so die Tage kommen :)
--> Für die nächsten Tage, genug Stoff um etwas zu erarbeiten. :)

Aber danke für eure Ratschläge :)
Btw danke Architekt^^
Hätte nicht gedacht das ein einfach Pointer das Problem löst. :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »m3xx« (03.04.2013, 18:43)


patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

03.04.2013, 18:53

Eigentlich braucht man keinen Rückgabewert, da ToUpper den (C-)String über den Pointer modifiziert.

C-/C++-Quelltext

1
2
3
char* str = "groß";
ToUpper(str);
cout << "ToUpper: " << str << endl;

und

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void ToUpper(char str[])
{
  for(int i=0;i<SoA(str);i++)
  {
     char chr=str[i]; 
     if((chr>=97)&&(chr<=122))
     {
        str[i]&=0xdf; 
     }
   }
}

würde eigentlich volkommen ausreichen.

Werbeanzeige