char- Pointer- und logik Problem



  • Hyhy
    ich habe vor ein paar Stunden angefangen ein kleines Programm zur
    Übung zu schreiben, nur irgendwie komme ich jetzt leider nicht mehr weiter 😕 :
    Wieso kann ich meine Char- Zeiger nicht durch die Funktion, welche
    ich geschrieben habe bearbeiten?
    (ps: Da ich die Funktion selbst nicht als Fehlerursache betrachte, poste ich sie hier auch nicht.)

    zum Programm: Ich habe festgestellt, dass mein Programm, sofern es Fehlerfrei
    laufen würde, bei jeder schließenden geschweiften Klammer ein Tab zu viel
    ausgeben würde. Kann mir jemand bitte ein paar Tipps geben, wie ich dies verhindern kann?

    #include<iostream>
    #include<rwfile.h>
    #include<string>
    using namespace std;
    
    class chl
    {
    	private:
    		char *source;
    		char *destination;
    		int *numbers;
    		int *brace_o;
    		int *brace_c;
    		int *loop;
    		bool manual;
    		bool mark_0;
    		string tab;
    
    	public:
    		chl();
    		bool show();
    		bool dialog();
    		bool work();
    };
    
    chl::chl()
    {
    	loop = new int; *loop = 1;
    	brace_o = new int; *brace_o = 0;
    	brace_c = new int; *brace_c = 0;
    	numbers = new int; *numbers = 0;
    	manual = false;
    	mark_0 = false;
    	source = new char[30];
    	destination = new char[30];
    	tab = "	";
    }
    
    bool chl::dialog()
    {
    	bool manual_clear = false;
    
    	cout << "automatic(0) or manual(1)? ";
    	cin >> manual;
    
    	cout << "source			:";
    	cin >> source;	
    
    	cout << "destination	:";
    	cin >> destination;
    
    	switch(manual)
    	{
    
    		case'0' :
    		{
    			cout << "lines to read                     :";
    			cin >> *numbers;
    
     			cout << "enter Tab(\"automatic\" for default  :";
     			cin >> tab;
     			if(tab == "automatic") tab = "	";
    
    			cout << "how much brackets are open                 :";
    			cin >> *brace_o;
    
    			cout << "clear bevore write(1)           :";
    			cin >> manual_clear;
    			if(manual_clear == 1) clear(*destination);		// Das tut komischerweise, bzw. mein Compiler erkennt hier noch keinen Fehler...
    
    		break;	
    		}
    
    		work();
    
    	}
    }
    
    bool chl::work()
    {
    	string in;
    	while(*loop <= *numbers)
     	{
     		read(in, *source, *loop);   // ...Das nicht mehr
    
     		for(int i=0; i < in.length(); ++i)
     		{
    			     if(in[i] == '{') ++*brace_o;
    			else if(in[i] == '}') --*brace_o;
    		}
    
    		if(*brace_o >= 1)
    		{ 
    			cout << "(" << *brace_o << ")" << in << endl;
    
    			if(mark_0) write("\n", *destination);
    
    			/* write("(", destination);
    			write(brace_o, destination);
    			write(")", destination); */
    			write(in, *destination);
    			write("\n", *destination);
    			for(int i=1; i<=*brace_o; ++i) write(tab, *destination);
    
    			mark_0 = false;
    
    		}       
    		else if (*brace_o == 0) { write("\n", *destination); write(in, *destination); mark_0 = true;}
    
     		++*loop;
    	}
    }
    
    int main()
    {
    	chl c;
    	c.dialog();
    	wait;
    }
    

    Ach ja: ich bin noch nicht fertig mit dem Programm, deshalb habe ich auch noch kein delete[] angewandt 🙂

    Danke im vorraus! 😃



  • Destruktor ...egal wie weit du bist!



  • Also ich frage mich vor allem, wieso du so viele new für normale int's benutzt.

    Ansonsten wäre es ev. noch hilfreich, wenn du den Fehler vom Compiler posten würdest...



  • erstmal danke für eure schnellen Antworten...

    (D)Evil schrieb:

    Destruktor ...egal wie weit du bist!

    jaa... eigentlich hast du vollkommen recht 🙄

    drakon schrieb:

    Also ich frage mich vor allem, wieso du so viele new für normale int's benutzt.

    naja... wie schon gesagt: zur übung 😃

    Die Fehlermeldung:

    In member function bool chl::work()': 85 invalid conversion from \char' to `char*'
    85 initializing argument 2 of `bool read(std::string&, char*, int)'

    die Zeiger sind doch char*, dachte ich, oder?



  • Hmm ne ist nen char:

    read(in, *source, *loop);
    

    Du dereferenzierst hier source(und loop ...), was aber als

    char *source;
    

    . D.h. du übergibst da gerade das 1. Zeichen des Strings source. Einfach nicht dereferenzieren!



  • (D)Evil schrieb:

    Einfach nicht dereferenzieren!

    naja... aber wenn ich nicht dereferenziere, fängt mein Programm gar nicht an zu arbeiten weil es doch gar keine werte
    bekommt?! 😕 (... gibt es eine möglichkeit die Dereferenzierung beizu
    behalten?)

    EDIT: Achso: und wenn ich den source- Pointer ersetze durch "char source[30]" dann wäre dies doch auch ein Zeiger, oder (aber stimmt, damit geht es)???


Anmelden zum Antworten