mehrere gleichartige Objekte erstellen



  • hi leute!

    ich bin ziemlicher c++ neuling, besser gesagt, eigentlich habe ich c++ nie gelernt, sondern wende es nur im Datenanalyse-Framework ROOT (www.root.cern.ch) an. Die meisten Sachen, die ich brauche, konnte ich mir anhand von Beispiel-Makros klarmachen, aber jetzt habe ich ein problem, das ich nirgends finde, weil ich nicht so genau weiß, nach welchen Begriffen ich suchen soll. Ich habe z.B. mal das wikibook zu c++ überflogen, da fand ich auch nichts.

    Es geht jedenfalls darum, mehrere gleichartige Objekte zu erstellen. Konkret will ich 8 Files öffnen, die Daten in Arrays lesen und dann grafisch aufbereiten. Dazu muss ich mehrere Objekte erstellen, hier mal der code innerhalb meiner for-Schleife:

    ...
    
    TString filename = "wic_";
    filename +=i;
    filename +=".tab";
    cout << filename;
    
    ... Daten einlesen ...
    
    TString cname = "c";
    cname += i;
    TCanvas *cname = new TCanvas("c"i, "Canvas",1); 
    cout << "cname: " << cname << endl;
    
    ... noch dies und das ...
    

    Ich weiß nicht, ob das Objekt TString in c++ existiert (das funktioniert in ROOT auf jeden fall, cout gibt jedenfalls die richtigen Dateinamen aus), TCanvas gibt es wohl da nicht. Das ist einfach der Rahmen, in den ROOT Grafiken malt. Davon will ich 8 erstellen. Dass mein Code so nicht funktionieren kann, ist mir klar (gleicher Name für einen String und ein Canvas), aber wie krieg ich das hin? Bei normalen Variablen kann ich einfach ein Array machen, aber bei beliebigen Objekten?

    Gruß und danke
    wing



  • Ich kenne dieses ROOT nicht und bin mir nicht ganz sicher, ob ich richtig verstanden habe, was du machen willst, aber was spricht denn dagegen einfach ein Array von Pointern auf die erzeugten Objekte anzulegen?

    In etwa:

    TString *cname[8];
    TCanvas *canv[8];
    
    ...
    canv[i] = new TCanvas(...);
    cname[i] = new TString(...);
    

    gruß



  • Hi yoshi! Das Konzept mit den Pointern hatte ich wohl etwas missverstanden, was du vorschlägst funktioniert auf jeden Fall schonmal, danke.

    Was noch nicht klappt, ist das Erstellen der Graphen, weil ich nicht weiß, wie ich die Nummerierung da mit reinbringen soll. Mein Code sieht grad so aus:

    TCanvas *c[files];
    c[i] = new TCanvas(Form("c%d",i), Form("Canvas %d", i), 1);
    
    TGraph *gr[files];
    gr[i] = new TGraph(n, Form("x%d[n]",i), Form("y%d[n]", i))
    

    Die Syntax ist

    TCanvas(Objektname, Überschrift, Style);
    TGraph(Anzahl, x[n], y[n]),

    wobei xi[n], yi[n] meine Arrays sind, die ich weiter oben angelegt habe.

    Ich fühle mich, als ob mir irgendwas grundlegendes fehlen würde.

    Gruß
    wing



  • jetzt habe ich das Wesentliche ganz vergessen:
    Das erstellen der Canvas' funktioniert, bei den Graphen erhalte ich
    "Error: Can't call TGraph::TGraph(n,Form("x%d[n]",i),Form("y%d[n]",i)) in current scope multifile.C:64:"



  • Hallo wing,

    der Fehler dürfte daher kommen, dass du an den Konstruktor von TGraph zwei Strings übergibst. Er benötigt jedoch Arrays von Werten (Integer, Float, etc.) oder Vectoren (siehe: http://root.cern.ch/root/html/TGraph.html).

    Irgendwo musst du die Werte doch vorher in Arrays gespeichert haben, oder?!
    Sowas wie x[100] und y[100] für z.B. 100 X und Y Werte des Graphen.

    //Edit: Ja, hast du ja geschrieben, dass du sie angelegt hast... hatte Tomaten auf den Augen 😃

    Dann würdest du TGraph wie folgt konstruieren:

    gr[i] = new TGraph(100, x, y);
    

    Alternativ kannst du anscheinend den Graphen auch nur mit der Anzahl an Punkten konstruieren und die Punkte dann später einfügen:

    TGraph* gr[i] = new TGraph(100);
    g->SetPoint(0, -1, -5);
    g->SetPoint(1, -1, +5);
    ...
    g->Draw("l same");
    

    Hoffe das hilft die weiter.

    Gruß



  • hi yoshi!

    danke für deine bemühungen, hatte jetzt ein paar tage was anderes zu tun und habe gerade jetzt mein skript überarbeitet. ich habe letztenendes herausgefunden, dass es am einfachsten über zweidimensionale arrays im stil von

    x[file][line].

    gruß
    wing



  • nenne C++ Code nicht Script, ganz böse

    schau dir std::vector an


Anmelden zum Antworten