Suche programmiersprache
Hi, ich suche eine Programmiersprache für individuelle Datensätze.
Die erfahrenen kennen das Problem:
Was, wenn die Datensätze einer Datei unterschiedlich groß sind!
Konkret geht es um zip-dateien:
Ihr seht das "file name" eine variable Größe hat. Diese wird durch "file name len" definiert.
Jetzt will ich das einlesen!
In delphi wollte ich follgendes schreiben:
cfh=record
signature:longword;
version:word;
vers_need,flags,compression:word;
modTime:time;
modDate:date;
crc32,compSize,uncompSize:longword;
fnLen,xtraLen,fcomLen,startAt,intAttr:word;
externAtt, localOffset:longword;
fn:array[1..fnLen] of char; <<<<<<Hier meckert der compiler
xtra:array[1..xtraLen] of byte; <<<<<<Hier meckert der compiler
fcom:array[1..fcomLen] of char; <<<<<<Hier meckert der compiler
end;
Ich suche jetzt eine Sprache die das hinkricht, möglichst rechenschnell.
Jemand eine Idee?
Die erfahrenen kennen das Problem:
Was, wenn die Datensätze einer Datei unterschiedlich groß sind!
Konkret geht es um zip-dateien:
Ihr seht das "file name" eine variable Größe hat. Diese wird durch "file name len" definiert.
Jetzt will ich das einlesen!
In delphi wollte ich follgendes schreiben:
cfh=record
signature:longword;
version:word;
vers_need,flags,compression:word;
modTime:time;
modDate:date;
crc32,compSize,uncompSize:longword;
fnLen,xtraLen,fcomLen,startAt,intAttr:word;
externAtt, localOffset:longword;
fn:array[1..fnLen] of char; <<<<<<Hier meckert der compiler
xtra:array[1..xtraLen] of byte; <<<<<<Hier meckert der compiler
fcom:array[1..fcomLen] of char; <<<<<<Hier meckert der compiler
end;
Ich suche jetzt eine Sprache die das hinkricht, möglichst rechenschnell.
Jemand eine Idee?
klar C++, C, C# kriegen das alle hin.
Ich kenn mich zwar in Delphi nicht aus, aber wäre es nicht erstmal einfach sicherzustellen, ob es vllt doch in Delphi funktioniert (Delphi Community) ehe du das in einer anderen Sprache umsetzt ?
Oder bist du dir 100% sicher das es für dein Problem keine Delphi Lösung gib ?
Ich kenn mich zwar in Delphi nicht aus, aber wäre es nicht erstmal einfach sicherzustellen, ob es vllt doch in Delphi funktioniert (Delphi Community) ehe du das in einer anderen Sprache umsetzt ?
Oder bist du dir 100% sicher das es für dein Problem keine Delphi Lösung gib ?
Unsere Welt ist einfach Krank. Aber ich mag sie irgendwie.
jaha ich habs mit c, c++ c# probiert!
es müste eine datenstruktur sein die kein union erlaubt. und das geht bei denen überall.
ich glaube du hast mein anliegen nicht verstanden.
in c++ müsste das doch so aussehen:
es müste eine datenstruktur sein die kein union erlaubt. und das geht bei denen überall.
ich glaube du hast mein anliegen nicht verstanden.
in c++ müsste das doch so aussehen:
Zitat
struct test{
int a;
int b[a];
}
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (14. August 2010, 19:33)
Moin!
Naja, so kann das auch nich gehen, dafür musst Du den Speicher zur Laufzeit anfordern.
In C++ etwa so:
ACHTUNG
, das ist kein perfekter Stil, weil die Variablen a und b offen von aussen (ausserhalb der Klasse) zugänglich sind...
wollte aber möglichst nah an Deinem Beispiel bleiben... (die Namen a und b für die Vars sind ja auch doof
)
Früher ging sowas auch in Pascal und Delphi, ob das heut noch geht, keine Ahnung...
Zeiger sind ja in vielen (sogenannten) modernen Programmiersprachen verpönt...
(allerdings gibt es sicher auch nen weg über nen eingebauten Collection-Typ, sowas wie Vector oder Stack)
MfG, Marcus
PS.: Sorry, daß das so seltsam eingerückt ist, aber das is in dem Forum hier irdenwie ein Glücksspiel...
Naja, so kann das auch nich gehen, dafür musst Du den Speicher zur Laufzeit anfordern.
In C++ etwa so:
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <iostream> using namespace std; class test { public: int a; // das ist die Länge int *b; // ein Zeiger auf int test():a(10), b(NULL) // Konstruktor ohne Längenangabe, wir setzen Länge auf 10... { b=new int[a]; // Erzeugen des Int-Arrays b mit Länge a zur Laufzeit !!! if(!b) a=0; // wenns nich geklappt hat, setzen wir die länge wieder auf 0 } test(int len):a(len), b(NULL) // Konstruktor mit Längenangabe, sonst wie oben { b=new int[a]; if(!b) a=0; } ~test() // Destruktor { delete[] b; // Freigabe des Speichers von b b=NULL; // setzen von b auf 'null' zur Sicherheit a=0; // setzen von a auf 0, um ordentlich zu sein } }; int main() { cout<<endl<<"Objekt t2:"<<endl; test t1; // erzeugt ein test-Objekt mit a=10; if(t1.a==0) cout<<"Out Of Memory..."<<endl; else { cout<<"Länge: "<<t1.a<<endl<<endl; int i; for(i=0;i<t1.a;i++) { t1.b[i]=i*i; } for(i=0;i<t1.a;i++) { cout<<i<<" mal "<<i<<" ist "<<t1.b[i]<<endl; } } cout<<endl<<"Objekt t2:"<<endl; test t2(25); // erzeugt ein test-Objekt mit a=25; if(t2.a==0) cout<<"Out Of Memory..."<<endl; else { cout<<"Länge: "<<t2.a<<endl<<endl; int i; for(i=0;i<t2.a;i++) { t2.b[i]=i*i*i; } for(i=0;i<t2.a;i++) { cout<<i<<" mal "<<i<<" mal "<<i<<" ist "<<t2.b[i]<<endl; } } cout<<endl<<endl<<"(Return) zum Beenden..."; cin.get(); return 0; } |
ACHTUNG
, das ist kein perfekter Stil, weil die Variablen a und b offen von aussen (ausserhalb der Klasse) zugänglich sind...wollte aber möglichst nah an Deinem Beispiel bleiben... (die Namen a und b für die Vars sind ja auch doof
)Früher ging sowas auch in Pascal und Delphi, ob das heut noch geht, keine Ahnung...
Zeiger sind ja in vielen (sogenannten) modernen Programmiersprachen verpönt...
(allerdings gibt es sicher auch nen weg über nen eingebauten Collection-Typ, sowas wie Vector oder Stack)
MfG, Marcus
PS.: Sorry, daß das so seltsam eingerückt ist, aber das is in dem Forum hier irdenwie ein Glücksspiel...
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »eMKay« (14. August 2010, 21:39)
ich versteh das eigentliche problem nicht. in allen sprachen die ich kenne gibt es die möglichkeit von dynamischen arrays und somit sollte dein problem doch gelöst sein oder?
wischipedia - http://wischenbart.org/wwa (einfach mal vorbeischaun)
Hi wischi!
Exakt...
dynamisches Int-Array b mit Länge a in C++ -->
int a=10;
int *b=new int[a];
// nutzen
delete[] b;
(vielleicht war mein Beispiel oben etwas ausufernd, aber wenn ich einmal am Tippen bin...
)
Noch schöner geht's vielleicht mit nem Vektor... der würde die Länge dann gleich mit speichern, und wäre recht einfach in der Grösse veränderbar. Und ausserdem gibts die eigentlich auch in so ziemlich jeder Sprache mittlerweile. Aber wollte halt an seinem Beispiel bleiben.
In C gibts da noch ne seltsame Schreibweise, welche fast direkt so aussieht, wie sein Beispiel oben. Die wird in der Win-Api an vielen Stellen benutzt.
struct test
{
int a; // Länge
int b[1]; // Platzhalter für b
};
aber da muss man den Speicher dann auch in C-Manier anlegen, für test und b einzeln, und ihn dann noch nullen...
...das wollt ich ihm heutzutage nich mehr antun
(Ich hab das gehasst, wurde in den alten Bitmap-Funktionen viel benutzt...)
MfG, Marcus
Exakt...
dynamisches Int-Array b mit Länge a in C++ -->
int a=10;
int *b=new int[a];
// nutzen
delete[] b;
(vielleicht war mein Beispiel oben etwas ausufernd, aber wenn ich einmal am Tippen bin...
)Noch schöner geht's vielleicht mit nem Vektor... der würde die Länge dann gleich mit speichern, und wäre recht einfach in der Grösse veränderbar. Und ausserdem gibts die eigentlich auch in so ziemlich jeder Sprache mittlerweile. Aber wollte halt an seinem Beispiel bleiben.
In C gibts da noch ne seltsame Schreibweise, welche fast direkt so aussieht, wie sein Beispiel oben. Die wird in der Win-Api an vielen Stellen benutzt.
struct test
{
int a; // Länge
int b[1]; // Platzhalter für b
};
aber da muss man den Speicher dann auch in C-Manier anlegen, für test und b einzeln, und ihn dann noch nullen...
...das wollt ich ihm heutzutage nich mehr antun
(Ich hab das gehasst, wurde in den alten Bitmap-Funktionen viel benutzt...)
MfG, Marcus
int array[x] ist in C das selbe wie int *array + x, was man also machen kann ist eine Struktur definieren, die dem Header der Datei entspricht -
z.B. also
Anschließend castet man den Pointer zum buffer der eingelesenen file, z.B. mit
Das deckt den Header teil ab.
Zu deinem Problem mit den variablen Einträgen: Setzt einen Zeiger auf den Anfang des Eintrages und gib deiner Struktur eine Variable für seine Länge.
Auf diesen Zeiger kannst du dann auch mit dem [] Operator zugreifen, also wie auf ein Array.
z.B. also
|
|
C/C++-Quelltext |
1 2 3 4 5 6 |
typedef struct { unsigned long version; unsigned short version; ... } zipHeader; |
Anschließend castet man den Pointer zum buffer der eingelesenen file, z.B. mit
|
|
C/C++-Quelltext |
1 |
zipHeader *pHeader = (zipHeader*)buffer; |
Das deckt den Header teil ab.
Zu deinem Problem mit den variablen Einträgen: Setzt einen Zeiger auf den Anfang des Eintrages und gib deiner Struktur eine Variable für seine Länge.
Auf diesen Zeiger kannst du dann auch mit dem [] Operator zugreifen, also wie auf ein Array.
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (15. August 2010, 10:11)
für ganz harte gibt es auch die möglichkeit wenn ihr direkt in ein struct einlesen möchtet und es sich um einzelne bits handelt: Bit Fields:
http://msdn.microsoft.com/en-us/library/ewwyfdbe(VS.80).aspx
lg wischi
http://msdn.microsoft.com/en-us/library/ewwyfdbe(VS.80).aspx
lg wischi
wischipedia - http://wischenbart.org/wwa (einfach mal vorbeischaun)
Warte, das hat jetzt geklappt wischi. Ich musste zwar einen mächtigen Macro-Preprozessor installieren, der Code sieht beknackt aus und ich kann nur noch mit Notepad arbeiten, aber es geht!
EDIT: OK und der Code ist 15x so groß.
Mit C# 5 wären Annotationen möglich, jedoch will ich auf das .net verzichten.
EDIT: OK und der Code ist 15x so groß.
Mit C# 5 wären Annotationen möglich, jedoch will ich auf das .net verzichten.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »nocturne« (30. August 2010, 07:55)
Ähnliche Themen
-
Sonstige Programmiersprachen »-
Welche Programmiersprache empfehlt ihr?
(11. Mai 2010, 13:45)
-
Flash »-
converter ?
(17. Februar 2007, 16:44)
-
Sonstige Programmiersprachen »-
Alle Programmiersprachen
(30. Dezember 2003, 23:37)
-
PHP »-
windows programiersprache
(8. April 2003, 19:55)


