CStringArray

supersass1

Mitglied
Hallo,

kann mir jem genau erklären, was ein 'CStringArray' ist?
ohne MSDN Verwesie oder so...

Und noch, wie ich das in eine MFC Anwedung einbinden kann?

Ich wollte folgendes machen:
wenn jemand ein Wort eingibt, und dies in einer Varible gespeichert wird, wenn er allerdings jetzt nochmal was eingibt, soll dies in einer weiteren Variable gespeichert werden... (das speichern soll mittels eines Buttons geschehen) doch die varible soll gleich blieben, z.b. a[1], a[2],...
 

Meisterzunge

Mitglied
ein CString array funktioniert eigentlich wie jedes andere array.

wenn du es so deklarierst:
Code:
CString sDeinArray[10];

dann hast du in deinem Array platz für 10 zeichen.

danngreifst du mit
Code:
sDeinArray[5];
z.b. auf die stelle 5 in deinem array zu (das er bei 0 anfängt ist ja logisch)
 

BadMourning

Erfahrenes Mitglied
Das schöne an CStringArray ist, daß du nicht vorher festlegen mußt,
wieviele Elemente du haben willst, da dieses Array beinahe wie
eine verkettete List funktioniert.

Mit SetSize() kannst du jedoch eine bestimmte Anzahl vorbestimmen,
das Hinzufügen von Elementen erweitert jedoch die Liste.

Mit Add() kannst du Strings ans Ende des Arrays hinzufügen, mit
InsertAt() an einer bestimmten Stelle einfügen, mit GetAt() Strings auslesen.


Als Alternative kannst du auch CStringList verwenden, das ist dann eine
echte verkettete Liste.

Greets,
BadMourning
 
Zuletzt bearbeitet:

supersass1

Mitglied
Also, als erstes schriebe ich in den Quellcode:

Code:
CString sDeinArray;

und wie füge ich nun da was ein?

ich hab das mal versucht, irgendwie mit Add() zu amchen, aber das ging so nicht:
Code:
Add(sDeinArray)="hallo";




und wie kann ich das so machen, dass er die Speicherplätze 0-5 ausgibt, statt nur einem, mittels einer MEssagebox?
Code:
AfxMessageBox(sDeinArray[0]);
 
Zuletzt bearbeitet:

jokey2

Erfahrenes Mitglied
Versuch's mal mit
Code:
  CStringArray m_MyArray;
Damit legst Du das Array-Objekt an, dem Du dann mit Add(...) CStrings hinzufügen kannst.

Grüße

jokey2
 

cFuchs

Mitglied
Hallo

Ein CStringArray ist nicht als String zu betrachten, sondern als eine Menge von Strings.
Erstellt wird ein CStringArray mit:

CStringArray m_myArray;

Einfuegen von Elementen mit:

m_myArray.Add("String");
Der String wird als letzter in die Collection (Menge) eingefuegt, die Collection wird um 1 vergroessert. Wenn man anstelle von Add die Funktion InsertAt(int iIndex, CString string) verwendet, wird an der entsprechenden Stelle der String eingefügt.

Auslesen von Strings:
int iIndex = 0;
CString text = m_myArray.GetAt(iIndex);

Gibt das Element zurück an der Position, die mit iIndex angegeben wird. Beginn bei 0

int iAnzahl = m_myArray.GetSize();
... gibt die Anzahl der Elemente zurück.

Grüße
 

supersass1

Mitglied
und wie kann ich das machen, dass die Werte dann in einem Eingabefeld (oder so) ausgeben werden


und wie kann ich diese Datei(en) in einer Datei speichern?

hiermit gehts nicht:

CFileDialog FileDlg (false, NULL, NULL, NULL, _T("Textdateien(*.txt)|*.txt||"));

if (FileDlg.DoModal() == IDOK)
{
CStdioFile file;
if(file.Open(FileDlg.GetPathName(), CFile::modeCreate | CFile::modeWrite))
{
file.WriteString(hier die variable );
file.Close();
}
}
 
Zuletzt bearbeitet:

langer1801

Erfahrenes Mitglied
Für die Ausgabe in einem Eingabefeld mußt du den String mit
CString myString=m_myArray.GetAt(Index);
auslesen.
Anschließend das Eingabefeld mit
myEingabefeld.SetWindowText(myString);
aktualisieren.
Oder, wenn man mehrere Strings in einer Listbox anzeigen will, mit
myListbox.AddString(myString);
an die Liste anhängen.
 

langer1801

Erfahrenes Mitglied
Ach ja, unter der Voraussetzung, daß du a l l e Strings in e i n e r Datei speichern willst, kannst du die Speicherfunktion in der Dokumentenklasse verwenden. Diese hat überladene Operatoren, sodaß es kaum Probleme geben sollte.
Vorschlag:
Code:
void CDoc::Serialize(CArchive& ar)
{
   int i,j;
   CString string;
   if (ar.IsStoring())
         ar<<myArray.GetSize();     //ich will beim Laden wissen, wie groß das Array ist
         for(i=0;i<myArray.GetSize();i++)
                 ar<<myArray[i];
         next i;
    else
          ar>>j;
          for(i=0;i<j;i++)
          {
                 ar>>string;
                 myArray.AddString(string);
           }
           next i;
}

Mfg
 

der jonas

Erfahrenes Mitglied
Hallo,

Ich weiß dieser Thread ist 4 Jahre alt und als Erledigt markiert, der Grund warum ich dennoch hierzu meinen Senf dazugeben möchte:

Dieser Thread ist bei Googlesuche nach CStringArray ganz oben mit dabei und imho ist zu diesem Thema hier noch etwas zu sagen.

@BadMourning
Man muss die Größe vorher nicht festlegen man sollte es aber zumindest eine ungefähre Größe angeben! Dass man es so unbeschwert wie eine verkettete List verwenden kann da geb ich dir Recht.

Ein Array und eine verkettete Liste haben aber einen entscheidenden Unterschied!

Bei einem Array müssen alle Elemente hintereinander im Speicher abgelegt werden, eine verkettete Liste hat mehrere Elemente die beliebig an verschiedenen Adressen im Speicher hinterlegt sind. Die einzelnen Elemente kennen die Adresse des jeweils nächsten Elements (je nachdem auch des vorherigen).

Wenn ich einem Array dynamisch ein neues Element hinzufüge funktioniert das vom Prinzip her so:
Der Prozess allkoiert (reserviert) im Arbeitsspeicher soviele Adressen hintereinander, dass das Array plus das neue Element hineinpassen, kopiert das Array von seiner alten Position im AB an die Neue und fügt das zusätzliche Element an. Der Speicher an der alten Position wird freigegeben.
Das passiert natürlich nicht bei jedem Element. Ich denke, dass gleich Platz für mehrere Elemente allokiert wird, so dass nur alle 5, 10 oder 20 Mal das Array kopiert werden muss die genaue Größenordnung kenne ich da nicht.

Ich weiß aber, dass zu häufiges Herumkopieren ineffizient ist!

Prinzip einer verketteten Liste:
Der Prozess kennt die Adresse des ersten Elements, das wiederum die Adresse des jeweils Nächsten kennt und das letzte Element muss wissen, dass es momentan das Letzte ist.
Der Rest funktioniert dann wie Flüsterpost aus der Grundschule..
Ich sage dem Element, dass ich kenne, dass ich die Adresse des letzten Elements haben möchte. Das letzte Element fühlt sich angesprochen und teilt seine Adresse mit.

mit der Adresse habe ich direkten Zugriff auf das Element.

Wenn ich ein neues Element hinzufüge, allokiere ich an einer beliebigen Adresse im AB genügend Speicher, sage per Flüsterpost, dass das bisher letzte Element absofort nicht mehr das letzte ist und die Adresse des gerade neu angelegten Elements speichern soll.

Kurz und knapp zum Schluss:

Über den ganzen Ablauf muss man sich keine Gedanken machen! Man kann damit auch arbeiten ohne, dass man von dem ganzen komplizierten Sch*** etwas mitbekommt. :)


All diejenigen, die CStringArrays benutzen, sollten wirklich daran denken SetSize() zu verwenden, oder in Erwägung ziehen eine verkettete Liste zu benutzen.

Genug über Arrays hergezogen ;-)
Man sollte sich auf jeden Fall zuersteinmal mit den Grundlagen beschäftigen bevor man sich mit komplexeren Themen heranwagt. Als ich mit C++ angefing, habe ich mich mit char-Arrays herumschlagen! Strings sind schon ein Luxus^^

Back to the Roots - es kann wirklich nicht schaden :)

All the Best

Jonas
 

Neue Beiträge