Array dynamisch erweitern? (war: Kurze wichtige Frage ...)
-
Ja, schon. Aber was mach ich jetzt? Hast du mir ne idee?
Sonst muss ich alles umprogen, damit die Größe schon von vornerein fest steht. Ist halt viel arbeit und das momentante ist auch schon getestet.
-
Ach, Jungchen:
1.) Was willst du eigentlich machen?
2.) Wie machst du es im Moment?
3.) Quelltext! Wir sind doch keine Hellseher!
-
Also, ich möchte aus einer Datei einzelne Datensätze auslesen.
Jede Zeile steht für einen Datensatz, jeder Datensatz besteht aus 4 Spalten.Dazu habe ich ne Klasse geschrieben die das auch macht. Das einzige was jetzt noch fehlt ist die Arraygröße. Wenn ichs manuel eingebe, läuft alles perfekt! Aber ich kann ja von vorneherei nicht wissen wieviele Datensätze die Datei haben wird. Deswegen wollte ich es dynamisch machen. Mit jedem neuen Datensatz wird das Array einfach um eins erhöht. Aber das geht ja nicht. Jetzt mache ich ne neue Funktion die einfach vorher die Datei einließt und klärt wieviele Datensätze in der Datei vorhanden sind. Ne bessere lösung fällt mir nicht ein. wisst ihr noch was?
Danke!#include <vcl.h>
#include <stdio.h>class CreateArray
{
private:
AnsiString *Data1,*Data2,*Data3,*Data4;
AnsiString FileName;
int Number;public:
CreateArrayFromFile ()
{
char GetLine[200];FILE *DataFile;
AnsiString GotLine, Entry;Number = 0;
DataFile = fopen("DataFile.txt","r");
do
{
fread (GetLine,200,1,DataFile);
GotLine = AnsiString(GetLine);
Number++;Data1 = new AnsiString[Number+1];
Data2 = new AnsiString[Number+1];
Data3 = new AnsiString[Number+1];
Data4 = new AnsiString[Number+1];Data1[Number] = Trim(GotLine.SubString(1,5));
Data2[Number] = Trim(GotLine.SubString(6,80));
Data3[Number] = Trim(GotLine.SubString(86,80));
Data4[Number] = Trim(GotLine.SubString(166,35));}while(feof(DataFile) == 0);
fclose (DataFile);
}WriteCreatedArrayInToGrid (TStringGrid *Grid)
{
for (int i=1; i<=Number; i++)
{
Grid->Cells[0][i] = Data1[i];
Grid->Cells[1][i] = Data2[i];
Grid->Cells[2][i] = Data3[i];
Grid->Cells[3][i] = Data4[i];
}
}
};
-
Hmm... da du das mit new erzeugst wird der Inhalt wohl immer wieder überschrieben.
Meine Lösungen dafür wären:
Variante 1: In der Datei die Anzahl der Datensätze am (Datei-)Anfang speichern und zu Beginn auslesen.
Variante 2: Die Datei zweimal durchlaufen. Beim ersten Mal die Anzahl der Datensätze bestimmen dann die Arrays dimensionieren und beim zweiten mal die eigentlichen Daten einlesen.
Variante 3: DynamicArray benutzen, da kannst du mittels ::Length die Größe problemlos ändern.
-
Hallo,
Kann mir mal jemand verraten, warum Ihr euch beharrlich weigert TStringList einzusetzen (wenn es schonmal Felder von AnsiStrings sind).
Ciao
-
Okay, danke. Hab den Code umgeändert und DynamicArrays verwendet! Funktioniert prima! Weiß mir jemand was wo man Infos über DynamicArrays nachlesen kann. Wie alles funktioniert. Bei google findet man nix gescheides und die Hilfe ist so unübersichtlich. Hat mir jemand nen Link auf ein Script oder so?
Danke nochmals für die Hilfe!
-
Irgendwie finde ich nirgendwo ne Doku zum Thema "DynamicArrays" kennt nicht jemand nen Link oder so?
Sind DynamicArrays eigenltich auch verbreitet? Oder ist das was, was es in den nächsten Versionen nicht mehr geben wird weils keiner benutzt? Schließlich finde ich nirgendwo was dazu!
Gruß Giovanni
-
Normalerweise nimmt man für sowas einein Containertyp wie vector !!!
-
1.) Im Quelltext "DynamicArray" tippen.
2.) Cursor darauf setzen und F1 drücken. (im BCB)
-
DynamicArray ist hauptsächlich aus Kompatibilitätsgünden zu ObjectPascal (Delphi) mit drin. Dürfte also bei reinen C++ Umgebungen nicht dabei sein (CBuilderX). Wenn man beim Builder bleibt, bieten sich die Borland typischen Listenkomponenten wie TList bzw. Spezialisierungen wie TStringList, TComponentList etc. an. Man kann natürlich auch (wie von megga vorgeschlagen) stl-Container wie vector und Konsorten verwenden (würde ich für Klassencontainer bevorzugen).
Ciao
PS.
@GiovanniRena: Wenn du die Hilfe unübersichtlich findest dann schau dir doch mal das hier an http://www.junix.ch/bcb/help/.