Speicheradresse einer Variablen übergeben



  • Hallo,

    die Variable nmbr wird später im Code verwendet. Ich muss sie allerdings schon vorher deklarieren, deshalb der char pointer.

    Erst im Switch wird dann die genaue größe des Arrays bestimmt. Wie kann ich nun die Adresse der Variable tmp auf die von nmbr richtig übertragen?

    char *nmbr = 0;
    
    	switch (direction) {
    		case 1: {	
    			start = pos - 1;
    			char *tmp = new char[pos];
    			// ??? nmbr = temp ???
    				} break; // true
    		case 0: { // ...
    	}
    

    Viele Grüße,
    blck



  • blckbird schrieb:

    die Variable nmbr wird später im Code verwendet. Ich muss sie allerdings schon vorher deklarieren, deshalb der char pointer.

    Wieso wird sie dann auf 0 gesetzt?

    blckbird schrieb:

    rst im Switch wird dann die genaue größe des Arrays bestimmt. Wie kann ich nun die Adresse der Variable tmp auf die von nmbr richtig übertragen?

    Wozu überhaupt tmp ?

    case 1:
      start = pos - 1;
      nmber = new char[pos];
      break;
    

    (ansonsten " nmber = tmp; ", das geht prima, http://www.youtube.com/watch?v=6pmWojisM_E)

    blckbird schrieb:

    new char[pos];
    

    Weshalb new?
    Übersetzungstabelle
    Es gibt hier keinen Grund, nicht std::vector<char> zu nutzen (ausser ev. std::string ).



  • Wenn nmbr nur in case deklariert wird, dann erhalte ich eine Fehlermeldung, dass die nicht definierte Vraible verwendet wurde. Deshalb der Umweg. Auch das setzten auf 0 hängt damit zusammen.

    nmbr = tmp funktioniert nicht.



  • nmbr = tmp funktioniert
    nmbr = new char[..] funktioniert
    std::vector<char> v;
    ...
    v.resize(..) funktioniert und ist besser. Falls du immer noch Probleme hast poste vollständig kompilierbaren Code, oder zumindest das was deiner Meinung nach kompilieren soll und eine entsprechende Fehlermeldung produziert.



  • // direction == true --> LEFT
    	// direction == false --> RIGHT
    
    	//char *nmbr = new char[125];
    	int j = 0, start;
    	char *nmbr = 0;
    
    	// Set start of capturing term position
    	switch (direction) {
    		case 1: {	
    			start = pos - 1;
    			char *tmp = new char[pos];
    			nmbr = &(*tmp);
    				} break; // true
    		case 0: { 
    			start = pos + 1;
    
    			int i = 0;
    			for (i; is_math_char(eq[i]) == true; i++){}
    
    			char *tmp = new char[i - pos - 1];	
    			nmbr = &(*tmp);
    			} break; // false
    	}
    
    	//Case 1 - Term is Number
    	if (is_nmbr(eq[start]) == true) { 
    
    		for (int i = start; is_nmbr(eq[i]) == true && i >= 0;) {
    			nmbr[j] = eq[i];
    			j++;
    
    			switch (direction) {
    				case 1: { i--; } break; // true
    				case 0: { i++; } break; // false
    			}
    		}
    
    		cout << "NMBR LENGTH: " << strlen(nmbr)<< endl << &nmbr << endl;
    		return nmbr;
    	}
    
    	return "FAIL";
    }
    

    Ich lasse mir ja die Länge nmbr ausgeben und da bekomme ich immer 16. Später wird auch noch nmbr ausgegeben. In eq steht ein mathematischer Term. Der Algorithmus soll den linken, bzw. rechten Term zurückgeben.
    Wenn nmbr ausgegeben wird, erhalte ich sowas: "21²²²²½½½½½½½½" (die 21 kommt aus dem Term, ist also korrekt).

    nmbr = tmp funktioniert, aber ich denke der Fehler liegt dann an einer anderen Stelle. Wieso ist das char-Array dann 16 groß?



  • cooky451 schrieb:

    Falls du immer noch Probleme hast poste vollständig kompilierbaren Code, oder zumindest das was deiner Meinung nach kompilieren soll und eine entsprechende Fehlermeldung produziert.

    Ich kann deinen Code nciht kompilieren, blckbird.
    Poste mal ein Minimalbeispiel.
    Übrigens: nmbr = &(*tmp); ist das selbe wie nmbr = tmp;



  • // ConsoleApplication4.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    bool is_nmbr(char charakter) {
        if (charakter == '1' || charakter == '2' || charakter == '3' || charakter == '4' || charakter == '5' ||
            charakter == '6' || charakter == '7' || charakter == '8' || charakter == '9' || charakter == '0')
            { return true; }
        else { return false; }
    }
    
    bool is_math_char(char term)
    {
        if ((is_nmbr(term)) == true ||  term == '(' ||  term == ')' ||  term == '^' ||  term == '*' ||  
            term == '/' ||  term == '+' ||  term == '-' ||  term == '.')
        { return true; }
        else
        { return false; }
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        // parameter
        bool direction = true; 
        int pos = 2; // Position des "hoch" Zeichens
        char *eq = "12^34";
    
    	cout << "INPUT EQ: " << eq << endl << endl;
    
        // direction == true --> LEFT
        // direction == false --> RIGHT
    
        //char *nmbr = new char[125];
        int j = 0, start;
        char *nmbr = 0;
    
        // Set start of capturing term position
        switch (direction) {
            case 1: {  
                start = pos - 1;
                char *tmp = new char[pos];
                nmbr = tmp;
                cout << "TMP ADRESS: " << &tmp << endl;
                    } break; // true
            case 0: {
                /*start = pos + 1;
    
                int i = 0;
                for (i; is_math_char(eq[i]) == true; i++){}
    
                char *tmp = new char[i - pos - 1]; 
                nmbr = tmp;
                cout << "TMP ADRESS: " << &tmp << endl;*/ // Nicht relevant
                } break; // false
        }
    
        //Case 1 - Number
        if (is_nmbr(eq[start]) == true) {
    
            for (int i = start; is_nmbr(eq[i]) == true && i >= 0;) {
                nmbr[j] = eq[i];
                j++;
    
                switch (direction) {
                    case 1: { i--; } break; // true
                    case 0: { i++; } break; // false
                }
            }
            //if (direction == true)
                //{nmbr = order(nmbr);}
            cout << "NMBR LENGTH: " << strlen(nmbr)<< endl << "NMBR ADRESS: " << &nmbr << endl << "NMBR: " << nmbr << endl << endl;
    
        }
    
        system("PAUSE");
        return 0;
    }
    

    Das ist ein Minimalbeispiel.



  • Nachdem ich den Microsoft-Kram entfernt habe (tmain, TCHAR, stdafx) kompiliert das bei mir: https://ideone.com/2yy2Bh Wo ist das Problem? Edit: Was soll denn bitte &nmbr und &tmp sein? O_o Das sind Pointer. Willst du wirklich die Adressen von Pointern ausgeben? Oder nicht eher das, worauf sie zeigen?



  • cooky451 schrieb:

    Nachdem ich den Microsoft-Kram entfernt habe (tmain, TCHAR, stdafx) kompiliert das bei mir: https://ideone.com/2yy2Bh Wo ist das Problem? Edit: Was soll denn bitte &nmbr und &tmp sein? O_o Das sind Pointer. Willst du wirklich die Adressen von Pointern ausgeben? Oder nicht eher das, worauf sie zeigen?

    Das kann doch nicht sein...
    Die Ausgabe ist bei mir anders, ich erhalte für NMBR LENGT - 16 und für NMBR - 21²²²²½½½½½½½½.
    Auch wenn ich mit Breakpoints compiliere, sehe ich, dass das Array nicht richtig gekürzt wird...

    P.S.: Die Adressen habe ich nur aus Interesse ausgeben lassen.



  • blckbird schrieb:

    ich erhalte für NMBR LENGT - 16 und für NMBR - 21²²²²½½½½½½½½.

    Wenn du char-Arrays für Strings benutzt, musst du darauf achten, deine Strings durch Nullzeichen zu terminieren. Sowohl die Ausgabefunktionen als auch strlen erwarten eine Nullterminierung.

    Besser wäre, nicht mit Arrays und Zeigern zu hantieren, sondern mit std::string und std::vector, weil genau solche Probleme (und das Speicherleck in deinem Code) damit nicht auftreten.


Anmelden zum Antworten