Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » HDL-Programm

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
02.08.2005, 10:25 Uhr
~Silence
Gast


Hallo

hat von euch jemand Ahnung und kann mir vielleicht sagen warum folgendes C++ Programm nicht läuft? Der Compiller meckert bei if immer. Er meint da wäre ein Vergleich zwischen einem pointer und integer, aber a ist ja vom Typ char.


C++:
#include <iostream>
using namespace std;

main()
{
    char a[20];
    
    cout<<"Hi, na Kleine ;o)\nGib doch HDL oder HDG ein wenn, du magst\n";
    cin>>a;
    cout<<a;
    if((a=='HDG') || (a=='HDL'))
    cout<<"\n\n  ___   ___\n::   ***   ::\n **_     _**\n    :_ _:\n      *\n\n\n";

    system("PAUSE");
}



mod edit: benutze die CPP tags selber!

Dieser Post wurde am 02.08.2005 um 12:13 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.08.2005, 10:55 Uhr
CaesarCortezz
minderer Student


nimm strings da lässt sich sowas problemlos machen
--
Thus spake the master programmer:

``When the program is being tested, it is too late to make design changes.''
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.08.2005, 11:01 Uhr
tabin



nein a ist der pointer auf das erste zeichen (char) von a[20]

du kannst entweder die zeichen einzeln vergleichen (also zb mit einer for-schleife) oder direkt strcmp (was auch eine forschleife wär) bzw memcmp benutzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.08.2005, 11:02 Uhr
tabin



jo oder direkt string benutzten


(hab ich ja ganz vergessen das es die gibt bei c++ *g)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.08.2005, 11:09 Uhr
RedEagle




C++:
#include <cstdlib>

//...

if( strcmp(a, "HDG")==0 || strcmp(a, "HDL")==0 )

--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.08.2005, 12:31 Uhr
Pablo
Supertux
(Operator)



Zitat von ~Silence:
Hallo

hat von euch jemand Ahnung und kann mir vielleicht sagen warum folgendes C++ Programm nicht läuft? Der Compiller meckert bei if immer. Er meint da wäre ein Vergleich zwischen einem pointer und integer, aber a ist ja vom Typ char.



weil du ein Vergleich zwischen einen Pointer und einem Char machst, du vergleichst Biernen und Äpfeln auf Inhalt-Gleichheit.

a ist zwar ein Array von Typ char mit 20 Einträgen, aber wenn du nur "a" schreibst (ich meine ohne a[irgendeinwert]) dann ist "a" die Adresse auf das erste Element des Arrays, also verhält sich in diesem Fall wie ein Zeiger.

In C/C++ sind Strings solche Konstrukte, die mit Anführungszeichen begrenzt sind.

C++:
"ich bin ein string"



Am Ende dieses Strings (im Speicher) ist auch das '\0' Character gespeichert.

Charactere sind aber nur einzelne Zeichen, also nur ein Zeichen, und die werden nur durch Hochkommatas begrenzt und nur ein Zeichen enthält.


C++:
'a' /* das ist richtig, das ist ein Zeichen */
'abc' /* falsch, denn abc kein Zeichen ist sondern 3 */



Bei diesem Fehler bin ich aber nicht sicher, wie die compilier sich verhalten. Ich hab auch nicht nachgeschaut, was im Standard diesbezüglich steht, aber ich denke, dass der Compiler meckert, dass das falsch ist oder ignoriert einfach die restlichen Zeichen.

Gehen wir davon aus, dass dein Compiler 'HDG' als nur 'H' interpretiert.

C++:
if(a=='H')



bedeutet, "vergleiche den Inhalt der Variable a mit dem Wert 'H' ". So, a zeigt in diesem Fall auf eine Speicherstelle, liefert eine Speicheradresse zurück. 'H' ist ein Character und das ASCII-CODE von 'H' ist 72. Also du vergleichst eine Speicheradresse mit dem Wert 72.

Angenommen, du machst:

C++:
if(a=="H")



dann meckert der Compiler nicht, denn "H" die Speicheradresse liefert, auf der das Strings "H" gespeichert ist ({'H', '\0'}). Also ist das ein Vergleich von Adressen, du vergleichst nur Speicheradressen und nicht den Inhalt der Speicheradressen. Deswegen würde in diesem Fall zwar keinen Fehler geben aber stets die if Anfrage übersprungen.

Um den Inhalt von Strings zu vergleichen gibt es strcmp(3).

Was der Handhabung von Strings in C angeht, solltest du dir das hier anschauen: FAQ::Strings Handhabung

Wenn du schon C++ benutzt, dann würde ich std::strings bevorzugen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.08.2005, 12:31 Uhr
~Silence
Gast


Danke für die schnelle Antwort
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.08.2005, 16:39 Uhr
~Silence
Gast


Hallo nochmal

Da gibt es doch noch ein Problem. Ich hatte zuerst auch folgendes versucht:

C++:
#include <iostream>
using namespace std;

main()
{
    string a;
    
    cout<<"Hi, na Kleine ;o)\nGib doch HDL oder HDG ein, wenn du magst\n";
    cin>>a;
    cout<<a;
    while((a=='HDG') || (a=='HDL'))
    cout<<"\n\n  ___   ___\n::   ***   ::\n **_     _**\n    :_ _:\n      *\n\n\n";

    system("PAUSE");
}



Das funktionierte leider nicht. Nach ein bisschen umschauen, dann folgendes:


C++:
#include <iostream>
using namespace std;

main()
{
    string a("Ich bin ein string");
    
    cout<<"Hi, na Kleine ;o)\nGib doch HDL oder HDG ein, wenn du magst\n";
    cin>>a;
    cout<<a;
    while((a=='HDG') || (a=='HDL'))
    cout<<"\n\n  ___   ___\n::   ***   ::\n **_     _**\n    :_ _:\n      *\n\n\n";

    system("PAUSE");
}  


Und das funktioniert leider auch nicht:


C++:
#include <iostream>
#include <cc++/string.h>
using namespace std;

main()
{
    string a("Ich bin ein string");
    
    cout<<"Hi, na Kleine ;o)\nGib doch HDL oder HDG ein, wenn du magst\n";
    cin>>a;
    cout<<a;
    while((a=='HDG') || (a=='HDL'))
    cout<<"\n\n  ___   ___\n::   ***   ::\n **_     _**\n    :_ _:\n      *\n\n\n";

    system("PAUSE");
}    


Tschuldige, wenn das für euch so primitiv ist, aber ich hab da nicht so die Ahnung.

mod edit: schon das 2. Mal: Benutze die CPP Tags SELBER!

Dieser Post wurde am 02.08.2005 um 19:12 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.08.2005, 16:47 Uhr
~Silence
Gast


Hab mir grade nochmal den Link zur Handhabung mit den strings angeschaut. Ich dachte es wäre wie in Pascal einfach string a; und dann a=HDG; und anschließend vergleichen. C++ soll doch immer die beste Programmiersprache der Welt sein, also warum dann so kompliziert?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.08.2005, 17:01 Uhr
virtual
Sexiest Bit alive
(Operator)


Du solltest mal "HDL" anstelle von 'HDL' verwenden (Strings werden in doppelten Hochkomma, auch Gänsefüßchen genannt, eingefasst)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: