PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Im Gültigkeitsbereich Resultate für "außerhalb" erzielen



DoS
17.08.2009, 19:16
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 :D

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

MfG. -DoS

inout
17.08.2009, 19:50
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:


#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;
}

Ancient87
17.08.2009, 19:52
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.

DoS
20.08.2009, 12:04
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

blackberry
20.08.2009, 12:50
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:

{
{
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

DoS
20.08.2009, 13:43
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

blackberry
20.08.2009, 14:23
Was wie folgt realisieren?
Wolltest du da noch einen Sourcecode posten?

PS: danke for das Lob :)


mfG. BlackBerry

DoS
20.08.2009, 15:00
Kein Problem :) Es ist ja so :D

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

blackberry
20.08.2009, 15:14
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:

#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

DoS
20.08.2009, 15:31
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)