kostenloser Webspace werbefrei: lima-city


c Typendef. und verwendung!

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    crushedreality

    crushedreality hat kostenlosen Webspace.

    hi,
    also ich hab zwar son tutorial angefangen zu lesen war dann aber irgendwie zu faul weiterzumachen deshalb jetzt die Frage

    was mach ich falsch wie mach ichs richtig?:

    int main(int argc, char *argv[])
    {
      typedef struct tLieder { /<--mehr Vermutung als Wissen^^ 
              char Titel[20];
              char Interpret[20];
              int Gelernt;
              }
      tLieder Lieder[100];  //<-hier bekomm ich ne Fehlermeldung
      Lieder[1].Titel[2]=r; //<--kann man so die Felder ansprechen?
      system("PAUSE");	
      return 0;
    }


    ps.: char benutze ich weil ich kein plan hab ob es einen vordefinierten dynamischen typ string gibt !?

    thx before
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Also es wäre schön, wenn du die erwähnte Fehlermeldung auch mit dazu gepackt hättest. Ansonsten denke ich, dass das ; nach dem type {} fehlt. Ich bin mir jetzt wegen der Syntax nicht hundertpro sicher aber ich glaube so müsste es funktionieren:
    typedef struct{
                   char Titel[20];
                   char Interpret[20];
                   int Gelernt;
    } tLieder;
    tLieder Lieder[100];


    Du kannst auch für die Deklaration des Structs folgendes schreiben:
    struct tLieder{
                   char Titel[20];
                   char Interpret[20];
                   int Gelernt;
    };

    Zu den Strings sei gesagt, dass es eine Standardlibrary gibt, die du über
    #include <string.h>
    einbinden kannst.
    In C++ ohne das .h
  4. Autor dieses Themas

    crushedreality

    crushedreality hat kostenlosen Webspace.

    danke schonmal

    aber

    ich hab noch eine Frage:
    wie kann ich das ausgeben?

    int y;
    for (y=0; (Lieder[1].Titel[y]!='')||(y==20); y++)/<---Fehlermeldung in der Zeile!
    	  printf("%c",Lieder[1].Titel[y]);

    Dort kommt die Fehlermeldung "empty charactar constant"
  5. Also meine Vermutung ist, dass er das '' bemängelt. Er erwartet irgendein Zeichen an der Stelle.
    Wenn du auf das Ende des Strings prüfen willst, dann solltest du auf das Nullterminierungszeichen
    '\0'

    testen.
    Ich gehe davon aus, dass du einfach nur den String ausgeben willst. Dazu reicht die printf Funktion schon völlig aus:
    printf("%c",Lieder[1].Titel);

    Das gibt den String Titel aus.
  6. Autor dieses Themas

    crushedreality

    crushedreality hat kostenlosen Webspace.

    Joar ich hab das nun so geändert und das Programm ist gestartet allerdings trat nun wieder ein neues Problem auf und zwar, lief es nach der Liedtiteleingabe nicht weiter!

    int main(int argc, char *argv[])
    {
    
      typedef struct{
              char Titel[20];
              char Interpret[20];
              int Gelernt;
              } tLieder;
    
      tLieder Lieder[100];
      
      printf("Willkommen in ihrer Musikbibliothek!\n\n");
      printf("Bitte geben Sie jetzt den Musiktitel ein:\n");
      int i;
      for (i=0; ((Lieder[1].Titel[i]=getchar()) != EOF||i==20); i++); //<--Eingabe auf Variable legen
      for (i=i; i==20; i++) 
          Lieder[1].Titel[i]:=" "; //<--Standardlänge von 20 Feldern für spätere Tabelle
    
      printf("\n%c",Lieder[1].Titel);//<--Ausgabe Liedtitel
    
      system("PAUSE");
      return 0;
    }


    Leider trat keine Fehlermeldung auf und ich komm an der Stelle nicht weiter
    (Falls ihr nach dem Sinn dieses Progs fragt: ES HAT KEINEN, mein Ziel ist es dies bis zu einer kleinen Datenbank zu treiben mit der ich dann Dateien anlege Bäume aufstelle usw. bis ich c kann^^)
  7. Also ich kenne keine Taste, mit der man ein EOF Zeichen erzeugen kann.
    Da ich davon ausgehe, dass du mit Enter die Eingabe beenden willst, solltest du stattdessen auf den Zeilenumbruch '\n' testen.

    Desweiteren ist mir diese Zeile aufgefallen:
    for (i=i; i==20; i++)

    Ich weiß nicht, was du damit erreichen möchtest aber ich kann dir sagen, dass folgendes die gleiche Wirkung hätte:
    if(i==20)
    {
        Lieder[1].Titel[i]=" ";
        i++;
    }

    Wenn es dir darauf ankommt den Rest des Strings zu "leeren", dann solltest du folgendes machen:
    for (; i<20; i++)
         Lieder[1].Titel[i]="\0";

    Kurze Erklärung:
    - i auf sich selbst zuweisen ist irgendwie unnötig
    - Strings sollte man lieber mit Nullterminierungszeichen auffüllen als mit Leerzeichen
    - Strings oder besser Char-Arrays haben bei N Elementen den höchsten Index N-1 und beginnen mit der Indizierung bei 0
    (Ich sehe das an deinen := die in C++ nur = heißen ;-)

    Beitrag zuletzt geändert: 7.8.2010 18:13:45 von sektor
  8. Autor dieses Themas

    crushedreality

    crushedreality hat kostenlosen Webspace.

    Also erstmal kurz zu den Leerzeichen:
    Wurst     Schinken
    Käse      Milch


    ohne:
    Wurst Schinken
    Käse Milch


    --> Deshalb wollte ich die Verwenden, um in der Konsole eine Art Tabellenform entstehen zu lassen

    , dass mit i=i hab ich weggenommen (wußte nicht das es einfach weggelassen werden kann)
    , dass mit dem := hab ich von Delphi(Pascal/Delphi Win32)
    , dann ist mir aufgefallen das die Endbedingungen für die Schleife erst falsch waren(nun eigl nicht mehr)

    ---> Leider hab ich aber mit der ersten Schleife ein Problem und zwar wenn ich jetzt irgendein Liedtitel eingebe(zb TNT) und dann bestätige und dann noch 20 mal bestätige kommt einfach nur die Meldung dass das Programm zu Ende ist. Ich dachte, dass die getchar()-Fkt. einen char abfragt den an eine variable übergibt und dann automatisch zum zweiten geht.(Wie die read funktionen um Dateien einzulesen)
    Wie könnte ich das berichtigen?

    int main(int argc, char *argv[])
    {
    
      typedef struct{
              char Titel[20];
              char Interpret[20];
              int Gelernt;
              } tLieder;
    
      tLieder Lieder[100];
      
      printf("Willkommen in ihrer Musikbibliothek!\n\n");
      printf("Bitte geben Sie jetzt den Musiktitel ein:\n");
      int i;
      for (i=0; (Lieder[0].Titel[i]=getchar()) != '\n' || i<=19; i++); //<--Eingabe auf Variable legen
      for (; i<=19; i++) 
          Lieder[0].Titel[i]=' '; //<--Standardlänge von 20 Feldern für spätere Tabelle
    
      printf("\n");
      for (i=0; i<=19; i++)
          printf("%c",Lieder[0].Titel[i]);//<--Ausgabe Liedtitel
      printf("\n");
    
      system("PAUSE");
      return 0;
    }



    Beitrag zuletzt geändert: 8.8.2010 12:30:07 von crushedreality
  9. Erstmal kurz zur Tabellenform.
    Die Funktion printf unterstützt viele Formatierungshilfen: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ (ist in Englisch).
    Unter anderem kann man die Breite einer ausgabe vorschreiben:
    printf("%21c",Lieder[0].Titel[i]);

    Damit werden immer 21 Zeichen belegt. Wenn der String kleiner ist, wird mit Leerzeichen aufgefüllt. Wenn er länger ist, dann wird er nicht gekürzt.

    Was deine Ausgabe angeht, ist das auch ganz logisch. Du überprüfst einfach nur auf das Zeilenumbruch Zeichen, was bedeutet, dass jeder Zeilenumbruch als Eingabe gewertet wird. Du müsstest also prüfen ob vorher schon Buchstaben eingegeben wurden. Wenn du das auffüllen weglässt, dann musst du aufpassen, dass du den Zeilenumbruch aus dem String löscht, sonst wird er mit angezeigt.

    Beitrag zuletzt geändert: 8.8.2010 16:33:00 von sektor
  10. Autor dieses Themas

    crushedreality

    crushedreality hat kostenlosen Webspace.

    erstmal danke für den link(schicke Seite)
    und dann versteh ich aber nciht ganz was du mit ich überprüfe das zeilenumbruchzeichen meinst also:

    ich dachte mit getchar guckt er zuerst nach dem ersten zeichen (also auf T(wenn ich TNT eingebe)) dann auf N und dann wieder auf T und dann findet er das \n und bricht die Schleife ab dachte ich?
  11. Es ist dein Wunsch, dass er abbricht aber die Schleifenbedingung lautet:
    (Lieder[0].Titel[i]=getchar()) != '\n' || i<=19

    Das ODER ist der falsche Teil. Du willst, dass die Schleife solange läuft, wie ein gültiges Zeichen eingegeben wird UND der String noch nicht voll ist. So wie es jetzt ist, bricht er immer erst ab, wenn der String voll ist.
    Ansonsten würde ich dir empfehlen gleich direkt Strings zu lesen:
    http://www.cplusplus.com/reference/clibrary/cstdio/gets/
  12. Autor dieses Themas

    crushedreality

    crushedreality hat kostenlosen Webspace.

    ja stimmt das war der fehler jetzt läufts!^^
    aber hab schon das nächste Problem^^ kann mir einfach nicht erklären warum er meine Bedingung in der while Schleife und mein getchar ignoriert am Ende!

    int main(int argc, char *argv[])
    {
    
      typedef struct{
              char Titel[20];
              char Interpret[20];
              char Gelernt;
              } tLieder;
    
      tLieder Lieder[100];
      int a=0, i; 
      char b='Y';
      printf("Willkommen in ihrer Musikbibliothek!\n");
      do{  
        printf("\nBitte geben Sie jetzt den Musiktitel ein:\n");
        for (i=0; (Lieder[a].Titel[i]=getchar()) != '\n' && i<=19; i++); //<--Eingabe auf Variable legen
        for (; i<=19; i++) 
            Lieder[a].Titel[i]=' '; //<--Standardlänge von 20 Feldern für spätere Tabelle
        printf("\nBitte geben sie den Interpreten an:\n");
        for (i=0; (Lieder[a].Interpret[i]=getchar()) != '\n' && i<=19; i++); //<--Eingabe auf Variable legen
        for (; i<=19; i++) 
            Lieder[a].Interpret[i]=' '; //<--Standardlänge von 20 Feldern für spätere Tabelle
        printf("\nHaben sie diesen Titel gelernt?(Y-Ja, N-Nein)\n");
        Lieder[a].Gelernt=getchar();
        printf("\nMoechten Sie noch einen Eintrag machen?(Y-Ja, N-Nein)\n");
        b=getchar();
        a++;    
      }while(b=='Y');  
    /*Tabellenausgabe*/
      
      printf("\n");
      printf("Titel               Interpret           Gelernt\n");
      while(a>0){
        for (i=0; i<=19; i++)
            printf("%c",Lieder[a-1].Titel[i]);//<--Ausgabe Liedtitel
        for (i=0; i<=19; i++)
            printf("%c",Lieder[a-1].Interpret[i]);//<--Ausgabe Interpret
        printf("%c",Lieder[a-1].Gelernt);
        printf("\n");
        a--;
  13. Meine einzige vermutung ist, dass du irgendwie noch einen anderen Buchstaben eingibst. Am besten wäre, wenn du deine Schleife mal so schreibst, dass er immer aussteigt außer, wenn ein Y eingegeben wird. Und wenn ein falscher Buchstabe eingegeben wird, dann bringst du eine Fehlermeldung wie: "[Buchstabe]" ist keine gültige Antwort. Dann solltest du recht schnell rausbekommen, was falsch läuft.
  14. Autor dieses Themas

    crushedreality

    crushedreality hat kostenlosen Webspace.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
    
      typedef struct{
              char Titel[20];
              char Interpret[20];
              char Gelernt;
              } tLieder;
    
      tLieder Lieder[100];
      int a=0, i; 
      char b;
      printf("Willkommen in ihrer Musikbibliothek!\n");
      do{  
        printf("\nBitte geben Sie jetzt den Musiktitel ein:\n");
        for (i=0; (Lieder[a].Titel[i]=getchar()) != '\n' && i<=19; i++); //<--Eingabe auf Variable legen
        for (; i<=19; i++) 
            Lieder[a].Titel[i]=' '; //<--Standardlänge von 20 Feldern für spätere Tabelle
        printf("\nBitte geben sie den Interpreten an:\n");
        for (i=0; (Lieder[a].Interpret[i]=getchar()) != '\n' && i<=19; i++); //<--Eingabe auf Variable legen
        for (; i<=19; i++) 
            Lieder[a].Interpret[i]=' '; //<--Standardlänge von 20 Feldern für spätere Tabelle
        printf("\nHaben sie diesen Titel gelernt?(Y-Ja, N-Nein)\n");
        Lieder[a].Gelernt=getchar();
        printf("\nMoechten Sie noch einen Eintrag machen?(Y-Ja, N-Nein)\n");
        do{
          b=getchar();      
          if(b!='Y' && b!='N') printf("ungueltige Eingabe\n");
        }while (b!='Y' && b!='N');
        a++;    
      }while(b=='Y');  
    /*Tabellenausgabe*/
      
      printf("\n");
      printf("Titel               Interpret           Gelernt\n");
      while(a>0){
        for (i=0; i<=19; i++)
            printf("%c",Lieder[a-1].Titel[i]);//<--Ausgabe Liedtitel
        for (i=0; i<=19; i++)
            printf("%c",Lieder[a-1].Interpret[i]);//<--Ausgabe Interpret
        printf("%c",Lieder[a-1].Gelernt);
        printf("\n");
        a--;
      }
      
      system("PAUSE");
      return 0;
    }


    so dass wäre jetzt behobe trotzdem treten fehler auf die ich nciht verstehe (wenn man das programm ausführt und zwei Titel eingibt ist es erkennbar)

    ich hoffe ihr könnt mir die Fehler erklären ich versteh leider nciht wie es dazu kommt.
  15. Es wäre hilfreich, wenn du den Fehler erstmal beschreiben würdest.
    Ich hab mal deinen Code getestet und was mir auffiel, ist dass jedes mal die Entertaste gedrückt werden muss und diese als Zeichen interpretiert wird. Ich hatte dir ja schon dazu geraten, dass du lieber die Funktion gets verwendest, da diese automatisch den Tastencode der Entertaste entfernt.
  16. Der Fehler liegt, meines Erachtens, darin, dass plötzlich das Programm crushedreality nicht mehr erlaubt, einen Titel einzugeben,
    sondern sofort nach dem Interpreten verlangt und sich auch fortan höchst seltsam aufführt.

    Tja, mein Lieber, ich würde sagen, das liegt an dem zugemüllten StdIn: Bei mir zumindest bleibt da immer
    noch ein Rest von irgendwas übrig. Abhilfe leistet Dir hierbei die Funktion "fflush(stdin)", die den gesamten
    Standardinput leeren wird und somit Platz für neues schafft. Es reicht, wenn Du sie einmal vor dem Einlesen
    des Titels ausführst.

    Damit sollte es insgesamt zumindest funktionieren...

    LG
    madhatt3r
  17. Autor dieses Themas

    crushedreality

    crushedreality hat kostenlosen Webspace.

    zu der fflush funktion hab ich gelesen das sie linuxseitig nicht unterstützt wird und ausserdem versteh ich das auch nciht
    denn eigl wird doch für jede Variable Speicher reserviert der überschrieben wird wenn sie einen neuen wert zugewiesen bekommt könntest du mir also bitte das etwas näher erklären welcher Speicher in meinem Fall gefüllt ist der ein Funktionieren der Software verhindert?
  18. OK: Das Problem liegt in den Zeilen, wo Du nur auf 'Y' oder 'N' abfragst: Nichtsdestoweniger wird der Druck auf [ENTER] als
    Charactercode 0x0a in stdin geschrieben und BLEIBT dort erst einmal. Das bedeutet, wir haben zunächst einmal nach dem ersten
    Titel zwei überflüssige 0x0a in stdin stehen.

    Da "getchar()" (und soweit ich weiß, auch jede andere input-Funktion) nun nicht von sich aus auf Eingaben wartet, sondern, solange
    noch Daten in stdin drin stehen, diese erst einmal ausließt und als gültige Eingabe annimmt, werden bei den nächsten Fragen die
    beiden Absätze (0x0a nämlich) als Eingaben gewertet. Aus sicht des Computers hast Du bei dem nächsten Aufruf von "getchar()"
    also schon was geschrieben...

    Wie Du dem begegnen kannst: Da Linux nun mal tatsächlich "fflush(FILE*)" nicht auf stdin anwendet, wäre die einfachste (und vermutlich auch gängigste, wenn auch nicht schönste) Variante, nach jeder "Y/N" Abfrage, also zunächst nach der, ob man das Stück gelernt habe, anschließend nach der Frage, ob noch ein Eintrag hinzugefügt werden soll, nach dem Auslesen des Entscheidungsbuchstabens
    noch einmal "getchar()" (oder fgetc(&c, 1, 1, stdin) oder getc(stdin) oder fgetc(stdin) oder sonst was) aufzurufen, um den übrig
    gebliebenen Absatz (0x0a) zu entfernen.

    Problem gelöst, das Programm läuft.
  19. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!