Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
05.12.2010, 16:02
bennifilm



Hi

es geht darum das ein array vergrößert wird und den alten inhalt
behält.
Dabei hab ich einfach ein bisschen rumexperimentiert

Das ergebnis sollte so aussehen :
Quellcode:a
a
a
a
a
a
a
a
a
a
stattdessen krieg ich irgendwelche beliebigen zeichen
zurück. nur die letzten beiden zeilen bestehen aus 'a'

Quellcode:#include <iostream>

using namespace std;

int main()
{
    char *charZeiger = new char[1];
    char *charZeiger2 = 0;
    int a = 1;
    
    for(int x = 0; x != 10; ++x)
    {
               charZeiger[x] = 'a';
              
               charZeiger2 = new char[a];
              
               charZeiger2 = charZeiger;
              
               delete[] charZeiger;
               charZeiger = 0;
              
               charZeiger = new char[a + 1];
              
               charZeiger = charZeiger2;
              
               //delete[] charZeiger2; führt zum Absturz
               charZeiger2 = 0;
              
               ++a;
    }
    
    for(int z = 0; z != 10; ++z)
    {
               cout << charZeiger[z] << endl;
    }
    
    while(true);
    
    return 0;
}
jemand eine idee was ich falsch gemacht habe ?

--

::Alien Swarm Sunstation 583::
::Left 4 Dead:: b_alley 95% | b_office 65%
::Battlemod:: steht still

http://www.iop-b.de/

zum Seitenanfang zum Seitenende Profil || Suche
001
05.12.2010, 17:36
Raziel



Kann deinen Code leider nicht komplett nachvollziehen, mag auch ein bisschen unübersichtlich sein, aber:

Du kannst auf jeden Fall bequem mit der STL Klasse 'vector' arbeiten und Arrays nach belieben verkleinern, vergrößern, manipulieren und so weiter. Bin mir nicht sicher, ob dass nicht ein wenig zu viel Aufwand wäre, aber ein Blick lohnt sich.

Zum Beispiel hier: http://www.cplusplus.com/reference/stl/vector/

Kl. Bsp.:

Quellcode:#include <iostream>
#include <vector>

using namespace std;

int main ()
{
    // Vector erzeugen:
    vector<int> vData;

    // Iterator (zum Durchlaufen):
    vector<int>::iterator i;

    // Größe ausgeben (0):
    cout << "Size: " << static_cast<int> (vData.size ()) << endl;

    // Elemente hinzufügen:
    for (int j = 0; j < 5; ++j)
    {
        // 97 entspricht 'a'
        vData.push_back (97);
    }

    // Noch mal die Größe ausgeben (5):
    cout << "Size: " << static_cast<int> (vData.size ()) << endl;

    // Inhalt ausgeben:
    for (i = vData.begin (); i < vData.end (); ++i)
    {
        cout << static_cast<char>(*i) << endl;
    }

    // Ein Element hinzufügen:
    vData.push_back (97);

    // Wieder die Größe (6):
    cout << "Size: " << static_cast<int> (vData.size ()) << endl;

    // Vector löschen und Größe (0):
    vData.clear ();
    cout << "Size: " << static_cast<int> (vData.size ()) << endl;

    return 0;
}
Ausgabe:

Quellcode:Size: 0
Size: 5
a
a
a
a
a
Size: 6
Size: 0
Gibt aber bestimmt noch elegantere Lösungen (mein Code mag vlt auch nicht sauber sein), aber da kann ich dir dann nicht mehr viel weiter helfen ;)

--


Dieser Beitrag wurde am 05.12.2010 um 18:05 von Raziel bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
05.12.2010, 18:51
Bluthund



Zitat:
Du kannst auf jeden Fall bequem mit der STL Klasse 'vector' arbeiten
Da die Frage mit C++ getaggt ist sollte er das sogar so machen.

@Raziel: Wenn man darauf aus ist Zeichen auf ein Array zu pushen macht man das fuer gewoehnlich auch («push_back('a')») und schaut nicht vorher den Dezimal-(/Oktal-/Hexdezimal-)Wert um den dann im Code zu benutzen (97). Ausser man moechte den Code moeglichst unleserlich machen.
Das casten vom Rueckgabewert von size() kannst du auch sparen. Bringt sowieso nur Unglueck wenn der size_type nicht in ein int passt.

@bennifilm:
Dein Verstaendnis was Zeiger angeht ist noch nicht wirklich vorhanden wenn man sich den Code so anschaut. Dazu solltest du das Kapitel auf jeden Fall nochmal durcharbeiten. Du ueberschreibst da staendig die Zeigerwert (!= Wert auf den gezeigt wird) und dann ist es auch nicht verwunderlich, dass da nicht rauskommt was du willst (und das delete[] mit Pauken und Trompeten dein Programm abschiesst wenn du es nicht auskommentierst).

Wofuer die Endlosschleife am Ende des Programms? Nicht im Stande deine IDE richtig einzurichten?

Wenn du schon unbedingt mit rohem Speicher rumspielen willst, dann solltest du auch die entsprechenden Funktionen nutzen, die fuer solche Sachen ausgelegt worden sind (memset, memcpy, etc.) und dann legst du einfach das neue Array an und kopierst die alten Werte in einem Rutsch mit memcpy rueber.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
003
05.12.2010, 19:34
Raziel



Mit der Übersicht stimmt, trägt nicht gerade posititv dazu bei und natürlich soll der Code nicht unleserlich werden. Dass der size_type nicht in ein int passt hatte ich nicht beachtet und bis dato auch nicht (bewusst) gewusst, aber macht natürlich Sinn. Thx für den Hinweis ;)

--

zum Seitenanfang zum Seitenende Profil || Suche
004
06.12.2010, 00:38
Kriz



Wenn's ums Lernen geht, sollte man die STL erstmal weglassen und manuell alles durchkauen, datt hilft! Un ein einfaches Array zu erweitern ist ja mehr als simpel:
Quellcode:// char-Array mit 5 Elementen alloziieren
char* array = new char[5];

// Füllen...
array[0] = 'H'; array[1] = 'a'; array[2] = 'l'; array[3] = 'l'; array[4] = 'o';

// Zum Erweitern brauchen wir ein temporäres Array, welches die Kopie von
// array in sich trägt. Da unser char-Array keinen Nullterminator am Ende
// hat, müssen wir eben mit einer Schleifen 5-mal elementweise kopieren
char* temp = new char[5];

for(int i=0; i<5; ++i)
{
    temp[i] = array[i];
}

// array löschen und mit 11 Elementen neu alloziieren
delete[] array;
array = new char[11];

// temp zurück nach array kopieren und temp danach löschen
for(int i=0; i<5; ++i)
{
    array[i] = temp[i];
}

delete[] temp;

// Neue Zusatzwerte an array zuweisen
array[5] = ' '; array[6] = 'W'; array[7] = 'e';
array[8] = 'l'; array[9] = 't'; array[10] = '!';

// Mit array arbeiten
...

// array wieder löschen
delete[] array;
Der Vorteil beim Nutzen der Containerklassen aus der C++ Standardbibliothek (ehemals STL) ist vor allem der, daß ein Container wie std::vector sich selbständig erweitert oder reduziert, ohne daß der Programmierer sich darum kümmern muß.

@Bluthund: memcpy & Co. sind C-Dinger und haben mit C++'s Speicherverwaltung wahrlich nichts zu tun! Außer das bezog sich jetzt nicht auf C++, sondern auf Lowlevel im Allgemeinen...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
005
06.12.2010, 01:50
Bluthund



Zitat:
Raziel postete
Dass der size_type nicht in ein int passt hatte ich nicht beachtet und bis dato auch nicht (bewusst) gewusst, aber macht natürlich Sinn.
Das hab ich ja auch so nicht gesagt. Es ging nur darum, dass je nach genutzter Implementierung sizeof(vector<T>::size_type) > sizeof(int) sein kann.

Zitat:
Kriz postete
Außer das bezog sich jetzt nicht auf C++, sondern auf Lowlevel im Allgemeinen...
Jo, wie oben schon erwaehnt war der Hinweis fuer die Benutzung mit "rohem Speicher".

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
006
06.12.2010, 01:51
caedes



kriz: warum kopierst du die daten 2x um?
Quellcode:char *array[5] = new char[5];
// hier füllen und so ..
...
char * temp = new char[11]; // neues array erstellen
for(int i=0;i<5, ++i) { // daten in neues array kopieren
    temp[i] = array[i];
}

delete[] array; // altes array löschen
array = temp; // array zeigt jetzt auf neues array

array[5] = ' '; // usw
...

// mit array arbeiten
...
delete[] array; // array löschen
reicht doch

--

caedes

Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen.


Dieser Beitrag wurde am 06.12.2010 um 01:53 von caedes bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
06.12.2010, 10:37
Kriz



Klar geht auch, aber ich wollte es ausführlich machen. Noobs brauchen das ;-)

Oder zumindest sollte man es so nicht machen, wenn das ganze publik werden soll. Denn irgendein OpenSource-Heinz wird sich sicherlich fragen: "Da hat einer das temp nicht gelöscht!" unbd schwupps... macht er eventuell ein delete[] temp; rein. Es geht darum, daß solche Zeigerumweisungen von temp auf array gerne mal übersehen und vergessen werden :-)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 06.12.2010 um 10:37 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
06.12.2010, 14:09
caedes



Zitat:
Kriz postete
Klar geht auch, aber ich wollte es ausführlich machen. Noobs brauchen das ;-)
naja, is halt unnötiger aufwand. außerdem sieht man an meiner version, dass das pointer sind, also man durch "array = temp;" einfach "array" auf das array hinter temp zeigen lässt (bennifilm scheint in seinem code oben davon ausgegangen zu sein, dass durch sowas der inhalt kopiert wird)

Zitat:
Oder zumindest sollte man es so nicht machen, wenn das ganze publik werden soll. Denn irgendein OpenSource-Heinz wird sich sicherlich fragen: "Da hat einer das temp nicht gelöscht!" unbd schwupps... macht er eventuell ein delete[] temp; rein. Es geht darum, daß solche Zeigerumweisungen von temp auf array gerne mal übersehen und vergessen werden :-)
ich hab jetzt wenig erfahrung mit "real world" c++ code, aber wenn man da regelmäßig mehr rumkopiert als nötig, nur damit irgendwelche deppen, die den code nicht verstehen, ihn nicht kaputtbugfixen, ist der performance-gewinn gegenüber z.b. java schnell weg.

aber man könnte natürlich
Quellcode:...
delete[] array;
array = temp;
temp = 0;
...
schreiben, um etwas deutlicher zu machen dass temp nicht mehr gebraucht wird und nicht mehr gelöscht werden muss :-)

--

caedes

Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen.


Dieser Beitrag wurde am 06.12.2010 um 14:09 von caedes bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
06.12.2010, 17:54
CPoly



Vielleicht steh ich auch auf dem Schlauch, aber hier ist noch nicht "realloc" gefallen. Da C eine echte Untermenge von C++ ist, ist es ja durchaus legitim darauf zurückzugreifen. Wenn nicht genug Speicher sequenziell verfügbar ist, übernimmt realloc auch das Kopieren.

Quellcode:#include <stdlib.h>

int main(int argc, char *argv) {
    //Array der Länge 10
    int *arr = (int *)malloc(sizeof(int) * 10);
    
    //Jetzt hat es die Länge 15
    arr = (int *)realloc(arr, sizeof(int) * 15);
    
    return 0;
}
http://en.wikipedia.org/wiki/Malloc#realloc

Edit: Ich hab nochmal drüber nachgedacht und wenn das Array per new erzeugt wurde und das auch so bleiben soll, funktioniert die Lösung natürlich nicht. Ich steh halt auf reines C :-D

--


Dieser Beitrag wurde am 06.12.2010 um 18:05 von CPoly bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
06.12.2010, 18:33
theDon



Zitat:
CPoly postete
Da C eine echte Untermenge von C++ ist
Ist es aber nicht, versuche mal, in C++ einen void*-Wert an eine char*-Variable zuzuweisen.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
011
06.12.2010, 19:36
CPoly



Zitat:
theDon posteteIst es aber nicht, versuche mal, in C++ einen void*-Wert an eine char*-Variable zuzuweisen.
Also wenn ich in meinem Beispiel ein char-Array nehme anstatt des int funktioniert es auch. Weder gcc noch g++ geben Fehlermeldung oder Warnung aus.

Kannst du das näher erläutern? Lügt unser Professoren?

--


Dieser Beitrag wurde am 06.12.2010 um 19:38 von CPoly bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
012
06.12.2010, 20:17
caedes



Zitat:
CPoly postete
Zitat:
theDon posteteIst es aber nicht, versuche mal, in C++ einen void*-Wert an eine char*-Variable zuzuweisen.
Also wenn ich in meinem Beispiel ein char-Array nehme anstatt des int funktioniert es auch. Weder gcc noch g++ geben Fehlermeldung oder Warnung aus.
weil du explizit castest. das ist in C nicht nötig.
Zitat:
Lügt unser Professoren?
ja

--

caedes

Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen.

zum Seitenanfang zum Seitenende Profil || Suche
013
06.12.2010, 20:20
theDon



Quellcode:mmarx@korenchkin (2024) ptr % cat bsp.c
int main(int argc, char** argv)
{
    char* foo = (void*) 0;
    return 0;
}
mmarx@korenchkin (2025) ptr % gcc bsp.c
mmarx@korenchkin (2026) ptr % g++ bsp.c
bsp.c: In function ‘int main(int, char**)’:
bsp.c:3: error: invalid conversion from ‘void*’ to ‘char*’
mmarx@korenchkin (2027) ptr % gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-10' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-10)
mmarx@korenchkin (2028) ptr %

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
014
06.12.2010, 22:32
bennifilm



Erstmal danke für die vielen Antworten.

Auch wenn mir jetzt jeder eine besser/effektivere Variante für mein Programm
ans Herz legen will werd ich es schon auf einer basis halte wie ich angefangen habe und mich am beispiel von Kriz orientieren.

Wenn ich das richtig verstanden habe ist eine der Ursachen diese Zeile :
Quellcode:charZeiger = charZeiger2; Welche ich durch eine For-Schleife ersetze :
Quellcode:for(int i=0; i<x; ++i)
{
    charZeiger[i] = charZeiger2[i];
}
Werd mich aber erst morgen nochmal mit dem Programm auseinander setzen.

--

::Alien Swarm Sunstation 583::
::Left 4 Dead:: b_alley 95% | b_office 65%
::Battlemod:: steht still

http://www.iop-b.de/

zum Seitenanfang zum Seitenende Profil || Suche
015
06.12.2010, 23:01
Kriz



Em ja... Du musst eben nur wissen, daß eine Zuweisung von Zeigern kein Kopieren im eigentlichen Sinne bedeutet (sowas nennt der Fachmann "shallow copy" -> flache Kopie). Ist der Zeiger Startpunkt für ein Array, dann muß man eben durch alle nötigen Elemente des Quellarrays iterieren und elementweise ins Zielarray kopieren ("deep copy" -> tiefe Kopie).

Ich lege dir mal ganz dringend den Wälzer von Ulrich Breymann ans Herz (C++ Einführung und professionelle Programmierung, Hanser Verlag), da wird meiner Meinung nach C++ ganz ordentlich in deutsch erklärt.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
016
06.12.2010, 23:37
default



ich leg dir ans herz c++ erstmal zu vergessen und mit c anzufangen,
sonst wirst du immer auf ratschläge von kaliber kriz angewiesen sein.

kauf dir kein buch, lies manpages

--

Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst.

zum Seitenanfang zum Seitenende Profil || Suche
017
07.12.2010, 09:47
caedes



Und wenn, dann "The C Programming Language", das hat auch Übungsaufgaben.

--

caedes

Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen.

zum Seitenanfang zum Seitenende Profil || Suche
018
07.12.2010, 12:00
Mazze



Zum Thema "C Teilmenge C++":
http://www2.research.att.com/~bs/bs_faq.html#C-is-subset

und zu "realloc":
http://www2.research.att.com/~bs/bs_faq2.html#renew

cu

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
019
07.12.2010, 23:52
Kriz



@default: Laber nicht, kein Mensch muß sich vor C++ mit C rumärgern! Dieses Lernmodell ist ja wohl völlig banane und veraltet. Und manpages sollte man mal so garnicht als Buchersatz betrachten, sondern als Referenz- oder Hilfedoku. Oder ziehst du mit 'nem Schraubendreher Nägel raus?

@caedes: Imho sind TCPL/TCPPPL wahre Hämmer und für Noobs eigentlich so gut wie nicht verdaulich, sei es im Originalen oder in der Übersetzung. Da gibt's für Einsteiger ganz klar andere Buchlösungen. Sicher, wer gerne gleich mit der Referenz lernen möchte, der kann das tun. Aber datt wird ein langer Weg ;-)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
020
08.12.2010, 09:37
caedes



bei TCPPPL stimme ich zu, bei TCPL eher nicht. mit ein bisschen programmiererfahrung und motivation sollte man damit eigentlich klarkommen können.

--

caedes

Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen.

zum Seitenanfang zum Seitenende Profil || Suche
021
08.12.2010, 16:25
default



Kriz ...
einigt man sich drauf, dass c++ ein etwas spezielles superset von c ist, macht es durchaus sinn.
wenn man sich schon mit c rumärgert, wird man mit c++ sicher keine freude haben.

--

Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst.

zum Seitenanfang zum Seitenende Profil || Suche
022
08.12.2010, 20:54
Prefect



C ist im Grunde eine sehr einfache und überschaubare Programmiersprache.

Nur Pointer verstehen viele Menschen einfach nicht. Aber wer Pointer nicht versteht, der wird auch mit C++ und vielen anderen Programmiersprachen keinen Spaß haben.

Andererseits ist es durchaus sinnvoll, direkt in C++ einzusteigen und vernünftig die STL zu lernen. Wer in C++ Stringverarbeitung mit char* macht gehört ordentlich verhauen (Ausnahmen gibt es immer, aber Leute, die solche Threads wie diesen eröffnen sind Kontinente davon entfernt, diesen Ausnahmen zu begegnen). Nur darf man sich deshalb nicht um die Auseinandersetzung mit Pointern drücken.

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
023
08.12.2010, 23:08
Kriz



@Prefect: Die Sprache an sich ist simpel gestrickt, da gebe ich dir völlig recht. Nur die mögliche Tiefe scheint einige zu überfordern, besonders wenn es um char und seine Einsatzgebiete geht. Klar, aus einer rationalen Sicht auf die Syntax war es von K&R ein klein wenig unglücklich, daß sich ein Byte und ein Zeichen dasselbe Schlüsselwort teilen müssen (hier hat Java den entscheidenden Schritt getan). Hätte man sowas gleich getrennt, dann wäre glaube ich das Verständnis zwischen Low-Level Dingen wie char*-basierte IO-Puffer und normalen Dingen wie ein char*-String etwas größer. Aber sei's drum. Wem's nicht passt, der kann sich ja in C ein längenterminiertes String-Struct basteln... die Freiheit hat man ja gottseidank. Auch wenn man Zeiger dann immernoch verstanden haben muß, hrhrhr...

@default: Macht Sinn, zumindest bekommt man zwangsweise seine Dosis C stets mit C++ verabreicht, ob man nun will oder nicht. Man lernt C quasi mit C++ nebenher (auch wenn man da ganz konsequent auf die Unterschiede pochen sollte, die ja nun mal eben da sind).

@caedes: Motivation scheint ja eben bei vielen hier im Forum Mangelware zu sein. Denen kann man mit TCPL nicht (bei)kommen.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
024
10.12.2010, 09:45
Prefect



Naja, C ist halt auch ein Kind seiner Zeit. 127 characters should be enough for everybody, und so. Eine moderne Sprache sollte in der Tat zwischen Bytes und Strings unterscheiden, wobei es m.E. auch unsinnig ist, Strings einfach als Array von Zeichen handzuhaben. Streng genommen ist das aus Unicode-Perspektive nämlich auch durchaus problematisch, angesichts der ganzen Sonderfälle. Außerdem denke man an Schriftsysteme wie Hangul (koreanisch), in der die Zeichen pro Silbe gruppiert werden. Wirklich flexible Stringunterstützung ist ein ziemlich schwieriges Problem.

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche