Ergebnis 1 bis 10 von 10
  1. #1
    Das Leben ist der Lehrer Avatar von DoS
    Registriert seit
    18.08.2008
    Beiträge
    528

    Idee Im Gültigkeitsbereich Resultate für "außerhalb" erzielen

    Ich habe folgenden Code mal aus dem Programm rausgenommen und unnötige Codeschnipsel entfernt:

    #include <string>
    #include <vector>
    #include <iostream>


    using namespace std;



    int main()
    {



    ifstream Input("Diefz.cfg", ios::binary);



    if (Input==NULL)
    {



    vector<string> Daten;
    vector<string>::iterator i;
    }
    Input.close();



    string shinzu("buha");
    Daten.push_back(shinzu);
    return 0;
    }
    Folgende Fehler wird mir unter anderem angezeigt angezeigt:

    [code] 1>c:\dokumente und einstellungen\dragon_of_storm\eigene dateien\visual studio 2008\projects\test6\test6\gasdf.cpp(40) : error C2228: Links von ".push_back" muss sich eine Klasse/Struktur/Union befinden.


    Erst dachte ich, es liegt daran , dass es daran lag, dass ich keinen Input.read genutzt habe:

    #include <string>
    #include <vector>
    #include <iostream>
    #include <fstream>


    using namespace std;



    int main()
    {


    ifstream Input("Diefz.cfg", ios::binary);



    if (Input==NULL)
    {


    vector<string> Daten;
    vector<string>::iterator i;
    }
    else
    {
    Input.read((char*)&Daten, sizeof (Daten));
    }
    Input.close();



    string shinzu("buha");
    Daten.push_back(shinzu);

    return 0;
    }
    Jetzt habe ich aber noch mehr Fehler... Wie immer hoffe ich darauf, dass ich mich auf eure zuverlässige Hilfe verlassen kann

    Auch wenn mein Fehler noch so dumm, bitte keine meine Person bewertenden Kommentare

    MfG. -DoS
    Geändert von DoS (20.08.2009 um 15:37 Uhr)

  2. #2

    Registriert seit
    17.06.2009
    Beiträge
    559

    Standard

    Also dein Code ist ein wenig komisch und ich weiss auch nicht, wo das Problem genau liegt, aber so dürfte sich der Code ohne Probleme kompilieren lassen:
    Code:
    #include <string>
    #include <vector>
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
        ifstream Input("Diefz.cfg", ios::binary);
        if(Input)
        {
            vector<string> Daten;
            vector<string>::iterator i;
            string shinzu("buha");
            Daten.push_back(shinzu);
            Input.close();
        }
        else
            cout << "fehler..." << endl;
        return 0;
    }

  3. #3
    this.hatcolor = gray Avatar von Ancient87
    Registriert seit
    29.03.2009
    Beiträge
    143

    Standard

    Ist ganz logisch du versuchst eine vector function auf ein nicht vektor strukt/object anzuwenden ifstream ist KEIN vector. Um die vector funktion zu verwendne musst du ein vektor object erstellen und dann auf dieses den push.back anwenden

    sorry verlesen: du hast kein scoping issue alles was innerhalb von { } deklatiert wird bleibt auch da drin und wenn du aus dem scope raus kommst ist es weg

    grr irgendwie finde ich den edit button nicht egal: Also nochmal du hast kein scoping issue alles was innerhalb von { } deklariert wird hat nur darin gueltigkeit wenn du etwas ueberall haben willst kannst du es ausserhalb des scopes deklarieren und innerhalb definieren.
    Geändert von Ancient87 (17.08.2009 um 19:58 Uhr) Grund: Automerged Doublepost
    Knowledge is power - don't abuse it!

    Fuer niveauvolle Anfragen bin ich unter 139156343 erreichbar

  4. #4
    Das Leben ist der Lehrer Avatar von DoS
    Registriert seit
    18.08.2008
    Beiträge
    528

    Standard

    Vielen Dank für die Antworten.

    Zu inout: Du hast nicht meinen kompletten Code berücksichtigt. Du hast einfach die Befehle außerhalb von der IF-Verzweigung in diese reinkopiert.

    Es ist bei meinem Programm aber von hoher Priorität, dass "[...]push_back[..]" immer ausgeführt wird und nicht nur, wenn es die Datei nicht gibt.

    Zu Ancient87: Du wirfst mir hier englische Vokalben an den Kopf Mir scheint es, als hättest du die korrekte Lösung im Kopf.

    Es wäre sehr freundlich, wenn du meinen Code kopieren könntest und den Fehler rot anstreichst und den richtigen Code hinschreiben könntest (der aber eine ähnliche Lösung anbietet). Außerdem wäre es nett das sogenannte "scoping issue" zu erklären und was inner- oder außerhalb eines 'scopes' bedeutet.

    Mit freundlichen Grüßen -DoS

  5. #5
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Um Ancient87's Post zusammenzufassen:

    Variablen, die in einem Block ( { } ) definiert sind, sind auch nur in diesem (und ggf. in diesem Block enthaltenen Blöcken) gültig. Man spricht von einem Gülitigkeitsbereich.
    Daher sagt Ancient87 auch "scoping issue" (scope = (Gültigkeits-)Bereich, issue = Problem).

    Kleines Beispiel:
    Code:
    {
        {
            int meineVariable;
            
            // meineVariable ist hier definiert und kann benutzt werden:
            meineVariable = 1;
            
            {
                // meineVariable ist auch hier definiert:
                meineVariable = 2;
            }
        }
        
        // meineVariable ist hier NICHT MEHR DEFINIERT
        meineVariable = 3; // FEHLER: undefined symbol 'meineVariable'...
    }
    Im Klartext: wenn du willst, dass der String-Vector "Daten" in der gesammten main-Funktion definiert ist, solltest du ihn am Anfang des main-Blocks definieren, oder kurz bevor er benutzt wird - achte dabei aber darauf, dass "Daten" nur in dem Block benutzt wird, in dem es Definiert wurde, oder eben in "untergeordneten Blöcken" (auf das Beispiel bezogen: der untergeordnete Block wäre der, in dem 'meineVariable' auf 2 gesetzt wird).

    Ich hoffe das war jetzt verständlich erklärt (:


    mfG. BlackBerry

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  6. #6
    Das Leben ist der Lehrer Avatar von DoS
    Registriert seit
    18.08.2008
    Beiträge
    528

    Standard

    BlackBerry du bist ein Schatz .

    Korrekte Rechtschreibung
    (haben hier leider sehr wenige Benutzer), hochwertige Lösungsbeschreibung und mit deutschen Begriffen erklärt. Wirklich TOP!

    Zum Thema : Wenn ich jetzt aber unbedingt an einer Stelle im Programm etwas überprüfen möchte und das für später in eine Variable speichern möchte, könnte man das dann, wie folgt realisieren (Diese Prüfung erfolgt per "IF-Verzweigung"):

    Kann man das mit Zeigern lösen? Denn so hätte man doch später keine gelöschte lokale Variable?

    Mit freundlichen Grüßen -DoS
    Geändert von DoS (20.08.2009 um 13:49 Uhr)

  7. #7
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Was wie folgt realisieren?
    Wolltest du da noch einen Sourcecode posten?

    PS: danke for das Lob


    mfG. BlackBerry

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  8. #8
    Das Leben ist der Lehrer Avatar von DoS
    Registriert seit
    18.08.2008
    Beiträge
    528

    Standard

    Kein Problem Es ist ja so

    Ich dachte erst man könnte das Problem so lösen:
    {
    int onoff=1;
    int *phelfer=NULL;
    phelfer = new int;
    *phelfer=onoff;
    }
    Aber anscheinend werden selbst die Zeiger gelöscht.

    Selbst, wenn ich in der IF-Anweisung eine Funktion aufrufe, bleiben "deren" Zeiger "in dem IF":

    #include <iostream>

    using namespace std;

    void startme()
    {
    int onoff=1;
    int *phelfer=NULL;
    phelfer = new int;
    *phelfer=onoff;
    }


    int main()
    {
    if(1==1)
    {
    startme();
    }
    cout<<*helfer;





    return 0;
    }
    Kann man das denn wirklich gar nicht umgehen? Ich warte schon gespannt auf deine nächste informative Antwort

    Mit freundlichen Grüßen -DoS
    Legende: "Gruß" = kaum Zeit, "MfG." = durchschnittlich viel Zeit und "Mit freundlichen Grüßen" = viel Zeit
    gehabt beim Posten.


    Folgende Personen genießen meine Hochschätzung: BlackBerry, EBFE, DizzY_D, OpCodez, l0dsb und H4x0r007.

  9. #9
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Ich versteh das Problem immernoch nicht ganz...
    So denke ich mir das jetzt:
    Du willst eine Veriable in dem Gültigkeitsbereich der main-Funktion in einer anderen Funktion (startme) verändern. (korrigier mich wenn ich falsch liege...)

    Das ginge dann, indem du entweder die Variable, die du verändern willst in den globalen Gültigkeitsbereich auslagerst (außerhalb aller Funktionen hinschreiben - aber vor den Funktionen, die diese Variable benutzen sollen), oder der Funktion, die auf die Variable zugreifen soll einen Zeiger auf deren Speicheradresse übergibst.

    Dies geschieht ja, wie bekannt mit dem Adressoperator (&).
    Biespiel:
    Code:
    #include <iostream>
    
    
    void startme(int *phelfer)
    {
        if (1 /* mach' was */)
        {
            /* mach' was anderes */
            *phelfer = 1;
        }
        else
        {
            /* mach' noch was anderes */
            *phelfer = 0;
        }
    }
    
    int main(void)
    {
        int helfer;
        
        startme(&helfer);
        
        /* helfer in main ist jetzt 1 */
        std::cout << "helfer ist jetzt " << helfer << std::endl;
        
        return 0;
    }
    Wie gesagt - wenn des nicht ist was du gemeint hast, dann formuliere es nochmal genauer :S
    Du sprichst ja auch von einem Problem, dass du lösen willst - es wäre sicher hilfreich zu wissen wie dieses Problem denn genau aussieht.


    mfG. BlackBerry

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  10. #10
    Das Leben ist der Lehrer Avatar von DoS
    Registriert seit
    18.08.2008
    Beiträge
    528

    Standard

    Genau das war mein Problem

    Ich hatte einen Gedankenfehler, denn ich dachte, dass man Zeiger nicht unbedingt als Parameter zu übergeben braucht, da man sie überall verwenden kann. (falsch, fragt mich nicht, wie darauf gekommen bin)

    Allerdings kann man über sie nur die Werte verändern, egal wo sie sind, auf die sie zeigen und nicht sie selbst.

    Die Lösungsmöglichkeiten habe ich beide verstanden. Ich kann entweder die "Globale Variable" oder den Zeiger (richtig angewendet) verwenden .

    Ich denke, ich werde letzteres nutzen, da ich die Globale Variable zu empfänglich für Fehler halte (man kann sie wirklich überall verwenden).

    Danke für deine schnellen Antworten. Hiermit wäre meine Frage gelöst.

    Mit freundlichen Grüßen -DoS

    P.S. Wenn ich was in Klammern, als Erklärung schreibe (oder in fett, sonstiges) ist das nicht für dich BlackBerry (dass du das weißt, weiß ich ja ), sondern für Menschen die diesen Thread per Suche finden (daher auch die Threadnamenänderung)
    Geändert von DoS (20.08.2009 um 15:37 Uhr)
    Legende: "Gruß" = kaum Zeit, "MfG." = durchschnittlich viel Zeit und "Mit freundlichen Grüßen" = viel Zeit
    gehabt beim Posten.


    Folgende Personen genießen meine Hochschätzung: BlackBerry, EBFE, DizzY_D, OpCodez, l0dsb und H4x0r007.

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •