Maximale Array Größe erreicht?! Was tun...



  • Dein Code ist halt mies wartbar, das ist das Problem.


  • Mod

    Javun schrieb:

    Priorität war, dass das Programm funktioniert und das tut es. Ob nun 200 oder 50 Zeilen interessiert eigentlich herzlich wenig.

    Nein. Schlechte Einstellung, die dir in Zukunft garantiert Probleme machen wird.

    Auch ist es relativ unwichtig wie der Quellcode aussieht.

    Falls du mit Objektcode den Quellcode meinst: Nein. Schlechte Einstellung, die dir in Zukunft garantiert Probleme machen wird.
    Falls du wirklich den Objektcode meinstest: Ja.

    1. Wo die Definitionen hingehören ist doch herzlich egal.

    Nein. Schlechte Einstellung sdie dir in Zukunft Probleme machen wird.

    Natürlich könnte ich jetzt 1 Stunde meiner Zeit investestieren um den Code schöner aussehen zu lassen, dass bringt demjenigen, der später die .exe ausführt aber herzlichst wenig.

    Nein. Schlechte Einstellung, die dir in Zukunft garantiert Probleme machen wird.

    2. Was sieht den da falsch aus? Ich verstehe auch nicht ganz, wo ich die letzte Zeile doppelt lese?!

    Du prüfst auf Fehler, dann liest du ein, dann verarbeitest du. Was passiert wohl, wenn ein Lesefehler, zum Beispiel Dateiende, auftritt?

    Ich würde ja sonst nicht auf die korrekten Ergebnisse kommen.

    Dann hast du Glück, weil in deiner letzten Zeile nichts steht, was du verarbeitest (vermutlich eine Leerzeile)

    Was für unerwartete Fehler sollte es denn geben, wenn die auszuwertende Datei immer gleich aussieht?!

    Wenn sie immer gleich aussieht, warum ist es dann eine externe Datei? Irgendwas wirst du doch ändern.

    Wie man mit Konstruktoren und Destruktoren des Dateistreams arbeitet weiß ich als Anfänger leider nicht, aber wie das geht, dass wäre eine Antwort auf meine Frage gewesen...

    Ja, eigentlich ist das das Stichwort für Pi, der das jedem Anfänger unter die Nase reibt. Eigentlich komisch, dass er noch nichts geschrieben hat. Ansonsten empfehle ich mal, alte Threads hier anzugucken oder ein besseres Buch zu lesen. Zum Erklären der Details bin ich selber gerade zu faul.

    3. Weil mir nicht ganz klar ist, wie das in einem Rutsch gehen soll?! Siehe Änderung von der ersten Version zur jetzigen.

    Wieso liest du immer wieder von vorne ein? Geh doch einmal durch und guck, was in der Zeile steht!

    4. Mag sein, das lässt sich leicht ändern, aber es funktioniert und den Quellcode sieht niemand außer ich 😉

    Nein. Schlechte Einstellung, die dir in Zukunft garantiert Probleme machen wird.

    Auch ist es relativ unwichtig wie der Quellcode aussieht.

    5. Siehe 4.
    [/quote]Nein. Schlechte Einstellung, die dir in Zukunft garantiert Probleme machen wird.

    Auch ist es relativ unwichtig wie der Quellcode aussieht.

    6. Wenn ich da signifikante Vorteile sehen würde, dann hätte ich es sicherlich gemacht.[/quote]Wie siehst du denn keine Vorteile? Das erhöht die abstraktion und vermeidet Codeduplizierung. Das erhöht die Wartbarkeit ganz enorm! Das ist einer der größten Vorteile die man überhaupt haben kann! Gerade dein Quellcode ist ein Musterbeispiel an Unwartbarkeit, daher ist es auch so schwer, dir zu helfen.

    7. Verstehe nicht ganz, was Du damit aussagen willst?!

    Du benutzt unnötige, temporäre Werte wie in Zeile 183, weil du dies nicht zu wissen scheinst.



  • SeppJ schrieb:

    Ja, eigentlich ist das das Stichwort für Pi, der das jedem Anfänger unter die Nase reibt. Eigentlich komisch, dass er noch nichts geschrieben hat.

    Findest du nicht okay, dass ich das tue? (_dass_ ich es tue, nicht _wie_!)
    Ich hab mich nicht gemeldet, da der TE ja offenbar keine Hilfe annimmt. Ansonsten hätte ich ihm das Programm vermutlich mithilfe von boost::spirit komplett neu geschrieben. Da er aber nicht mal bekanntgibt, was für Daten er überhaupt parsen will, ist das Zeitverschwendung.



  • stringstream ss;
        ss <<"ready.csv" ;
        string filename = ss.str();
        ofstream fout;
        fout.open(filename.c_str(), ios::trunc);
    

    Wieso kritisiert eigentlich das keiner? Komplett redundanter Code.



  • Wahrscheinlich weil du der erste bist, der so weit gelesen hat 😉


  • Mod

    314159265358979 schrieb:

    Wahrscheinlich weil du der erste bist, der so weit gelesen hat 😉

    +1. Ich hatte ja schon den temporären Zwischenstring bemängelt, aber dass das ganze Konstrukt derart unnötig ist, war mir gar nicht aufgefallen.



  • Javun schrieb:

    Falls noch jmd. Verbesserungsvorschläge hat immer her damit 🙂

    Hallo Javun,

    Damit meintest Du doch Deinen Code und SeppJ hat sich die Mühe gemacht einige Verbesserungsvorschläge aufzuführen. Und spätestens Deine Reaktion

    Javun schrieb:

    Priorität war, dass das Programm funktioniert und das tut es. Ob nun 200 oder 50 Zeilen interessiert eigentlich herzlich wenig. Auch ist es relativ unwichtig wie der Quellcode aussieht.

    entlarvt Dich als Anfänger.
    Aber das ist nicht schlimm, jeder hat mal klein angefangen. 😉

    Interessant ist vor allem diese Sequenz:

    Javun schrieb:

    getline(f, s);
                                double zahl;
                                double ehoch;
                                double gzahl;
                                string zahlvorz_str = s.substr(2, 1);
                                string zahl_str = s.substr(3, 13);
                                string ehochvorz_str = s.substr(17, 1);
                                string ehoch_str = s.substr(18, 3);
                                stringstream zahl_ss(zahl_str);
                                zahl_ss >> zahl;
                                stringstream ehoch_ss(ehoch_str);
                                ehoch_ss >> ehoch;                                
                                if(zahlvorz_str=="+"){                                                                      
                                                      zahl = 0 + zahl;                                                            
                                }
                                else{
                                                      zahl = 0 - zahl;  
                                }
                                if(ehochvorz_str=="+"){
                                                       ehoch = pow(10, 0+ehoch);
                                }
                                else{
                                                       ehoch = pow(10, 0-ehoch);  
                                }                                
                                uq[q]=zahl * ehoch;
    

    diese 25 Zeilen kann man im Prinzip ersetzen durch

    f.ignore(2) >> uq[q];
        f.ignore( numeric_limits< streamsize >::max(), '\n' );
    

    evt. kann man selbst dies noch vereinfachen, indem man die zweite Zeil weglässt, aber ich kenne Dein Dateiformat natürlich nicht.

    Und zu SeppJs Punkt 2 und

    while (!f.eof())
    

    habe ich hier schon mal was verfasst.

    Nein es ist nicht egal, wie der Quellcode aussieht.

    Gruß
    Werner



  • So dann meld ich mich auch Mal zu Wort. Also zunächst einmal bin ich wirklich blutiger Anfänger, was die Programmierung angeht. Leider war es mir auch nicht möglich mich innerhalb von 2 Wochen in soetwas wie objektorientiere Programmierung einzuarbeiten, aber ich hatte gehofft, dass ich mit meinem Wissen und ein bisschen Hilfe ein funktionierenden Programm auf die Beine stellen kann.

    Was soll das Programm genau machen?
    Es soll eine Qucs Dataset Datei auslesen,
    in der Zeile <indep acfrequency x> steht die Anzahl der Frequenzen (x).
    In der Zeile <indep phase_urm_var y> steht die Anzahl der Phasen (y).
    In der Zeile <indep uq z> steht die Anzahl der Eingangsspannungen (z).
    Ab der Zeile <dep umeneu acfrequency phase_urm_var uq> stehen alle Ergebnisse der Simulation, die Simulation hat genau soviel Ergebnisse wie x*y*z. Dier Ergebnisse sollen nun gemittelt werden über Phase und Frequenz, d.h. für jede Eingangsspannung soll genau eine Ausgangsspannung als Ergebnis herauskommen. Also mussen immer x*y Zeilen gemittelt werden usw...

    Die Zahlen in der Datei haben immer das Format:
    +2.62377776236e-008

    Leider bekomme ich an einigen Stellen wirklich falsche Ergebnisse raus, daher wäre ich euch für Hilfe sehr dankbar. Ich bitte euch nur wenn möglich bei meinem Anfängercode zu bleiben, denn den Code verstehe ich. Es bringt mir nicht viel, wenn ich einen Code mit Konstrukturen usw. perfekt programmiert habe, ich jedoch keine Änderung mehr vornehmen kann, da ich den Code nicht verstehe und mich da erst einarbeiten kann.

    Deswegen habe ich auch Schrittweise versucht das Problem zu lösen und nicht gleich alles in einem Rutsch. Für den geübten sollte das natürlich kein Problem sein, aber ich habe da noch leider meine Probleme mit, daher denke ich das auch doppelte Schritte nicht unbedingt schädlich sind solange sie meinem Verständnis dienen oder sehe ich das falsch?

    Beispiel der Datei:

    <Qucs Dataset 0.0.15>
    <indep Urm 1>
      +5.30751744861e-007
    </indep>
    <indep y 1>
      +1.78631210467e-008
    </indep>
    <indep acfrequency 2>
      +6.72000000000e+002
      +6.82000000000e+002
    </indep>
    <indep phase_urm_var 2>
      -1.80000000000e+002
      +1.80000000000e+002
    </indep>
    <indep uq 2>
      +1.00000000000e-015
      +1.00000000000e-007
    </indep>
    <dep umeneu acfrequency phase_urm_var uq>
      +1.67213405084e-008
      +1.59303541061e-008
      +1.67213405084e-008
      +1.59303541061e-008
      +1.98703688153e-008
      +1.89304207570e-008
      +1.98703688153e-008
      +1.89304207570e-008
    </dep>
    <dep U_ME1.v acfrequency phase_urm_var uq>
      +1.67213405084e-008+j2.04770597862e-024
      -1.59303541061e-008-j1.95084128199e-024
      +1.67213405084e-008-j2.04770597939e-024
      -1.59303541061e-008+j1.95084128199e-024
      +1.98703688153e-008+j2.04770597708e-024
      -1.89304207570e-008-j1.95084128276e-024
      +1.98703688153e-008-j2.04770598324e-024
      -1.89304207570e-008+j1.95084128276e-024
    </dep>
    <dep V1.i acfrequency phase_urm_var uq>
      +1.20871499877e-029-j9.87023297137e-014
      -1.16867391765e-029+j9.54326193230e-014
      -1.20871499877e-029-j9.87023297137e-014
      +1.16867391765e-029+j9.54326193230e-014
      +1.20871499877e-029-j1.17290338855e-013
      -1.16867391765e-029+j1.13404863803e-013
      -1.20871499877e-029-j1.17290338855e-013
      +1.16867391765e-029+j1.13404863803e-013
    </dep>
    <dep V2.i acfrequency phase_urm_var uq>
      +3.05172413793e-013+j9.87023297137e-014
      +3.05172413793e-013-j9.54326193230e-014
      +3.05172413793e-013+j9.87023297137e-014
      +3.05172413793e-013-j9.54326193230e-014
      +3.05172413793e-013+j1.17290338855e-013
      +3.05172413793e-013-j1.13404863803e-013
      +3.05172413793e-013+j1.17290338855e-013
      +3.05172413793e-013-j1.13404863803e-013
    </dep>
    <dep _net3.v acfrequency phase_urm_var uq>
      -1.64510637319e-017-j4.94667241197e-019
      +7.32282543222e-018-j4.94667241197e-019
      +7.72323624342e-018+j4.94667241197e-019
      -1.60506529207e-017+j4.94667241197e-019
      -1.64510637319e-017+j1.21295118047e-017
      +7.32282543222e-018-j1.31188462871e-017
      +7.72323624342e-018+j1.31188462871e-017
      -1.60506529207e-017-j1.21295118047e-017
    </dep>
    <dep _net5.v acfrequency phase_urm_var uq>
      +5.30999999984e-007-j4.94602214599e-019
      +5.31000000007e-007-j4.94602214599e-019
      +5.31000000008e-007+j4.94602214599e-019
      +5.30999999984e-007+j4.94602214599e-019
      +5.30999999984e-007+j1.21295768313e-017
      +5.31000000007e-007-j1.31187812605e-017
      +5.31000000008e-007+j1.31187812605e-017
      +5.30999999984e-007-j1.21295768313e-017
    </dep>
    <dep _net7.v acfrequency phase_urm_var uq>
      +1.67213394919e-008-j4.94665193491e-019
      -1.59303550987e-008-j4.94669192038e-019
      +1.67213395161e-008+j4.94665193491e-019
      -1.59303551221e-008+j4.94669192038e-019
      -8.01296312012e-008+j1.21295138524e-017
      -1.18930420750e-007-j1.31188482379e-017
      -8.01296311770e-008+j1.31188442394e-017
      -1.18930420773e-007-j1.21295098538e-017
    </dep>
    <dep _net0.v acfrequency phase_urm_var uq>
      -2.34580397786e-028+j9.43255890062e-018
      +1.40412606860e-028+j2.06676039130e-018
      +2.34580397786e-028+j6.55264687996e-018
      -1.40412606860e-028-j5.23805174582e-018
      -3.64817874990e-027+j2.74845250725e-017
      -4.47757913230e-027+j1.23666810299e-017
      +3.64817874990e-027+j6.36629963156e-017
      +4.47757913230e-027+j5.05509262921e-018
    </dep>
    <dep _net1.v acfrequency phase_urm_var uq>
      -1.67213405084e-008+j9.43255685292e-018
      +1.59303541061e-008+j2.06676234214e-018
      -1.67213405084e-008+j6.55264892767e-018
      +1.59303541061e-008-j5.23805369666e-018
      -1.98703688153e-008+j2.74845230248e-017
      +1.89304207570e-008+j1.23666829808e-017
      -1.98703688153e-008+j6.36629983633e-017
      +1.89304207570e-008+j5.05509067837e-018
    </dep>
    <dep _net4.v acfrequency phase_urm_var uq>
      -1.01645106429e-015-j4.94667241197e-019
      -9.92677175497e-016-j4.94667241197e-019
      -9.92276763832e-016+j4.94667241197e-019
      -1.01605065263e-015+j4.94667241197e-019
      -1.00000000016e-007+j1.21295118047e-017
      -9.99999999927e-008-j1.31188462871e-017
      -9.99999999923e-008+j1.31188462871e-017
      -1.00000000016e-007-j1.21295118047e-017
    </dep>
    <dep _net2.v acfrequency phase_urm_var uq>
      +1.00000000000e-015
      +1.00000000000e-015
      +1.00000000000e-015
      +1.00000000000e-015
      +1.00000000000e-007
      +1.00000000000e-007
      +1.00000000000e-007
      +1.00000000000e-007
    </dep>
    <dep _net6.v acfrequency phase_urm_var uq>
      +3.68300032776e-005-j4.90157015602e-019
      -3.50877965602e-005-j4.98964115049e-019
      +3.68300032776e-005+j4.90157015602e-019
      -3.50877965603e-005+j4.98964115049e-019
      +4.36659736817e-005+j1.21340220303e-017
      -4.17956677725e-005-j1.31231431609e-017
      +4.36659736818e-005+j1.31143360615e-017
      -4.17956677725e-005-j1.21252149308e-017
    </dep>
    

  • Mod

    Javun schrieb:

    Leider bekomme ich an einigen Stellen wirklich falsche Ergebnisse raus, daher wäre ich euch für Hilfe sehr dankbar.

    Magst du das vielleicht erläutern? Was genau kommt bei welcher Eingabe raus und was würdest du erwarten und warum?

    Hast du denn auch schon die genannten Fehler (es wurden dir auch Fehler genannt, nicht nur Designschwächen) korrigiert?



  • Also mein Quellcode sieht derzeit so aus (keine großartigen Veränderungen zu vorher.

    Ich habe den Code schon einige Male durchgesehen, aber ich konnte nicht feststellen, wo die letzte Teile doppelt gelesen wird?

    Zu den auftretenden Fehlern. Das ist schwer zu sagen, was da genau schiefläuft. Ich habe das Programm mit bis zu 100 Werten getestet, die alle korrekt gemittelt und ausgegeben wurden. Nun sollen bei den anstehenden Simulationen jedoch ca. 100.000 Werte analysiert werden und genau da treten dann Fehler auf. Wenn ich x zahlen der Form y*10^-9 addiere und dann durch x teile (um zu mitteln), dann kann das Ergebnis wohl kaum z*10^256 sein, dies passiert z.B. bei der 10. Mittlung! Weiterhin bekomme ich an einigen Stellen als Ergebnis -1.#QNAN raus.

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <cmath>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {  
        ifstream f;                      // Datei-Handle
        string s;                            
        size_t pos1;
        size_t pos2;
    
    // Anzahl der Frequenzen ermitteln
        int acfrequency_anzahl;                         // Anzahl der Frequenzen
        string abgl1 = "<indep acfrequency ";           // Anfang
        string abgl2 = ">";                             // Ende
        f.open("rausch_simu.dat", ios::in);             // Öffne Datei aus Parameter
        while (!f.eof())                                // Solange noch Daten vorliegen
        {
            getline(f, s);                              // Lese eine Zeile
            pos1 = s.find(abgl1);
            pos2 = s.find(abgl2);
    
            if(pos1 != string::npos && pos2 != string::npos){
                        string acfrequency_str = s.substr(int(pos1)+19, int(pos2)-int(pos1)-1);
                        stringstream acfrequency_ss(acfrequency_str);
                        acfrequency_ss >> acfrequency_anzahl;
                        pos1 = string::npos;
                        pos2 = string::npos;
                        break;
               }
        }
        f.close();                                      // Datei wieder schließen
        cout<<"Anzahl der Frequenzen: "<<acfrequency_anzahl<<endl;
    
    // Anzahl der Phasen ermitteln
        int phase_urm_var_anzahl;                         // Anzahl der Phasen
        abgl1 = "<indep phase_urm_var ";  // Anfang
        abgl2 = ">";                    // Ende
        f.open("rausch_simu.dat", ios::in);             // Öffne Datei aus Parameter
        while (!f.eof())                                // Solange noch Daten vorliegen
        {
            getline(f, s);                              // Lese eine Zeile
            pos1 = s.find(abgl1);
            pos2 = s.find(abgl2);
    
            if(pos1 != string::npos && pos2 != string::npos){
                        string phase_urm_var_str = s.substr(int(pos1)+21, int(pos2)-int(pos1)-1);
                        stringstream phase_urm_var_ss(phase_urm_var_str);
                        phase_urm_var_ss >> phase_urm_var_anzahl;
                        pos1 = string::npos;
                        pos2 = string::npos;
                        break;
               }
        }
        f.close();                                      // Datei wieder schließen
        cout<<"Anzahl der Phasen: "<<phase_urm_var_anzahl<<endl;
    
    // Anzahl der Eingangsspannungen ermitteln
        int uq_anzahl;                   // Anzahl der unterschiedlichen Spannungsquellen
        abgl1 = "<indep uq ";          
        abgl2 = ">";                  
        f.open("rausch_simu.dat", ios::in);             // Öffne Datei aus Parameter
        while (!f.eof())                                // Solange noch Daten vorliegen
        {
            getline(f, s);                              // Lese eine Zeile
            pos1 = s.find(abgl1);
            pos2 = s.find(abgl2);
    
            if(pos1 != string::npos && pos2 != string::npos){
                        string uq_str = s.substr(int(pos1)+10, int(pos2)-int(pos1)-1);
                        stringstream uq_ss(uq_str);
                        uq_ss >> uq_anzahl;
                        pos1 = string::npos;
                        pos2 = string::npos;
                        break;
               }
        }
        f.close();                                      // Datei wieder schließen
        cout<<"Anzahl der Spannungen: "<<uq_anzahl<<endl;
    
    // Eingangsspanunngen in das Array uq schreiben
        double uq[uq_anzahl];
        abgl1 = "<indep uq ";          
        abgl2 = ">";                  
        f.open("rausch_simu.dat", ios::in);             // Öffne Datei aus Parameter
        while (!f.eof())                                // Solange noch Daten vorliegen
        {
            getline(f, s);                              // Lese eine Zeile
            pos1 = s.find(abgl1);
            pos2 = s.find(abgl2);
    
            if(pos1 != string::npos && pos2 != string::npos){
                        for(int q=0; q<uq_anzahl; q++){
                                getline(f, s);
                                double zahl;
                                double ehoch;
                                double gzahl;
                                string zahlvorz_str = s.substr(2, 1);
                                string zahl_str = s.substr(3, 13);
                                string ehochvorz_str = s.substr(17, 1);
                                string ehoch_str = s.substr(18, 3);
                                stringstream zahl_ss(zahl_str);
                                zahl_ss >> zahl;
                                stringstream ehoch_ss(ehoch_str);
                                ehoch_ss >> ehoch;                                 
                                if(zahlvorz_str=="+"){                                                                       
                                                      zahl = 0 + zahl;                                                             
                                }
                                else{
                                                      zahl = 0 - zahl;   
                                }
                                if(ehochvorz_str=="+"){
                                                       ehoch = pow(10, 0+ehoch);
                                }
                                else{
                                                       ehoch = pow(10, 0-ehoch);  
                                }                                
                                uq[q]=zahl * ehoch;
                        }
                        pos1 = string::npos;
                        pos2 = string::npos;
                        break;                    
               }
        }
        f.close();                                      // Datei wieder schließen
    
    // Ergebnisse mitteln und in das Array ua schreiben
        double ua[uq_anzahl];
        int avg_anzahl = acfrequency_anzahl*phase_urm_var_anzahl;
        abgl1 = "<dep umeneu acfrequency phase_urm_var uq>";              
        f.open("rausch_simu.dat", ios::in);             // Öffne Datei aus Parameter
        while (!f.eof())                                // Solange noch Daten vorliegen
        {
            getline(f, s);                              // Lese eine Zeile
            pos1 = s.find(abgl1);
    
            if(pos1 != string::npos){
                        for(int q=0; q<uq_anzahl; q++){
                                double gzahl;
                                for(int p=0; p<avg_anzahl; p++){
                                        getline(f, s);
                                        long double zahl;
                                        long double ehoch;
                                        string zahlvorz_str = s.substr(2, 1);
                                        string zahl_str = s.substr(3, 13);
                                        string ehochvorz_str = s.substr(17, 1);
                                        string ehoch_str = s.substr(18, 3);
                                        stringstream zahl_ss(zahl_str);
                                        zahl_ss >> zahl;
                                        stringstream ehoch_ss(ehoch_str);
                                        ehoch_ss >> ehoch;                                 
                                        if(zahlvorz_str=="+"){                                                                       
                                                              zahl = 0 + zahl;                                                             
                                        }
                                        else{
                                                              zahl = 0 - zahl;   
                                        }
                                        if(ehochvorz_str=="+"){
                                                               ehoch = pow(10, 0+ehoch);
                                        }
                                        else{
                                                               ehoch = pow(10, 0-ehoch);  
                                        }                                
                                        gzahl = zahl * ehoch;
                                        ua[q] = ua[q] + gzahl;
                                }
                                ua[q] = ua[q] / avg_anzahl;
                        }
                        pos1 = string::npos;
                        break;                    
               }
        }
        f.close();                                      // Datei wieder schließen
    
    // Uq, Ua in die Datei ready.csv schreiben
        stringstream ss;
        ss <<"ready.csv" ;
        string filename = ss.str();
        ofstream fout;
        fout.open(filename.c_str(), ios::trunc);
        cout<<endl <<"Uq -------> Ua" <<endl;
        for(int q=0; q<uq_anzahl; q++){
                fout<<uq[q] <<";" <<ua[q] <<endl;
                cout<<uq[q] <<"------->" <<ua[q] <<endl;
        }
        fout.close();
        cout<<endl <<"ready.csv Datei wurde erfolgreich erstellt." <<endl;
    
    // Dos Fenster nicht schließen
        cin.get();
        cin.get();
    }
    


  • Edit: Fehler verschwinden sobald ich ua[q] bzw uq[q] vorher auf 0 setze. Findet ihr sonst noch Fehler?

    Ich habe nun auch begonnen den Quellcode entsprechen den Empfehlungen hier anzupassen. Ich habe die 1. drei Dateiaufrufe, also zur Bestimmung der Frequenz-, Phasen- und Spannungsanzahl in einen Dateiaufruf gepackt. Hat dazu noch irgendjmd. Verbesserungsvorschläge?

    Hier schon Mal der bisher angepasste Quellcode:

    int main(int argc, char *argv[])
    {  
    // Anzahl der Frequenzen, Phasen und Spannungen ermitteln                          
        int acfrequency_anzahl;                         // Anzahl der Frequenzen
        int phase_urm_var_anzahl;                         // Anzahl der Phasen
        int uq_anzahl;                   // Anzahl der unterschiedlichen Spannungsquellen
        ifstream f;                      // Datei-Handle
        f.open("rausch_simu.dat", ios::in);             // Öffne Datei aus Parameter
        while (!f.eof())                                // Solange noch Daten vorliegen
        {
            string s;            
            getline(f, s);                              // Lese eine Zeile
            size_t pos_frequenzen_anfang = s.find("<indep acfrequency ");
            size_t pos_phase_anfang = s.find("<indep phase_urm_var ");
            size_t pos_uq_anfang = s.find("<indep uq ");
            size_t pos_ende = s.find(">");         
    
            if(pos_frequenzen_anfang != string::npos && pos_ende != string::npos){
                        string acfrequency_str = s.substr(int(pos_frequenzen_anfang)+19, int(pos_ende)-int(pos_frequenzen_anfang)-1);
                        stringstream acfrequency_ss(acfrequency_str);
                        acfrequency_ss >> acfrequency_anzahl;
               }
            if(pos_phase_anfang != string::npos && pos_ende != string::npos){
                        string phase_urm_var_str = s.substr(int(pos_phase_anfang)+21, int(pos_ende)-int(pos_phase_anfang)-1);
                        stringstream phase_urm_var_ss(phase_urm_var_str);
                        phase_urm_var_ss >> phase_urm_var_anzahl;
                }
            if(pos_uq_anfang != string::npos && pos_ende != string::npos){
                        string uq_str = s.substr(int(pos_uq_anfang)+10, int(pos_ende)-int(pos_uq_anfang)-1);
                        stringstream uq_ss(uq_str);
                        uq_ss >> uq_anzahl;
               }
        }
        f.close();                                      // Datei wieder schließen
        cout<<"Anzahl der Frequenzen: "<<acfrequency_anzahl<<endl;
        cout<<"Anzahl der Phasen: "<<phase_urm_var_anzahl<<endl;
        cout<<"Anzahl der Spannungen: "<<uq_anzahl<<endl;
    
    // Dos Fenster nicht schließen
        cin.get();
        cin.get(); 
    }
    

  • Mod

    Bezüglich deiner Arrayprobleme: Du weißt wohl nicht, was ein vector ist?

    Mehr Fehler sind die gleichen Fehler wie vorher:

    while (!f.eof())                                // Solange noch Daten vorliegen
    

    Nein, das heißt es eben nicht. while (!f.eof()) heißt "solange der letzte Lesevorgang nicht an eof gescheitert ist".

    Was sollen die ganzen Casts?

    Ist das substr-Gefummel wirklich nötig? Ich kenne dein Dateiformat und das was du aus der Datei lesen möchtest nicht, aber es sieht unnötig kompliziert aus.



  • Kannst du das Format nochmal genauer erklären? Ich habs nicht wirklich verstanden...



  • SeppJ schrieb:

    Bezüglich deiner Arrayprobleme: Du weißt wohl nicht, was ein vector ist?

    Mehr Fehler sind die gleichen Fehler wie vorher:

    while (!f.eof())                                // Solange noch Daten vorliegen
    

    Nein, das heißt es eben nicht. while (!f.eof()) heißt "solange der letzte Lesevorgang nicht an eof gescheitert ist".

    Was sollen die ganzen Casts?

    Ist das substr-Gefummel wirklich nötig? Ich kenne dein Dateiformat und das was du aus der Datei lesen möchtest nicht, aber es sieht unnötig kompliziert aus.

    Und wie würde es denn korrekt heißen? Das ist ehrlichgesagt auch nicht auf meinen Mist gewachsen, dass sind Muster Lösungen aus Büchern und Foren.

    Ich habe doch auf der Seite 2 eine komplette Beispiel Datei gepostet?! Casten muss ich die Werte doch, wie soll ich sonst auf einem string eine Zahl machen?

    Kannst du das Format nochmal genauer erklären? Ich habs nicht wirklich verstanden...

    Ich habe doch auf der Seite 2 eine komplette Beispiel Datei gepostet?! Aber hier nochmal. Noch zur Info. Der Aufbau der Datei wird immer gleich bleiben. Einzig und alleine die Anzahl der Werte zwischen <indep ...></indep> wird varrieren.

    <Qucs Dataset 0.0.15>
    <indep Urm 1>
      +5.30751744861e-007
    </indep>
    <indep y 1>
      +1.78631210467e-008
    </indep>
    <indep acfrequency 2>
      +6.72000000000e+002
      +6.82000000000e+002
    </indep>
    <indep phase_urm_var 2>
      -1.80000000000e+002
      +1.80000000000e+002
    </indep>
    <indep uq 2>
      +1.00000000000e-015
      +1.00000000000e-007
    </indep>
    <dep umeneu acfrequency phase_urm_var uq>
      +1.67213405084e-008
      +1.59303541061e-008
      +1.67213405084e-008
      +1.59303541061e-008
      +1.98703688153e-008
      +1.89304207570e-008
      +1.98703688153e-008
      +1.89304207570e-008
    </dep>
    <dep U_ME1.v acfrequency phase_urm_var uq>
      +1.67213405084e-008+j2.04770597862e-024
      -1.59303541061e-008-j1.95084128199e-024
      +1.67213405084e-008-j2.04770597939e-024
      -1.59303541061e-008+j1.95084128199e-024
      +1.98703688153e-008+j2.04770597708e-024
      -1.89304207570e-008-j1.95084128276e-024
      +1.98703688153e-008-j2.04770598324e-024
      -1.89304207570e-008+j1.95084128276e-024
    </dep>
    <dep V1.i acfrequency phase_urm_var uq>
      +1.20871499877e-029-j9.87023297137e-014
      -1.16867391765e-029+j9.54326193230e-014
      -1.20871499877e-029-j9.87023297137e-014
      +1.16867391765e-029+j9.54326193230e-014
      +1.20871499877e-029-j1.17290338855e-013
      -1.16867391765e-029+j1.13404863803e-013
      -1.20871499877e-029-j1.17290338855e-013
      +1.16867391765e-029+j1.13404863803e-013
    </dep>
    <dep V2.i acfrequency phase_urm_var uq>
      +3.05172413793e-013+j9.87023297137e-014
      +3.05172413793e-013-j9.54326193230e-014
      +3.05172413793e-013+j9.87023297137e-014
      +3.05172413793e-013-j9.54326193230e-014
      +3.05172413793e-013+j1.17290338855e-013
      +3.05172413793e-013-j1.13404863803e-013
      +3.05172413793e-013+j1.17290338855e-013
      +3.05172413793e-013-j1.13404863803e-013
    </dep>
    <dep _net3.v acfrequency phase_urm_var uq>
      -1.64510637319e-017-j4.94667241197e-019
      +7.32282543222e-018-j4.94667241197e-019
      +7.72323624342e-018+j4.94667241197e-019
      -1.60506529207e-017+j4.94667241197e-019
      -1.64510637319e-017+j1.21295118047e-017
      +7.32282543222e-018-j1.31188462871e-017
      +7.72323624342e-018+j1.31188462871e-017
      -1.60506529207e-017-j1.21295118047e-017
    </dep>
    <dep _net5.v acfrequency phase_urm_var uq>
      +5.30999999984e-007-j4.94602214599e-019
      +5.31000000007e-007-j4.94602214599e-019
      +5.31000000008e-007+j4.94602214599e-019
      +5.30999999984e-007+j4.94602214599e-019
      +5.30999999984e-007+j1.21295768313e-017
      +5.31000000007e-007-j1.31187812605e-017
      +5.31000000008e-007+j1.31187812605e-017
      +5.30999999984e-007-j1.21295768313e-017
    </dep>
    <dep _net7.v acfrequency phase_urm_var uq>
      +1.67213394919e-008-j4.94665193491e-019
      -1.59303550987e-008-j4.94669192038e-019
      +1.67213395161e-008+j4.94665193491e-019
      -1.59303551221e-008+j4.94669192038e-019
      -8.01296312012e-008+j1.21295138524e-017
      -1.18930420750e-007-j1.31188482379e-017
      -8.01296311770e-008+j1.31188442394e-017
      -1.18930420773e-007-j1.21295098538e-017
    </dep>
    <dep _net0.v acfrequency phase_urm_var uq>
      -2.34580397786e-028+j9.43255890062e-018
      +1.40412606860e-028+j2.06676039130e-018
      +2.34580397786e-028+j6.55264687996e-018
      -1.40412606860e-028-j5.23805174582e-018
      -3.64817874990e-027+j2.74845250725e-017
      -4.47757913230e-027+j1.23666810299e-017
      +3.64817874990e-027+j6.36629963156e-017
      +4.47757913230e-027+j5.05509262921e-018
    </dep>
    <dep _net1.v acfrequency phase_urm_var uq>
      -1.67213405084e-008+j9.43255685292e-018
      +1.59303541061e-008+j2.06676234214e-018
      -1.67213405084e-008+j6.55264892767e-018
      +1.59303541061e-008-j5.23805369666e-018
      -1.98703688153e-008+j2.74845230248e-017
      +1.89304207570e-008+j1.23666829808e-017
      -1.98703688153e-008+j6.36629983633e-017
      +1.89304207570e-008+j5.05509067837e-018
    </dep>
    <dep _net4.v acfrequency phase_urm_var uq>
      -1.01645106429e-015-j4.94667241197e-019
      -9.92677175497e-016-j4.94667241197e-019
      -9.92276763832e-016+j4.94667241197e-019
      -1.01605065263e-015+j4.94667241197e-019
      -1.00000000016e-007+j1.21295118047e-017
      -9.99999999927e-008-j1.31188462871e-017
      -9.99999999923e-008+j1.31188462871e-017
      -1.00000000016e-007-j1.21295118047e-017
    </dep>
    <dep _net2.v acfrequency phase_urm_var uq>
      +1.00000000000e-015
      +1.00000000000e-015
      +1.00000000000e-015
      +1.00000000000e-015
      +1.00000000000e-007
      +1.00000000000e-007
      +1.00000000000e-007
      +1.00000000000e-007
    </dep>
    <dep _net6.v acfrequency phase_urm_var uq>
      +3.68300032776e-005-j4.90157015602e-019
      -3.50877965602e-005-j4.98964115049e-019
      +3.68300032776e-005+j4.90157015602e-019
      -3.50877965603e-005+j4.98964115049e-019
      +4.36659736817e-005+j1.21340220303e-017
      -4.17956677725e-005-j1.31231431609e-017
      +4.36659736818e-005+j1.31143360615e-017
      -4.17956677725e-005-j1.21252149308e-017
    </dep>
    

  • Mod

    Javun schrieb:

    Und wie würde es denn korrekt heißen? Das ist ehrlichgesagt auch nicht auf meinen Mist gewachsen, dass sind Muster Lösungen aus Büchern und Foren.

    Wenn das in einem C++-Buch drin steht, dann hast du eines der vielen extrem schlechten Bücher. Der Rest deines Codes bestätigt dies. Es geistert leider viel Literatur in Sachen C++ herum, die eher schadet als nützt.

    Ich habe doch auf der Seite 2 eine komplette Beispiel Datei gepostet?!

    Wie gesagt, dein Code ist so unleserlich, das kann man nicht entziffern. Wie wäre es mal mit einer mündlichen Beschreibung des Formats?

    Casten muss ich die Werte doch, wie soll ich sonst auf einem string eine Zahl machen?

    😮 Ohne Worte.
    Ich schiebs's mal auf das Buch. Scheint eines von der ganz üblen Sorte zu sein. Darf ich erfahren, welches? Das ist ja sogar noch schlimmer als Jürgen Wolf...

    [ganze Datei in einem wirr aussehenden Format]

    Und meinst du, daraus kann irgendjemand irgendwas ablesen? Genauso könnte ich dir hier den Anfang einer Bilddatei schicken:

    ����JFIF��a
                    ExifMM*
    ���(1�2��i�WCASIO COMPUTER CO.,LTD.EX-Z19      HH             1.002010:09:11 23:41:26!��t��|�"�'d�0221����������
    ���	�
    ̒|TԠ0100��
    ��V������V��&���	�
    
    X
    ��2010:09:11 23:41:262010:09:11 23:41:26�*8��
                                                   ��
    
    ��8�QVC*@�Qy� Qy�  $�  !VQ "	 # 2d 3 4� 9 : < ==	 A� B H� eL� fL� ��VY000000V�00	00000000 0,0-�����
                                                                   
    
    !'#))'#&%,1?5,.;/%&7K7;ACFGF*5MSMDR?EFD
    
                                                       D-&-DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD���
    
    
    

    Ist doch lupenklar, wie das Format funktioniert!

    Tut mir leid, dass ich dir nicht mehr helfe, da fehlen einfach zu viele Grundlagen, um dir etwas erklären zu können. Und irgendwie auch die Einsicht, dass dir diese Grundlagen fehlen.



  • Warum so hart, SeppJ? Er ist laut eigener Aussage blutiger Anfänger, da weiß man bei vielen Sachen nicht, wie man was erklären soll.
    Abgesehen davon, dass er das Format schon erklärt hat. Ich hab's glasklar verstanden. Sonst stell konkrete Fragen dazu.


  • Mod

    fdfdg schrieb:

    Warum so hart, SeppJ? Er ist laut eigener Aussage blutiger Anfänger, da weiß man bei vielen Sachen nicht, wie man was erklären soll.

    Ich hatte eher den Eindruck einer blutigen Wand. Und zwar das Blut von meinem Kopf der dagegen anrennt 😃 .

    Abgesehen davon, dass er das Format schon erklärt hat. Ich hab's glasklar verstanden. Sonst stell konkrete Fragen dazu.

    Dann bist du jetzt dran 🙂 .



  • Was soll man da groß erklären? Da sind vier relevante Sektionen, die jeweils Gleitkommawerte enthalten. Mit denen soll irgendwie hantiert werden (z.B. gemittelt) 🙂

    Welche Bedeutung genau die Werte haben, kann uns ja egal sein, ist nicht relevant.



  • Wenn das in einem C++-Buch drin steht, dann hast du eines der vielen extrem schlechten Bücher. Der Rest deines Codes bestätigt dies. Es geistert leider viel Literatur in Sachen C++ herum, die eher schadet als nützt.

    Möchte ich gar nicht abstreiten, dass das Buch vllt. nicht gut ist, aber der Code ist nachvollziehbar für einen Anfänger. Manchmal hab ich das Gefühl ich rede hier gegen eine Wand. Ich schreibe lieber 2000 für einen Anfäger VERSTÄNDLICHE Zeilen. Als das ganze in kompakte 20 Zeilen zu packen und davon dann nicht eine Zeile vernünftig erklären zu können. Ich habe jede einzelne Zeile in dem Buch verstanden, jedoch nicht einen eurer Tipps oder eurer Verbesserungsvorschläge. Da kann sich ja jetzt jeder selbst seinen Teil zu denken, ob das Buch schlecht ist oder.....

    Wie gesagt, dein Code ist so unleserlich, das kann man nicht entziffern. Wie wäre es mal mit einer mündlichen Beschreibung des Formats?

    Gefragt war nach dem Dateiformat und ich habe gesagt das ich eine komplette Beispieldatei gepostet habe, woraus das Dateiformat klar hervorgeht. Was das jetzt jedoch mit meinem Quellcode zutun hat musst Du mir beantworten?! Aber das ist wieder das Prinzip des Bemängelns statt zu Helfen.

    😮 Ohne Worte.
    Ich schiebs's mal auf das Buch. Scheint eines von der ganz üblen Sorte zu sein. Darf ich erfahren, welches? Das ist ja sogar noch schlimmer als Jürgen Wolf...

    Ich arbeite hier mit 5 verschiedenen Büchern, sowie einem Script von meiner Uni. In allen steht dazu das selbe. Auch Wikipedia sagt nichts anderes: http://de.wikipedia.org/wiki/Typumwandlung
    Mag sein das es bessere, andere Möglichkeiten gibt, aber sind diese wirklich für einen Anfänger zu empfehlen?! Ich denke eher nicht...

    Und meinst du, daraus kann irgendjemand irgendwas ablesen? Genauso könnte ich dir hier den Anfang einer Bilddatei schicken:

    Siehe dazu meine Antwort oben. Jeder der sich die Datei nur 1 Sekunde angesehen hat erkennt das Dateiformat und auch meine Erklärungen waren sehr ausführlich. Ich gehe Mal davon aus, dass Du es gar nicht gelesen hast, sondern mir hier nur einen auf den Deckel geben willst...

    Tut mir leid, dass ich dir nicht mehr helfe, da fehlen einfach zu viele Grundlagen, um dir etwas erklären zu können. Und irgendwie auch die Einsicht, dass dir diese Grundlagen fehlen.

    Warum versucht Du andauernd Menschen zu belehren und ihnen zu sagen, wie sie etwas zu machen haben. Ich habe ein Programm geschrieben welches FUNKTIONIERT!!! Dazu habe ich dann noch einige Fragen gehabt. Wie wärs damit diese Fragen zu beantworten?! Es ist wirklich bewundernswert wie viele Antworten Du auf meinen Thread gegeben hast, jedoch nicht eine konkrete Antwort/Lösungsvorschlag mit Erklärung.

    Ich habe den Quellcode auch unserem Professor für Informatik gezeigt und nun für alle eine klare Ansage. Der Code funktioniert so wie er ist! Natürlich könnte man 1000 Sachen verbessern und er meinte auch das es ansich ein 20 Zeilen Programm wäre. Aber die klare Aussage war, warum mit vectoren beschäftigen wenn es auch mit arrays funktioniert. Es geht um die Funktion und um die schnelle Umsetzung. Ich bin kein Informatiker und will das später auch nie werden. Es geht einzig und allein darum simple Problemstellungen in ein Programm umsetzen zu können, damit man die Arbeiten nicht per Hand machen muss (sprich Auswertung).

    Schönes Beispiel:

    for(int i=0, i<b, i++){
     a = a + a;
    }
    

    Lässt sich auch einfacher schreiben als a*b, aber wieso jmd. die Malrechnung erklären (falls er sie noch nicht kann) wenn es auch mit gegebenen Kenntnissen funktioniert.

    Letztlich sollte man sich gerade als Moderator vllt. aneignen, dass man Fragen gezielt beantwortet bzw. auch darauf achtet das andere Mitgliedern das tun. Nicht jedoch selber mit schlechtem Beispiel voran gehen...Ich habe jedoch nicht eine vernünftige Antwort auf meine Frage erhalten.

    Ich hoffe ihr kommt nicht irgendwann mal in die gleiche Situation, wo ihr vllt. etwas Programmieren muss was in die Richtung Physik geht und dann gleich ein Diplom in diesen Fächern vorrausgesetzt wird, ihr jedoch nur 3-4 Tage dafür zeit habt.

    Was soll man da groß erklären? Da sind vier relevante Sektionen, die jeweils Gleitkommawerte enthalten. Mit denen soll irgendwie hantiert werden (z.B. gemittelt) 🙂

    Welche Bedeutung genau die Werte haben, kann uns ja egal sein, ist nicht relevant.

    Vielen Dank an Dich, dass sich zumindest einer die Mühe gemacht hat meine Beiträge überhaupt zu lesen. SeppJ verfolgt eher das Prinzip ganz egal was da steht, es kann nur Mist sein. Deshalb bekomme ich statt Hilfe auch nur Belehrungen.


  • Mod

    Javun schrieb:

    Letztlich sollte man sich gerade als Moderator vllt. aneignen, dass man Fragen gezielt beantwortet bzw. auch darauf achtet das andere Mitgliedern das tun. Nicht jedoch selber mit schlechtem Beispiel voran gehen...Ich habe jedoch nicht eine vernünftige Antwort auf meine Frage erhalten.

    Deswegen versuche ich, als Moderator, auch schon seit Tagen, dich dazu zu bringen, mal das zu liefern, was für eine vernünftige Antwort nötig ist. Aber das war wohl vergebene Mühe. Ich geb's auf.


Anmelden zum Antworten