char* von if nicht erkannt



  • Hallo alle zusammen,

    Ich will ein Programm schreiben, das manche Flughäfen erkennt und dafür die richtigen
    Koordinaten einsetzt, wenn es sie kennt. Sonst soll ein else-Block aufgerufen werden, um
    die Koordinaten per Hand einzutragen. Hier der Header und die Implementierung:

    Header:

    #ifndef EIGEN_H
    #define EIGEN_H
    
    #include <windows.h>
    #include <iostream>
    
    namespace Zeichen
        {
            const unsigned char AE = static_cast<unsigned char>(142);
            const unsigned char ae = static_cast<unsigned char>(132);
            const unsigned char OE = static_cast<unsigned char>(153);
            const unsigned char oe = static_cast<unsigned char>(148);
            const unsigned char UE = static_cast<unsigned char>(154);
            const unsigned char ue = static_cast<unsigned char>(129);
            const unsigned char ss = static_cast<unsigned char>(225);
            const unsigned char gr = static_cast<unsigned char>(248);
        }
    
    struct koord {
               int lg;
               int lm;
               int ls;
               char lae;
               int bg;
               int bm;
               int bs;
               char bre;
        };
    
    void punkte (int, int=500);
    
    void einfuegen (char *, koord* );
    
    #endif
    

    Die Implementierung:

    #include "eigen.h"
    using namespace std;
    void punkte( int a,int b) {
         for(int i=0; i <= a; i++) {
                 cout << "." << flush;
                 Sleep ( b );
                 }
         }
    
    void einfuegen (char* a, koord* koords) {
         int qqq=0;
         if (a == "Frankfurt" || a == "EDDF" || a == "eddf" || a == "FRA" ||
            a == "fra" || a == "frankfurt" || a == "FRANKFURT") {
              a = "Frankfurt";
              koords->lg=50;koords->lm=1;koords->lae='N';koords->bg=8;
              koords->bm=32;koords->bre='O';koords->ls=35;koords->bs=35;
              }
         else { qqq = 1;
              cout << "Leider ist " << a << " in der Datenbank des " << endl;
              cout << "Programms nicht vorhanden. Bitte geben sie die " << endl;
              cout << "Koordinaten von " << a << " ein.\n" << endl;
              cout << "Bitte beachen sie, dass sie die Koordinaten wie " << endl;
              cout << "folgt eingeben m" << Zeichen::ue << "ssen, da sie sonst nicht erkannt werden\n";
              cout << "z.B. Berlin (52" << Zeichen::gr << "23\' 0\'\' N, 13" << 
              Zeichen::gr << "31\' 47\'\' O ): 52 23 0 N 13 47 O" << endl;
              cin >>koords->lg >> koords->lm >> koords->ls >> koords->lae >>
              koords->bg >> koords->bm >> koords->bs >> koords->bre;
              }
         switch ( qqq ) {
                case 0: cout << "Okay, der Flughafen wurde erkannt, die" << endl;
                        cout << "Koordinaten wurden eingesetzt." << endl;
                        break;
                case 1: cout << "OK, die Koordinaten wurden eingesetzt." << endl;
                        break; 
                }
         }
    

    Ich hab die anderen Flughäfen rausgelassen, sie sind genaus aufgebaut wie Frankfurt.

    Ich bekomme keine Fehlermeldung, aber wenn ich der Funktion "Frankfurt" oder "EDDF" übergebe,
    erkennt diese es nicht und ich komme zu dem else-Block, um die Koordinaten per Hand nachzutragen.

    Kann mir da jemand helfen ???

    PS: Die Funktion mit den Punkten tut da nichts zur sache.

    Danke schon mal im Voraus, Tim





  • Du kannst ein char * nicht mit == vergleichen! Du musst stattdessen mit strcmp arbeiten:
    http://www.cplusplus.com/reference/clibrary/cstring/strcmp.html

    Oder du machst es dir einfacher und wählst den in C++ üblichen weg, d.h. du benutzt anstatt char * std::string.
    Dann kannst du auch wieder mit == arbeiten und sparst dir eine menge Ärger...



  • ok, danke



  • So, ich habs jetzt ma so gemacht:

    Header:

    //...
    void einfuegen (string *, koord* );
    //...
    

    Implementierung:

    void einfuegen (string * a, koord* koords) {
         int qqq=0;
         if (*a == "Frankfurt" || *a == "EDDF" || *a == "eddf" || *a == "FRA" ||
            *a == "fra" || *a == "frankfurt" || *a == "FRANKFURT") {
              *a = "Frankfurt";
              koords->lg=50;koords->lm=1;koords->lae='N';koords->bg=8;
              koords->bm=32;koords->bre='O';koords->ls=35;koords->bs=35;
              }
    //usw
    }
    

    Ich bekomme die folgende Fehlermeldung (im Header )

    eigen.h: variable or field `einfuegen' declared void
    eigen.h:`string' was not declared in this scope
    (Hauptprog)haupt.cpp:`einfuegen' cannot be used as a function
    

    Ich habe den Header cstring eingebunden.

    mfg,

    Tim



  • Du brauchst <string>
    und dann wird ein string mit std::string deklariert



  • geht net, ich bekomme die gleiche Fehlermeldung wie oben.



  • Bist du sicher, dass du <string> zuvor inkludiert hast und den Namensraum angibst? Gib doch nochmals den jetzigen Code und die passende Fehlermeldung an.

    Ausserdem würde ich den std::string eher als Const-Referenz als als Zeiger übergeben.



  • ok, danke, das klappt soweit wieder, ich bekomme keine fehlermeldung.
    allerding wird mein der funktion übergebener Flughafen wieder nicht erkannt.
    ich hab einfach std:: davorgesetzt.

    Header:

    //...
    void einfuegen (std::string *, koord* );
    //...
    

    Implementierung:

    //...
    void einfuegen (std::string * a, koord* koords) {
         int qqq=0;
         if (*a == "Frankfurt" || *a == "EDDF" || *a == "eddf" || *a == "FRA" ||
            *a == "fra" || *a == "frankfurt" || *a == "FRANKFURT") {
              *a = "Frankfurt";
              koords->lg=50;koords->lm=1;koords->lae='N';koords->bg=8;
              koords->bm=32;koords->bre='O';koords->ls=35;koords->bs=35;
              }
    //...
    }
    

    Funktionsaufruf mit

    einfuegen ( &start, &koords );
    

    start ist ein vorher eingegebener string.

    Mein if erkennt wieder "Frankfurt" nicht und ich komme zum else-block.

    mfg
    Tim



  • Warum machst du das da überhaupt mit Zeigern? - Du kannst ja auch einen normalen (ev. const) string übergeben. Ist üblicher, als da etwas mit Zeiger zu machen. Vor allem ist der Aufruf auch intuitiver.

    Der gegebene Code sollte allerdings funktionieren. Also wird etwas beim Aufruf schief gehen.



  • ok. ich habs jetzt nochma mit einer const std::string & probiert.

    Header:

    //...
    void einfuegen (const std::string &, koord* );
    //...
    

    Implementierung:

    //...
    void einfuegen (const std::string & a, koord* koords) {
         int qqq=0;
         if (a == "Frankfurt" || a == "EDDF" || a == "eddf" || a == "FRA" ||
            a == "fra" ||a == "frankfurt" || a == "FRANKFURT") {
              a = "Frankfurt";
              koords->lg=50;koords->lm=1;koords->lae='N';koords->bg=8;
              koords->bm=32;koords->bre='O';koords->ls=35;koords->bs=35;
              }
    //...
    }
    

    Aufruf mit:

    einfuegen ( rstart, &koords );
    

    rstart ist:

    const string & rstart=start;
    

    Leider bekomme ich jetzt folgende Fehlermeldung:

    passing `const std::string' as `this' argument of `std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' discards qualifiers
    

    und zwar genauso oft, wie ich

    a = "Frankfurt";
    

    verwendet habe. Hier liegt auch die Fehlerzeile.

    Jetzt blick ich überhaupt nicht mehr durch.

    mfg

    Tim



  • an drakon:

    ich mach des ganze mit zeigern, weil ich den wert ändern will, so dass, wenn man z.B. frankfurt eingibt, die Funktion die richtige Rechtschreibung einsetzt.

    mfg

    Tim



  • const paßt leider vorläufig nicht zu deinem entwurf.



  • Tim1995 schrieb:

    ich mach des ganze mit zeigern, weil ich den wert ändern will, so dass, wenn man z.B. frankfurt eingibt, die Funktion die richtige Rechtschreibung einsetzt.

    Dafür kannst du auch (Non-Const-)Referenzen einsetzen.



  • OK.

    Ich hab des const weggemacht.

    Das if erkennt immer noch nicht FRA.

    Vielleicht ist die Eingabe irgendwie net ok ?

    ich mach das so:

    cin >> start;
    einfuegen ( rstart, &koords );
    

    mfg

    Tim 😕 😡 😮



  • Tim1995 schrieb:

    Vielleicht ist die Eingabe irgendwie net ok ?
    ich mach das so:

    cin >> start;
    einfuegen ( rstart, &koords );
    

    dein erkennungscode ist ok.

    aber warum tust du start einlesen und rstart übergeben?

    wenn es wirklich start und rstart geben soll, dann entweder

    cin >> start;
    string rstart=start;
    einfuegen ( rstart, &koords );
    

    oder besser

    cin >> start;
    string rstart=einfuegen ( rstart, &koords );
    

    aber super hübsch isses noch net, weil du dummerweise 2 rückgabewerte hast.

    perfekt wäre ne struktur aus name und koordinaten, glaub ich.



  • OK. Nach Idee von volkard ganz neue Art.
    Sie klappt!!!! Endlich!!!

    Header:

    //...
    koord einfuegen ( koord );
    //...
    

    Implementierung:

    koord einfuegen (koord koords) {
         int qqq=0;
         koord rueck;
         if (koords.name == "Frankfurt" || koords.name == "EDDF" || 
            koords.name == "eddf" || koords.name == "FRA" ||
            koords.name == "fra" || koords.name == "frankfurt" || 
            koords.name == "FRANKFURT") {
              rueck.name = "Frankfurt";
              rueck.lg=50;rueck.lm=1;rueck.lae='N';rueck.bg=8;
              rueck.bm=32;rueck.bre='O';rueck.ls=35;rueck.bs=35;
              }
    //...
    }
    

    Aufruf mit:

    koords=einfuegen ( koords );
    

    Vielen Dank euch allen.

    Tim 👍 😉 🙂



  • Um das ganze etwas schöne zu gestalten würde ich die Eingabe einfach auf lower case umwandeln und dann überprüfen. (sofern das innerhalb des Namens ebenfalls erlaubt sein soll; ansonsten könntest du auch nur den ersten Buchstaben umwandeln)

    http://www.cplusplus.com/reference/clibrary/cctype/tolower.html

    Und dann würde ich da noch ein wenig auf die Einrückung achten. Klammern sollten immer zu einem Block gehören, welchen man erkennen sollte.

    z.B so:

    if ( blabla ){
        ...
    }
    

    oder

    if ( blabla )
    {
        ...
    }
    

    aber sicher nicht:

    if ( blabla ){
       ...
       }
    


  • ich habs eben nur nit einem if probiert.
    Wenn ich jetzt z.B. London dazunehme, gehts wieder nicht und der Flughafen wird wieder ncicht erkannt.

    koord einfuegen (koord koords) {
         int qqq=0;
         koord rueck;
         if (koords.name == "Frankfurt" || koords.name == "EDDF" || 
            koords.name == "eddf" || koords.name == "FRA" ||
            koords.name == "fra" || koords.name == "frankfurt" || 
            koords.name == "FRANKFURT") {
              rueck.name = "Frankfurt";
              rueck.lg=50;rueck.lm=1;rueck.lae='N';rueck.bg=8;
              rueck.bm=32;rueck.bre='O';rueck.ls=35;rueck.bs=35;
              }
         if ( koords.name == "London" || koords.name == "london" || 
            koords.name == "EGLL" || koords.name == "egll" || 
            koords.name == "LHR" || koords.name == "lhr" || 
            koords.name == "LONDON" ) {
              rueck.name = "London";
              rueck.lg=51;rueck.lm=28;rueck.lae='N';rueck.bg=0;
              rueck.bm=27;rueck.bre='W';rueck.ls=39;rueck.bs=41;
              }
    //..
    }
    

    um hilfe wird gebeten,

    Tim



  • Schau doch mit dem Debugger, ob die Werte innerhalb der Funktion dem entsprechen, was du erwartest. Dann findest du schnell heraus, wo es happert.


Anmelden zum Antworten