frage zur vemeidung von 'öffentlichen' variablen.



  • long double Ziffern2ZahlWandler::ziffernvector_zahl(vector<char> zf, int pos)
    {
     zf.erase(zf.begin(), zf.begin()+pos);  //löscht die ersten n elemente eines vectors
    
     if(zf.size() > 1) {
                  is_nega = ((zf[0] == '-')? true : false); }
    
     if(!isdigit(zf[0])) {
                         zf.erase(vc.begin(), zf.begin()+1); //unbedingt verbessern }
    
     int i; // gefällt mir nicht!
     bool is_deca = false;
     for(i = 0; i < zf.size() && isdigit(zf[i]) || vc[i] == 'e' || zf[i] == '.'; i++) { 
    
             if(zf[i] == '.') { 
                      is_deca = true; 
                      i += 1; 
                      }
             /*if(zf[i] == 'e' && vc[i+1] == '+' || vc[i+1] == '-') { 
                      is_pot = true; 
                      p = i + 2; 
                      }*/
             }
    
    }
    

    wenn ich wie siehe oben eine funktion habe, die eine zahler variable (i) benutzt. wie kann ich in einer anderen funktion auf i zugreifen ohne i wie im bsp zu deklarieren 😕



  • du greifst aus keiner anderen funktion drauf zu, sondern übergibst i einer andern funktion, und du kannst einfach

    for( int i = 0; ...; i++ ) {... }
    

    machen



  • das weiß ich auch, die frage war allerdings wie man, wenn man dein bsp. benutzt

    for( int i = 0; ...; i++ ) {... }
    

    in einem anderen block auf i zugreifen kann!



  • in einem weiter äußeren block? nur wenn du es dort deklarierst...
    in nem inneren block, is klar, dort immer
    oder was meinst du?



  • omni schrieb:

    das weiß ich auch, die frage war allerdings wie man, wenn man dein bsp. benutzt

    for( int i = 0; ...; i++ ) {... }
    

    in einem anderen block auf i zugreifen kann!

    Das ist eine meines Erachtens gänzlich verschiedene Frage zu

    omni schrieb:

    wie kann ich in einer anderen funktion auf i zugreifen ohne i wie im bsp zu deklarieren 😕

    Soweit ich weiß musst du eine Variable in dem äussersten Scope definieren, in dem du sie auch benutzen willst.

    Btw.: Ganz davon abgesehen. In deiner Funktion benutzt du i doch nicht außerhalb der for-Schleife. Wo liegt also dein Problem?

    Caipi



  • long double Ziffern2ZahlWandler::ziffernvector_zahl(vector<char> zf, int pos)
    {
     zf.erase(zf.begin(), zf.begin()+pos);  //löscht die ersten n elemente eines vectors
    
     bool is_nega;
     if(zf.size() > 1) is_nega = ((zf[0] == '-')? true : false);
    
     if(!isdigit(zf[0])) zf.erase(zf.begin(), zf.begin()+1);
    
     int i;
     bool is_deca = false;
     for(i = 0; i < zf.size() && isdigit(zf[i]) || zf[i] == 'e' || zf[i] == '.'; i++) 
     { 
           if(zf[i] == '.') { 
                    is_deca = true; 
                    i += 1; 
                    }
           }
    
     int j = 0;
     while(j < zf.size()) 
     { 
             if(isdigit(zf[j])) zahl = zahl * 10 + mache_zahl(zf[j]); ++j;   
             if(!isdigit(zf[j])) break; 
             }
    
     while(i < zf.size() && is_deca == true) 
     { 
             if(isdigit(zf[i])) { 
                                long double temp = mache_zahl(zf[i]);
                                temp = temp / 10;
                                zahl =+ temp; 
                                } 
             if(!isdigit(zf[i])) break;
             }
    
     if(is_nega) zahl *= (-1);
     return zahl;
    }
    

    int i, wie ihr seht wird vor der for schleife deklariert damit ich in der nächsten while schleife noch damit arbeiten kann.
    ich wollte nur nach einer alternative fragen, nicht mehr und nicht weniger!
    ich wollte doch nur wissen wie man:

    //öffentliche Variablen
    int pos_gziffer = 0;
    int pos_vorgzahl = 0;
    short pos_klammer_a;
    short pos_klammer_z;
    ...
    
    long double gziffer(vector<char> vc, int pos, bool ermtl_pos) { 
      int d = 0, x = 0;
      long double p = 1; //für kommastellen und potenzen '10e+9'
      unsigned long long q = 10; //für kommazahlen
      long double zerg = 0;
      int negcounter = 0;
    
        if(ermtl_pos == true)
          pos_gziffer = x + (pos - 1);
    ...
    }
    
    int main() {
    ...
    }
    

    vermeiden kann 😃

    dann hab ich aber noch ein gänzlich anderes problem:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class Ziffern2ZahlWandler {
          public:
                 Ziffern2ZahlWandler();
                 Ziffern2ZahlWandler(vector<char>);
    
                 void eingabe(char ziffernzeichen);
                 void definiere(vector<char> ziffernfolge);
                 long double get_zahl();
                 long double ziffernvector_zahl(vector<char> ziffernfolge, int position);
    
          private:
                  char ziffernzeichen;
                  vector<char> ziffernfolge;
                  long double zahl;
                  long double ziffernzahl;
    };
    //inline Methoden
    inline Ziffern2ZahlWandler::Ziffern2ZahlWandler(vector<char> zf) : ziffernfolge(zf) {};
    
    //globale Funktionsprototypen
    long double mache_zahl(char ziffernzeichen);
    
    #include "char_ziffer.h"
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    long double mache_zahl(char z)
    {
     long double zahl = static_cast<long double>(z) - static_cast<long double>('0'); 
     return zahl; }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    long double Ziffern2ZahlWandler::get_zahl()
    {
     return zahl; }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void Ziffern2ZahlWandler::eingabe(char zz)
    {
     while(true) {
                 cin.get(zz);
                 if(zz != 'e')
                            ziffernfolge.push_back(zz);
                 else break;
      }
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void Ziffern2ZahlWandler::definiere(vector<char> zf)
    {
     zf = ziffernfolge;
     }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    long double Ziffern2ZahlWandler::ziffernvector_zahl(vector<char> zf, int pos)
    {
     zf.erase(zf.begin(), zf.begin()+pos);  //löscht die ersten n elemente eines vectors
    
     bool is_nega;
     if(zf.size() > 1) is_nega = ((zf[0] == '-')? true : false);
    
     if(!isdigit(zf[0])) zf.erase(zf.begin(), zf.begin()+1);
    
     int i;
     bool is_deca = false;
     for(i = 0; i < zf.size() && isdigit(zf[i]) || zf[i] == 'e' || zf[i] == '.'; i++) 
     { 
           if(zf[i] == '.') { 
                    is_deca = true; 
                    i += 1; 
                    }
           }
    
     int j = 0;
     while(j < zf.size()) 
     { 
             if(isdigit(zf[j])) zahl = zahl * 10 + mache_zahl(zf[j]); ++j;   
             if(!isdigit(zf[j])) break; 
             }
    
     while(i < zf.size() && is_deca == true) 
     { 
             if(isdigit(zf[i])) { 
                                long double temp = mache_zahl(zf[i]);
                                temp = temp / 10;
                                zahl =+ temp; 
                                } 
             if(!isdigit(zf[i])) break;
             }
    
     if(is_nega) zahl *= (-1);
     return zahl;
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    

    wenn ich jetzt noch

    #include <cstdlib>
    #include <iostream>
    #include "rechner.h"
    #include "char_ziffer.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        Ziffern2ZahlWandler o;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    mache bekomm ich:

    c:\Dokumente und Einstellungen\dGrat\Eigene Dateien\Visual Studio-Projekte\gtr-sim\char_ziffer.cpp(47): warning C4018: '<' : Konflikt zwischen signed und unsigned
    c:\Dokumente und Einstellungen\dGrat\Eigene Dateien\Visual Studio-Projekte\gtr-sim\char_ziffer.cpp(56): warning C4018: '<' : Konflikt zwischen signed und unsigned
    c:\Dokumente und Einstellungen\dGrat\Eigene Dateien\Visual Studio-Projekte\gtr-sim\char_ziffer.cpp(62): warning C4018: '<' : Konflikt zwischen signed und unsigned
    gtr-sim error LNK2019: Nicht aufgeloestes externes Symbol "public: __thiscall Ziffern2ZahlWandler::Ziffern2ZahlWandler(void)" (??0Ziffern2ZahlWandler@@QAE@XZ), verwiesen in Funktion _main
    gtr-sim fatal error LNK1120: 1 unaufgeloeste externe Verweise
    

    😞

    warum nur???



  • inline funktionen müssen in der headerdatei liegen, also dürfen nicht in einer anderne "übersetzungs-einheit" liegen wie die funktion, die die inline funktion aufruft...

    und mit den variablen ists ganz einfach, sie sind nur in dem scope gültig, in dem sie deklariet werden



  • hmm, wo hast du die Konstruktoren in der "char_ziffer.cpp" implementiert?
    meiner meinung nach ist das die ursache der vorletzten fehlermeldung...

    ...oder sehen wir da nur nen teil der implementierungsdatei?

    wenn nicht, dann musst du noch die konstruktoren implementieren 😉

    mfg



  • wieso muss ich meinen konstruktor implementieren?

    Ziffern2ZahlWandler();
                 Ziffern2ZahlWandler(vector<char>);
    

    wie soll ich das machen? falls jemand nicht weiß, das obere posting war meine header(char_ziffer.h)!
    meine implementation war vollst. gepostet.
    könnte das mal jemand zeigen, muss ja kein kunstwerk sein, hab den code bisher auch noch nicht testen können(wegen dem fehler 😡 )

    mfg omni


Anmelden zum Antworten