Dynamisches Array
-
Jo super Start
wir haben noch ein kleines Problem, bei unserem Projekt wird vorher die Anzahl der Datensätze gezählt und eine int Var wird zurückgegeben. d.h. bei uns müsste eine int Var statt die 2000 stehen. damit haben wir unser problem !
#include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 20 #define MAXMessWerte 2000 struct MessWert { float Frequenz; float ScheinImpedanz; float Phase; }; int main() { FILE *pFile; // file pointer char fileName[SIZE]; char c; int zeilenanzahl = 1; do { printf("Bitte geben Sie den Namen der Datei ein: "); fgets(fileName, SIZE, stdin); fileName[strlen(fileName)-1] = '\0'; // <enter> löschen pFile = fopen(fileName, "r"); // Datei zum Lesen öffnen if (pFile) // Test, ob erfolgreich { printf("Datei %s geoeffnet.\n", fileName); } else printf("Datei konnte nicht gefunden werden.\n"); } while(pFile == NULL); while ((c=fgetc(pFile))!=EOF) if (c=='\n') { zeilenanzahl++; } printf("%d", zeilenanzahl); // struct MessWert *ArrayDyn = (struct MessWert*) malloc (zeilenanzahl * sizeof(struct MessWert)); fclose(pFile); // wieder schliessen return 0; }
-
Bernd-0815 schrieb:
Hallo Leute,
ich muss ein Programm schreiben und komme nicht weiter, ich soll Messwerte in ein Strukturarray einlesen.
Also ich habe ein struct mit 3 float speicherplätzen , und ein array welches ich dynamisch aufbau soll kann mir da jemand kleine Starttips geben ?
*hust*Liste*hust*
-
Bernd-0815 schrieb:
d.h. bei uns müsste eine int Var statt die 2000 stehen. damit haben wir unser problem !
Das ist kein Problem. Statt
malloc(2000 * sizeof ...
kannst Du genausogut
int anzahl;
anzahl = 2000;
malloc(anzahl * sizeof ...
schreiben. Du musst halt sicherstellen, dass in anzahl der richtige Wert - nämlich die Anzahl der erforderlichen Arrayeinträge - steht.
-
Glühbirne schrieb:
Bernd-0815 schrieb:
Hallo Leute,
ich muss ein Programm schreiben und komme nicht weiter, ich soll Messwerte in ein Strukturarray einlesen.
Also ich habe ein struct mit 3 float speicherplätzen , und ein array welches ich dynamisch aufbau soll kann mir da jemand kleine Starttips geben ?
*hust*Liste*hust*
Thema verfehlt.
-
#include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 20 #define MAXMessWerte 2000 #define MAXLINESIZE 1000 typedef struct { float Frequenz; float ScheinImpedanz; float Phase; } Messwert; int main() { Messwert *messwerte=0, dummy; FILE *pFile; // file pointer char fileName[SIZE]; char c, zeile[MAXLINESIZE]; int mwzahl =0; do { printf("Bitte geben Sie den Namen der Datei ein: "); fgets(fileName, SIZE, stdin); fileName[strlen(fileName)-1] = '\0'; // <enter> löschen pFile = fopen(fileName, "r"); // Datei zum Lesen öffnen if (pFile) // Test, ob erfolgreich { printf("Datei %s geoeffnet.\n", fileName); } else printf("Datei konnte nicht gefunden werden.\n"); } while(pFile == NULL); /* hier zum wiederholten Mal, wie man aus einer Datei zeilenweise strukturierte Daten liest */ while( fgets(zeile,MAXLINESIZE,pFile) ) if( 3==sscanf(zeile,"%f%f%f",&dummy.Frequenz,&dummy.ScheinImpedanz,&dummy.Phase) ) { messwerte=realloc(messwerte,++mwzahl*sizeof*messwerte); messwerte[mwzahl-1]=dummy; } fclose(pFile); // wieder schliessen printf("Es wurden %d Messwerte gelesen.\n",mwzahl); while( mwzahl-- ) printf("%f %f %f\n",messwerte[mwzahl].Frequenz,messwerte[mwzahl].ScheinImpedanz,messwerte[mwzahl].Phase); free(messwerte); return 0; }
Und was ist daran nun so schwierig?
Steht sowas nicht bei JW?
-
Da Wutz mich auf dieses Thema aufmerksam gemacht habe, hab ich mir seinen code mal angeschaut.
Hab bei mir ein sehr ähnlich gelagertes Problem:
Will auch meien eingelesenen Daten in einer Structur im Programm speichern.
Hab dazu eine Struktur erzeugt:struct Motor { 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_Ogr; float n_Gr; float p_Gr; float P_Ugr; };
Hiermit will ich die werte einlesen und an die Variabel übergeben:
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 ) { a = 1; Motor 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}; a++; cout << MOTOR.P_Ugr << endl; // Testausgabe! };
Mein Traum wäre, das die Strukturvariablen nach dem Einlesen den Namen hätten, der im eingelesenen String (letzte Einleseposition)
enthalten ist, hab dazu aber noch keinen Code oder ähnliches gefunden.Wollte jetzt die Variabeln mit Hilfe der schleife und der operation a++ bezeichnen -> Motor[a] = {...};
der Code dazu würde dann wie folgt aussehen an der stelle :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 ) { a = 1; Motor MOTOR[a] = {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}; a++; cout << MOTOR.P_Ugr << endl; // Testausgabe! };
hab das so auch schon in ein paar andere foren gesehen und ich vertsehe den code von Wutz ähnlich aber bei mir gibt er an der stelle nur einen Fehler aus
Würde mich freuen, wenn mir jemand sagen könnte warum das nicht fuktioniert und wie man sowas hinbekommt.
-
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 Zeichenaus.
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); }