[C++] Verständnis Problem mit functions

F0rris

Mitglied
Hallo zusammen,

ich wühle mich grade durch ein C++ tutorial, mein Problem ist das ich davor einige Jahre mit PHP gearbeitet habe. Wenn ich nun eine Funktion erstellen will, dann würde ich es in PHP So machen:
PHP:
function foo($blub, $showIt = FALSE)
{
      $blub += 2;

      if($showIt === TRUE)
      {
            echo $blub;
      }

      return $blub;
}

// Keine ausgabe, return 12
foo(int 12);

wärend ich in C++ die Funktion erst Deklarieren muss um sie dann noch zu Definieren.

C:
#include <iostream>

using namespace std;


int test(int blub, bool showIt = false);

int main()
{
     test(12);

     return 0;
}

int test(int blub, bool showIt = false)
{
      blub += 2;

      if(showIt === TRUE)
      {
             cout << blub << endl;
      }

      return blub;
}

Kann mir vielleicht einer erklären, wieso das so bzw. dafür eine Faustregel geben? Ich würde lügen, wenn ich sage das es mir nicht verwirrt. Oder anders ich will das im moment nicht verstehen, wieso das so umständlich ist.

Mein nächstes Problem ist auch, dass ich in C++ ein array mit einer festen größe erstellen muss. Da war PHP schon sehr zuvor kommend ;). Wie mach ich das am Besten, wenn ich eine Mehrdimensionale Array habe, in der ich int, bool und char speichern will?

Beste Grüße F0rris
 
Hi

die Extra-Definition ist nur nötig, wenn die eigentliche Funktion
nach einer Stelle kommt, wo sie verwendet wird.

Du rufst test ja im main auf.
C-Compiler arbeiten die Quelltexte ziemlich stur von oben nach unten ab.
Wenn jetzt die Zeile vor dem main nicht wäre, wäre das test(12); das erste test,
auf das der Compiler kommt. Und dann heißts "Was test, kenn ich nicht".

Man könnte das Ganze auch so machen:
C++:
#include <iostream>
 
using namespace std;

int test(int blub, bool showIt = false)
{
      blub += 2;
 
      if(showIt === TRUE)
      {
             cout << blub << endl;
      }
 
      return blub;
}

int main()
{
     test(12);
 
     return 0;
}
Die komplette Funktion vor ihre Aufrufstelle.

Aber a) will man dem Programmierer etwas Freiheit bei der Anordnung lassen
b) gibts Situationen, wo sich zwei Funktionen gegenseitig brauchen.
Was schreibt man dann als Erstes?
Deshalb kann man Funktionen so im Voraus "ankündigen".

Nochwas zum ===TRUE:
Ein dreifaches === gibts in C/C++ nicht.
In PHP überprüft man damit ja außer dem Wert noch die Typgleichheit.
In C/C++ gibts aber nicht so seltsam universelle Variablen, die jeden Wert haben können.
Der Typ einer Variable (int, float, double, short, char, string...)
muss im Voraus festgelegt sein.
Und da der Typ dann sowieso bekannt ist, braucht es nur den Wertevergleich ==

TRUE und true ist übrigens ein Unterschied.
Zu einem false sollte auch ein true.

Rest kommt gleich...
edit:
Arrays mit fester Größe...ja.

Arrays generell Mal:

Was man als "Array" zu verstehen hat, da tanzt PHP etwas aus der Reihe.
Die meisten Programmiersprachen kennen eine durchnummerierte Datensammlung als Array.
Ein a['hallo'] = 'bye'; gibts weder in C/C++, noch C#, Java...ziemlich nirgends.
Es ist schon überall möglich, aber es ist kein normales Array.

Zweiter großer Unterschied: Mit a[] = ... einfach mal ein Element dazuhängen geht auch nicht. Ein Array hat von Haus aus eine fixe Größe. Man kann sich schon jederzeit ein beliebig größeres Array besorgen und die alten Werte ins neue Kopieren, um wieder ein paar Freiplätze zu haben, aber das ist eben etwas umständlicher. Kein []= wie in PHP.

Punkt Drei: So wie Einzelvariablen haben auch Arrays fixe Typen.
Ein Array, in dem man beliebig Strings und doubles (Kommazahlen) mischen kann,
gibts ohne Zusatzarbeit nicht.

Bei deinen genannten Typen int/char/bool gibts aber eine eigentlich ziemlich einfache Lösung.

Kommt gleich...
edit:

Die Lösung: Mach ein int-Array. Fertig.
Warum?

Wenn ein int rein soll: Dass das keine Probleme macht, sollte klar sein.

char: Ist prinzipiell dazu gedacht, einen Buchstaben zu speichern.
Aber: Jeder Buchstabe hat eine Zahl zugeordnet, an der er erkannt wird
(Asciicode, Tabelle im Internet sichtbar).

Der Asciicode hat 256 Buchstaben+Sonderzeichen
(warum? Damit man mit 256=2^8 genau 8Bit, also ein Byte ausnutzt).

char ist also nichts weiter als eine 1-Byte-Zahl.Kann von 0 bis 255 zählen
(mit dem Nuller sinds 256), oder von -128 bis +127, insgesamt 256.

Ein int dagegen ist eine Zahl mit 4 Byte, 32 Bit, 2^32...
kann damit ungefähr bis 4 Milliarden zählen.
Da passt eine Zahl, die maximal 255 ist, doch locker rein...
ein char kann man also auch einfach in ein int speichern.

Und bool:
true/false kann man auch auf Zahlen übertragen: 1 und 0.
Und das passt auch in ein int, das auch 4294967295 speichern kann
(ist genau der Maximalwert, der in 4 Byte reinpasst).

bool kann man also auch in ein int stopfen.

Für Bedingungen geht das übrigens auch:
So wie man
C++:
bool b = true;
...
if(b)
...
schreiben kann, geht auch
C++:
int i = 1;
...
if(i)
...
Man darf natürlich i==1 schreiben, so gehts aber auch.
0 gilt als false, alles andere als true.

Gruß
 
Du musst auch nicht wirklich ein festes Array erzeugen, nur wird das in C(++) anders gemacht. In C (ich lass das ++ mal weg, denn was du gezeigt hast, ist zum größten Teil simples C) geschieht das über Pointer. C++ bietet da etwas anderes an: Vektoren.


Pointer:

Ein Zeiger ist erst mal nichts anderes als eine Variable, die eine Adresse im Speicher enthält und ist bei den meisten Compilern und Systemen mit denen du so Kontakt hast, 32bit (4Byte) groß. Der Platz im Speicher, wo der Pointer hinzeigt (also die Adresse) ist der Platz, an dem die Daten abgelegt werden. Bei Pointern musst du dich um die Speicherverwaltung kümmern, sprich selbst Speicher anfordern, befüllen, verwenden und freigeben. Damit kann das gleiche erledigen, wie mit dynamischen Arrays, also jederzeit neuen zusätzlichen Speicher anfordern und damit das "Array" erweitern.


Vektoren:

Dabei handelt es sich um richtige Objekte aus der C++-Welt. Sie sind typisiert, und können damit nur Werte eines bestimmten Typs enthalten. Mit Hilfe von Objekt-Methoden kannst du Elemente hinten anfügen oder weglöschen. Es gibt noch eine einfachere Klasse, die so ähnlich arbeitet: Stack.

Assoziative Felder in C++:

Das was du in PHP als $array['name'] = "Lieschen Müller" notierst, gibt es auch in C++, dort heißt das aber Map. Eigentlich ist die Map noch das, was dem Array in PHP am nächsten kommt. Sie unterstützt Iterationen, Einfügen von Daten an beliebigen Positionen, löschen von beliebigen Elementen, etc. Jedoch ist eine Map genau wie der Rest der Container-Klassen in C++ typisiert.


Beispiel für eine Map in C++:

C++:
#include <string>
#include <map>
#include <iostream>

int main(int argc, char **argv)
{
    std::map<std::string, std::string> assocContainer;
    std::map<std::string, std::string>::iterator it;

    assocContainer.insert( std::pair<std::string,std::string>("field_a", "Hans Meier") );
    assocContainer.insert( std::pair<std::string,std::string>("field_b", "Lieschen Mueller") );


    for(it = assocContainer.begin(); it != assocContainer.end(); it++)
    {
        std::cout << (*it).first << " => " << (*it).second << std::endl;
    }
}

Ich hoffe, das verwirrt dich nicht all zu sehr ;)
 
Zurück