Programieren anfangen



  • ah, ok.. thx - das starten ohne debuggen hat geholfen 🙂



  • so ich hab jetzt mal eine kleine anwendung geschrieben

    #include<iostream>
    using namespace std;
    
    int main ()
    {
    	int a = 0, z;
    	char c;
    	cout << "Zeichen? \n Bitte eingeben: ";
    	cin >> c;
    	if (c == 'I')		a = 1;
    	else if(c == 'V')	a = 5;
    	else if(c == 'X')	a = 10;
    	else if(c == 'L')	a = 50;
    	else if(c == 'C')	a = 100;
    	else if(c == 'D')	a = 500;
    	else if(c == 'M')	a = 1000;
    	if (a == 0) {
    		cout << "\a\a\a\a\n\n ||| FEHLER: keine römische Ziffer! \n";
    	}
    	else {
    		cout << "\n\nErgebnis: " << c << " = " << a <<  endl;
    	}
    	cout << "\n\n ||| Zum beenden bitte 0 und ENTER druecken \n";
    	cin >> z;
    	cout << "\a\a";
    	return 0;
    }
    

    wenn ich sie starte über debuggen / starten ohne debuggen - dann funktioniert sie...

    auch wenn ich sie normal starte - aber nicht wenn sie jemand anders auf seinem pc started...

    "... weil die Anwedungskonfiguration nicht korrekt ist ...."

    .brot



  • Schreib mal die genaue Fehlermeldung auf, dann kann dir bestimmt jemand helfen.

    Gruß
    Don06



  • Ja, das kommt daher, weil der andere PC nicht die neuen C-Runtimes installiert hat. Entweder du linkst dein Projekt statisch gegen die Runtime (siehe Projekteinstellungen) oder gibts eine komplette Distri weiter.

    In der MSDN gibts infos dazu, unter dem Stichwort "Deployment". Wenn du die MSDN herunter geladen hast, ist XCopy ein gutes Beispiel:
    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vccore/html/8d1a994b-9986-4171-9c0b-56d24808fd1f.htm



  • sry, eine genauere fehlermeldung habe ich nicht... da ichs ja net bei mir testen kann...

    in dem c++ buch geht hervor das die zukünftigen c++ standarts gelehrt werden, hängt das damit zusammen?
    sry, aber ich fang grad erst damit an.. versteh also noch net alles



  • Hast du nicht mein Posting gelesen? Der PC hat einfach nicht die nötige C-Runtime, sprich ihm fehlen nur die entsprechenden DLLs. Bei dir sind sie schon drauf, weil sie gleich mit dem VC installiert wurden. Wenn du dein Programm ohne DLLs weitergeben willst, kannst du statisch linken.

    Projekteinstellungen->C++->Codeerstellung->Laufzeitbibliothek von DLL auf statisch ändern.

    Brauchst du aber nur machen, wenn du es deployst (also weiter geben willst). Oder du schaust in die MSDN, da steht wie man die EXE plus DLLs weiter geben kann.



  • Multithreaded-Debug-DLL (/MDd) ist im moment bei mir eingestellt - statisch kann ich nicht finden



  • Schau mal eher in den Linker- als in den C++-Einstellungen nach.



  • sry aber ich hab nichts derartiges unter Linker gefunden

    .brot



  • brot-knusprig schrieb:

    Multithreaded-Debug-DLL (/MDd) ist im moment bei mir eingestellt - statisch kann ich nicht finden

    das musst du auf 'Multithreaded-Debug (/MTd)'
    und für die Release version auf 'Multithreaded (/MT)'
    umstellen...
    🙂



  • hmm. problem tritt immernoch auf.

    genaue fehlermeldung habe ich jetzt:

    diese anwendung konnte nicht gestartet werden, weil die anwendungskonfiguration nicht korrekt ist. neuinstallation könnte das problem beheben.



  • Du mußt glaube ich noch eine Manifest-Datei mitliefern. Infos in der MSDN oder auch hier, zud em ganzen Deploy-Thema: http://www.codeproject.com/cpp/vcredists_x86.asp
    bzw. http://www.codeproject.com/cpp/vcredists_x86.asp#Alternatives
    bzw. mit statischem Linken: http://www.codeproject.com/cpp/vcredists_x86.asp#StaticLinking



  • ok - danke funktioniert jetzt alles...

    jetzt hab ich aber nochmal eine frage

    wenn man eine datei öffnen will über z.B.

    quelle.open(quelldateiname.c_str(), ios::binary|ios::in)
    

    und ich nur einen dateinamen eingebe z.B. datei.txt
    muss die datei dann im selben ordner sein?

    .brot



  • Richtig.



  • #include<cstdlib>
    #include<fstream>
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    int main( ) {
        ifstream quelle;
        string quelldateiname;
        cout << "ZZ (Zeichenzaehler) \n\nQuelldatei? ";
        cin >> quelldateiname;
        quelle.open(quelldateiname.c_str(), ios::binary|ios::in);
    	if (!quelle) {
            cerr << quelldateiname
                 << " kann nicht geöffnet werden!\n";
            exit(-1);
        }
        char ch;
    	bool wort;
    	int long zeichen, worte, zeilen; 
    	int short anzeiger;
        while (quelle.get(ch))
    	{
    		if(ch != '\n') {
    			zeichen++;
    			if(ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z')
    				wort = true;
    			else
    			{
    				if(wort)
    					worte++;
    				wort = false;
    			}
    		}
    		else {
    			zeilen++;
    		}
    	}
    	cout << "\n\nBerechnung Beendet!";
    	string dateiausgabe("x");
    	dateiausgabe = quelldateiname + " berechnung.txt";
    	ofstream target(dateiausgabe, ios::binary|ios::out);	
    	target.width(30); "Zeichen:" << zeichen;
    	target.close;
    }
    

    Diese Anwendung habe ich geschrieben bzw. umgeschrieben...

    allerdings kommt der Fehler:

    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(44) : error C2664: 'std::basic_ofstream<_Elem,_Traits>::basic_ofstream(const char *,std::ios_base::openmode,int)': Konvertierung des Parameters 1 von 'std::string' in 'const char *' nicht möglich
    1> with
    1> [
    1> _Elem=char,
    1> _Traits=std::char_traits<char>
    1> ]
    1> Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(45) : error C2296: '<<': Ungültig, da der linke Operand vom Typ 'const char [9]' ist
    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(46) : error C3867: "std::basic_ofstream<_Elem,_Traits>::close": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&std::basic_ofstream<_Elem,_Traits>::close", um einen Zeiger auf den Member zu erstellen.
    1> with
    1> [
    1> _Elem=char,
    1> _Traits=std::char_traits<char>
    1> ]

    was bedeutet das? bzw wo ist der Fehler?

    .brot



  • ofstream target(dateiausgabe.c_str(), ios::binary|ios::out);
    

    So müsste es gehen. c_str() liefert einen const char* auf den Stringinhalt zurück.

    Gruß
    Don06



  • habs geändert - neue fehlermeldung:

    1>------ Erstellen gestartet: Projekt: filecopy, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>filecopy.cpp
    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(44) : error C2296: '<<': Ungültig, da der linke Operand vom Typ 'const char [9]' ist
    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(45) : error C3867: "std::basic_ofstream<_Elem,_Traits>::close": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&std::basic_ofstream<_Elem,_Traits>::close", um einen Zeiger auf den Member zu erstellen.
    1> with
    1> [
    1> _Elem=char,
    1> _Traits=std::char_traits<char>
    1> ]
    1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Poschinger\Eigene Dateien\Visual Studio 2005\Projects\filecopy\filecopy\Debug\BuildLog.htm" gespeichert.
    1>filecopy - 2 Fehler, 0 Warnung(en)



  • Dann erstmal das:

    target.close;
    

    umändern in das:

    target.close();
    

    Behebt den einen Fehler.

    //edit: Achja,

    und das:

    target.width(30); "Zeichen:" << zeichen;
    

    ist mehr oder weniger Schwachsinn.
    Vielleicht meinst du sowas:

    target.width(30);
    target << "Zeichen:" << zeichen;
    

    //edit2:
    Sehr viele uninitialisierte Variablen. Weist du denen keinen Wert zu ist ihr Startwert undefiniert. Aber das müsste dir dein Kompiler ja auch sagen.

    Gruß
    Don06



  • ok, danke

    jetzt hab ich aber schon wieder mal eine frage mit der ich euch belästigen muss:

    void str_umkehr(string& s) {
    	string target("");
    	size_t i = s.length();
    	cout << "Zeichen: " << i << endl;
    	for(i; i >= 1; i--) {
    		target += s[i];
    	}
    	cout << target << endl;
    }
    

    dies hab ich in einem programm geadded um das wort umzudrehen...

    bitte geben sie ein Wort ein: urang
    Zeichen: 5
    gnar

    doch warum fehlt der erste (also umgedreht letzte) Buchstabe?
    und warum wird am anfang ein leerzeichen eingesetzt?

    .brot



  • Du benutzt den Indexoperator [], um auf die einzelnen Zeichen zuzugreifen. Der indiziert aber nicht von 1 bis n, sondern von 0 bis n-1.

    Der erste Buchstabe ist also nicht s[1], sondern s[0].
    Der letzte Buchstabe ist also nicht s[s.length()], sondern s[s.length()-1].

    Du solltest dir aber wirklich ganz dringend ein gutes Tutorial oder Buch durchlesen! Sonst bringst du dir falsche Dinge bei!
    Dein Code da oben kann ganz leicht deine Anwendung abschießen (Stichwort Access Violation) 😉


Anmelden zum Antworten