Dynamisches Array



  • Ein Graus die Sourcecodes zu lesen. 😮 Dynamische Arrays ist klar: man legt sie an und schliesst sie wieder sobald man sie nicht mehr braucht. Für das Einlesen aus einer Datei (binär?) holt man sich erst die Inhalte (gewöhnlich einzelne Datensätze). Dann wertet man sie aus und steckt die Werte zur weiteren Bearbeitung beispielsweise in einen dynamischen Array einer Struktur. Wo ist das Problem? 😕 Achte beim Lesen der Datei auf die Performance, also so wenig Zugriffe wie möglich!



  • genau das ist ja am ende das ziel!
    Nach dem einlesen vor der Ablage in eine Struktur wird überprüft ob der Motor den Anforderungen genügt!
    das heist das Ziel ist es aus etwa 40 motoren 3 bis 7 in je einer Struktur zu speichern die man dann nutzen kann für weitere Berechnungen.
    Nur daher weiß ich halt nicht wieviele Strukturen ich brauche. Muss also genau das hinbekommen das ich mir eine neue Struktur anlege, am besten mit einer fortlaufenden Nummer in der Namensbezeichnung.

    Ist nur wenig erfolgversprechend wenn ich hier auch den funktionierenden Code reinposte, mit dem ich feststelle ob ich die daten übergeben muss oder nicht.



  • Dann sag doch einfach wieviele Bytes pro Motor zu erwarten sind. Vielleicht knallst du bei nur wenig Speicherbedarf alles ohne dymamische Anforderung alles statisch machen? Ich würde erst einmal die Sache zum Laufen bringen und dann über besseres nachdenken. Vielleicht machst du es aber besser mit C++ und Klassen?



  • Wenn du unbedingt mit C-Methoden arbeiten willst - es gibt auch realloc(), mit dem du den per malloc() angeforderten Speicher zu vergrößern. Ansonsten - deine cout-Aufrufe lassen darauf schließen, daß du in Wirklichkeit mit C++ arbeitest, also verwende doch auch C++ Methoden (IO-Streams für die Eingabe und std::vector<> für die dynamischen Arrays).



  • Der Hinweis zu den Vectoren war ein sehr guter!

    Habe mir daraufhin einiges über das Thema Vectoren im Inet durchgelesen und dasg anze in mein PRogramm integriert:

    Die Strukturen hab ich wie folgt definiert:

    struct Motor
    	{
    		char  NAME;
    		float Z_D;
    		float Z_A;
    		float E;
    		float Eta;
    		float P_D;
    		float P_max;
    		float p_D;
    		float p_Max;
    		float n_Min;
    		float n_Max;
    		float P_Ugr;
    		float P_Ogr;
    		float n_Gr;
    		float p_Gr;		
    	};
    
    	struct Getriebe
    	{
    		float Stufen;
    		float i_Get;
    		float T_DGet;
    		float T_maxGet;
    		float P_DGet;
    		float ShG;
    	};
    
    	vector<Motor> MOTOR;
    	vector<Getriebe> GETRIEBE;
    

    Die entsprechende Passage im code sieht folgendermassen aus:

    Motor_Datei = fopen("C:\\Dokumente und Einstellungen\\praktikant\\Eigene Dateien\\Visual Studio 2010\\Projects\\test_CSV\\Daten_Motore.csv", "r");
    						if(NULL == Motor_Datei)
    							{
    								printf("Konnte Datei nicht \x94 \bffnen!\n");
    							}
    
    						while((fscanf(Motor_Datei,"%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%s\n", &U_Kd,&U_Kz,&U_e,&U_eta,&U_PD,&U_Pmax,&U_pD,&U_pmax,&U_nmin,&U_nmax,&U_Pugr,&U_Pogr,&U_ngr,&U_pgr,&Name_Motor)) != EOF )
    							{   
    
                                                                      ...
    
     								if(i_min >= 3)
    									{
    										printf("\n\n");
    										cout << Name_Motor << endl;
    										cout << U_e << endl;
    										Motor INPUT_MOTOR = {Name_Motor[40],U_Kd,U_Kz,U_e,U_eta,U_PD,U_Pmax,U_pD,U_pmax,U_nmin,U_nmax,U_Pugr,U_Pogr,U_ngr,U_pgr}; 
    										cout << INPUT_MOTOR.NAME << endl;
    										cout << INPUT_MOTOR.E << endl;
    										MOTOR.push_back(INPUT_MOTOR);
    									   	cout << MOTOR.at(a).E << endl;
    										cout << MOTOR.at(a).NAME << endl;
    										printf("\n\n");
    										a++;
    									};
    							};
    

    An der Stelle der drei Punkte befindet sich noch eie Berechnung die ich zu Gunsten der Übersicht hier weggelassen habe.
    Habe zur Überprüfung die Ausgaben eingefügt.
    Die gesamten floats werden auch alle sauber übergeben, nur der Name, da streikt das ganze ... bekomme nru komische zeichen für die Ausgabe von INPUT_MOTOR.NAME und MOTOR.at(a).NAME.

    das ganez sieht das ungefähr so aus:

    KM11
    4.5
    komische Zeichen
    4.5
    4.5
    komische Zeichen

    aus.

    Hatte erst gedacht das es daran liegen könnte das in der Structurdefintion der char ohne Länge definiert worden ist. Gebe ich ihm jedoch die länge 40 bzw 41 fängt die Konsole an bei der ausgabe zu piepen, gibt weiterhin komische Zeichen aus und die anderen werte werden nicht mehr sauber übergeben 😞

    derzeit bin ich etwas überfragt warum das so ist 😕
    kann mir vieleicht jemand nen Tip geben wie die Lösung aussehen könnte bzw wo ich die Lösung finden könnte *ganz lieb schau*

    thx fürs helfen ...



  • Und ab damit nach C++.



  • wie meinst du das?



  • Wirst schon sehen.



  • Hat sich erledigt!!!

    Keine ahnung warum es nun funktioniert aber ich hab in der defition die deklaration von char auf String geändert und es funktioniert.
    Dazu noch die variable ans ende der Struktur verfrachtet und diese zeile dementsprechend umgeschrieben:

    von:

    Motor INPUT_MOTOR = {Name_Motor[40],U_Kd,U_Kz,U_e,U_eta,U_PD,U_Pmax,U_pD,U_pmax,U_nmin,U_nmax,U_Pugr,U_Pogr,U_ngr,U_pgr};
    

    in :

    Motor INPUT_MOTOR = {U_Kd,U_Kz,U_e,U_eta,U_PD,U_Pmax,U_pD,U_pmax,U_nmin,U_nmax,U_Pugr,U_Pogr,U_ngr,U_pgr,Name_Motor};
    

    Trotzdem danke an alle fürs tips geben und helfen !



  • Stevewonda schrieb:

    wie meinst du das?

    Du verwendest ja C++, was du schon zugegeben hast, da ist dein Gebastel mit fscanf() und char-Arrays einfach nur veraltet, weil C++ auch dafür günstigere Methoden bereitstellt (std::fstream und std::string).

    Ich hätte mir vermutlich eigene I/O-Operatoren geschrieben, um die Motoren einlesen zu können, und dann so eingelesen:

    Motor m;
    while(file>>m)
    {
      // Hilfsberechnungen
      if(...)
        motoren.push_back(m);
    }
    

Anmelden zum Antworten