HIGHSCORE, BITTE JEDER DER AHNUNG HAT KURZ MAL REIN SCHAUEN, BRAUCHE DAS MEGA SCHNELL



  • also darauf könntest du auch von selber kommen 😃

    daten ist ein zeiger auf den zu verschlüsselnden speicherbereich. in deinem falle ist das logischerweise das, was du verschlüsseln willst, nämlich ein feld von highpl[].

    anz ist die länge des speicherbereichs in bytes, auf den daten zeigt, also sizeof(struct highpl).



  • axo ^^ 😃



  • @Konfusius.

    Missverständlich ausgedrückt von mir. Die Länge des array of bytes ist nicht bestandteil der Struktur und wir nicht mitverschlüsselt. In unserem Fall ist die Länge eines Records ja immer gleich lang.
    Allerdings hast du mich damit auf einen guten Gedanken für andere Sachen gebracht.
    Um aber array of char´s unterschiedlicher Länge verschlüsselt zu speichern ginge folgendes Konstrukt.

    WriteCoded(char *daten)
    {
    unsigned int len;
    len=strlen(daten); // hier nicht ein uncoded string somit funktioniert strlen;
    verschluesseln (daten,len) ; // jetzt verschlüsselt
    write(fp,len,sizeof(unsigned int));
    write(fp,daten,len*(sizeof(char)));
    }
    
    ReadCoded(char *daten)
    {
    read(fp,len,sizeof(unsigned int));
    read(fp,daten,len*(sizeof(char)));
    verschluesseln (daten,len) ; // jetzt entschlßsselt
    }
    


  • @PAD
    wie waers mit:

    WriteCoded(char *daten){
       unsigned int len;
       len=strlen(daten); // hier nicht ein uncoded string somit funktioniert strlen;
       verschluesseln (daten,len) ; // jetzt verschlüsselt
       write(fp,len,sizeof(unsigned int));
       write(fp,daten,len*(sizeof(char)));
    }//end WriteCoded
    
    ReadCoded(char *daten){
       read(fp,len,sizeof(unsigned int));
       read(fp,daten,len*(sizeof(char)));
       verschluesseln (daten,len) ; // jetzt entschlßsselt
    }//end ReadCoded
    

    jetzt den Stil betreffend
    ach ja weil jemand auf der 1.Seite über goto geschimpft hat ich find goto schon genial da kann man so schön brutal sein findet ihr nicht
    🙂 🙂 🙂 🙂 🙂 🙂 🙂
    goto 4 ever
    rülps--- tschuldigung 😮



  • volkardus schrieb:

    Master-of-Scare schrieb:

    sollte jedoch dabei auch noch kurz sein...

    keine bange, die wird sehr kurz. schau in dein c-buch unter dem stichwort arrays nach. das vereinfacht die lange variablenliste, und du kannst dich dann auf's wesentliche kondensieren.

    LOL *scnr* *duckundweg*



  • Dann müsste das etwa doch so aussehen, oder? :

    void WriteCoded(char *);
    void ReadCoded(char *);
    void verschluesseln(char *, int);
    const int schluessel=0xAA; 
    
    void verschluesseln (char *daten, int anz) 
    { 
      while(anz--) 
        if(daten[anz]!=0 and daten[anz]!=schluessel) 
          daten[anz]=daten[anz]^schluessel; 
    }
    
    void WriteCoded(char *highpl) 
    { 
    unsigned int len; 
    len=strlen(highpl); // hier nicht ein uncoded string somit funktioniert strlen; 
    verschluesseln (highpl,len) ; // jetzt verschlüsselt 
    write(fp,len,sizeof(unsigned int)); 
    write(fp,highpl,len*(sizeof(char))); 
    } 
    
    void ReadCoded(char *highpl) 
    { 
    read(fp,len,sizeof(unsigned int)); 
    read(fp,highpl,len*(sizeof(char))); 
    verschluesseln (highpl,len) ; // jetzt entschlßsselt 
    } 
    
    struct highpl 
    { 
      int  punkt; 
      char name[4]; /* der name soll nur 3 zeichen lang sein, */ 
    }; 
    
    void 
    highscore_lesen (struct highpl *highpl) 
    { 
    
      FILE *pfile; 
      int i;
    
      pfile=fopen("C:\\system.zrx","r"); 
    
      for(i=0; i<8; i++) 
        fscanf(pfile,"%i %s",&highpl[i].punkt,highpl[i].name); 
    
      fclose(pfile); 
    } 
    
    void 
    highscore_schreiben (struct highpl *highpl) 
    { 
      FILE *pfile; 
      int i; 
    
      pfile=fopen("C:\\system.zrx","w"); 
    
      for(i=0; i<8; i++) 
        fprintf(pfile,"%i %s\n",highpl[i].punkt,highpl[i].name); 
    
      fclose(pfile); 
    } 
    
    void 
    highscore_einfuegen (struct highpl *highpl, int punkt, char *name) 
    { 
      int pos,i; 
    
      /* bestimme position, an der der neue highscore eingefügt werden soll */ 
      for(pos=0; pos<8; pos++) 
        if(punkt>highpl[pos].punkt) 
          break; 
    
      if(pos==8) return; /* highscore kleiner als letzter platz => keine änderung */ 
    
      /* schiebe highscores nach unten */ 
      for(i=7; i>pos; i--) 
      { 
        highpl[i].punkt=highpl[i-1].punkt; 
        strcpy(highpl[i].name,highpl[i-1].name); 
      } 
    
      /* füge neuen highscore ein */ 
      highpl[pos].punkt=punkt; 
      strcpy(highpl[pos].name,name); 
    } 
    
    void 
    highscore_eingeben (int punkte) 
    { 
      struct highpl highpl[8]; 
      char name[256];
    
      highscore_lesen(highpl); 
    
      if(punkte>=highpl[7].punkt) 
      { 
        printf("NEUER HIGHSCORE!\n\n"); 
        printf("Ihre Punktzahl ist: %i\n",punkte); 
    
        printf("Ihr Name (max. 3 Zeichen): "); 
        scanf("%s",name); 
        name[3]='\0'; /* auf 3 zeichen kürzen */ 
        printf("\n\n"); 
    
        highscore_einfuegen(highpl,punkte,name);
    
        WriteCoded(highpl);
    
        highscore_schreiben(highpl); 
      } 
    } 
    
    void 
    highscore_ausgeben (void) 
    { 
      struct highpl highpl[8]; 
      int i; 
    
      highscore_lesen(highpl); 
    
      ReadCoded(highpl);
    
      for(i=0; i<7; i++) 
        printf(" %i. %i Pkt %s\n",i+1,highpl[i].punkt,highpl[i].name); 
    
      printf(" 7,5. %i Pkt\n",highpl[8].punkt);
    }
    

    PS: Der Text ist bisher nur leicht verändert, gerade beim ausgeben, da ich bisher net groß zeit hatte.



  • brav hast du das gemacht 😃

    so waere das aber NOCH besser:

    void WriteCoded(char *);
    void ReadCoded(char *);
    void verschluesseln(char *, int);
    const int schluessel=0xAA;
    
    void verschluesseln (char *daten, int anz)
    {
      while(anz--)
        if(daten[anz]!=0 and daten[anz]!=schluessel)
          daten[anz]=daten[anz]^schluessel;
    }
    
    void WriteCoded(char *highpl)
    {
    unsigned int len;
    len=strlen(highpl); // hier nicht ein uncoded string somit funktioniert strlen;
    verschluesseln (highpl,len) ; // jetzt verschlüsselt
    write(fp,len,sizeof(unsigned int));
    write(fp,highpl,len*(sizeof(char)));
    }
    
    void ReadCoded(char *highpl)
    {
    read(fp,len,sizeof(unsigned int));
    read(fp,highpl,len*(sizeof(char)));
    verschluesseln (highpl,len) ; // jetzt entschlßsselt
    }
    
    struct highpl
    {
      int  punkt;
      char name[4]; /* der name soll nur 3 zeichen lang sein, */
    };
    
    void
    highscore_lesen (struct highpl *highpl)
    {
    
      FILE *pfile;
      int i;
    
      pfile=fopen("C:\\system.zrx","r");
    
      for(i=0; i<8; i++)
        fscanf(pfile,"%i %s",&highpl[i].punkt,highpl[i].name);
    
      fclose(pfile);
    }
    
    void
    highscore_schreiben (struct highpl *highpl)
    {
      FILE *pfile;
      int i;
    
      pfile=fopen("C:\\system.zrx","w");
    
      for(i=0; i<8; i++)
        fprintf(pfile,"%i %s\n",highpl[i].punkt,highpl[i].name);
    
      fclose(pfile);
    }
    
    void
    highscore_einfuegen (struct highpl *highpl, int punkt, char *name)
    {
      int pos,i;
    
      /* bestimme position, an der der neue highscore eingefügt werden soll */
      for(pos=0; pos<8; pos++)
        if(punkt>highpl[pos].punkt)
          break;
    
      if(pos==8) return; /* highscore kleiner als letzter platz => keine änderung */
    
      /* schiebe highscores nach unten */
      for(i=7; i>pos; i--)
      {
        highpl[i].punkt=highpl[i-1].punkt;
        strcpy(highpl[i].name,highpl[i-1].name);
      }
    
      /* füge neuen highscore ein */
      highpl[pos].punkt=punkt;
      strcpy(highpl[pos].name,name);
    }
    
    void
    highscore_eingeben (int punkte)
    {
      struct highpl highpl[8];
      char name[256];
    
      highscore_lesen(highpl);
    
      if(punkte>=highpl[7].punkt)
      {
        printf("NEUER HIGHSCORE!\n\n");
        printf("Ihre Punktzahl ist: %i\n",punkte);
    
        printf("Ihr Name (max. 3 Zeichen): ");
        scanf("%s",name);
        name[3]='\0'; /* auf 3 zeichen kürzen */
        printf("\n\n");
    
        highscore_einfuegen(highpl,punkte,name);
    
        WriteCoded(highpl);
    
        highscore_schreiben(highpl);
      }
    }
    
    void
    highscore_ausgeben (void)
    {
      struct highpl highpl[8];
      int i;
    
      highscore_lesen(highpl);
    
      ReadCoded(highpl);
    
      for(i=0; i<7; i++)
        printf(" %i. %i Pkt %s\n",i+1,highpl[i].punkt,highpl[i].name);
    
      printf(" 7,5. %i Pkt\n",highpl[8].punkt);
    }
    


  • kann es sein oder finde ich da keinen unterschied?



  • Formatierung.
    Gute Gelegenheit für den längsten Spam-Post 2k5 😃



  • naja, bei mir tut der quellcode so absolut net, da sind ewig viele fehlermeldungen



  • damit das highscore-trauerspiel ein ende findet 😃

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    struct highpl 
    { 
      int  punkt; 
      char name[4]; /* soll der name nur 3 zeichen lang sein, */ 
                    /* dann brauchts auch nicht mehr platz */ 
    } highpl[8]; 
    
    void
    verentschluesseln (unsigned char *daten, int anz)
    {
      while(anz--)
        daten[anz]^=0xAA;
    }
    
    void
    highscore_auf_defaults_setzen (void)
    {
      int i;
    
      for(i=0; i<8; i++)
      {
        highpl[i].punkt=0;
        strcpy(highpl[i].name,"---");
      }
    }
    
    void 
    highscore_lesen (void) 
    { 
      FILE *pfile; 
    
      /* b in "rb" steht für binär */
      /* verhindert automatische konvertierung von cr-nl nach nl */
      pfile=fopen("C:\\system.zrx","rb"); 
    
      if(pfile)
      {
        fread(highpl,sizeof(struct highpl),8,pfile);
        verentschluesseln((unsigned char*)highpl,8*sizeof(struct highpl));
    
        fclose(pfile); 
      }
      else highscore_auf_defaults_setzen();
    } 
    
    void 
    highscore_schreiben (void) 
    { 
      FILE *pfile; 
    
      pfile=fopen("C:\\system.zrx","wb");
    
      verentschluesseln((unsigned char*)highpl,8*sizeof(struct highpl));
      fwrite(highpl,sizeof(struct highpl),8,pfile);
      verentschluesseln((unsigned char*)highpl,8*sizeof(struct highpl));
    
      fclose(pfile); 
    } 
    
    void 
    highscore_einfuegen (int punkt, char *name) 
    { 
      int pos,i; 
    
      /* bestimme position, an der der neue highscore eingefügt werden soll */ 
      for(pos=0; pos<8; pos++) 
        if(punkt>=highpl[pos].punkt) 
          break; 
    
      if(pos==8) return; /* highscore kleiner als letzter platz => keine änderung */ 
    
      /* schiebe highscores nach unten */ 
      for(i=7; i>pos; i--) 
      { 
        highpl[i].punkt=highpl[i-1].punkt; 
        strcpy(highpl[i].name,highpl[i-1].name); 
      } 
    
      /* füge neuen highscore ein */ 
      highpl[pos].punkt=punkt; 
      strcpy(highpl[pos].name,name); 
    } 
    
    void 
    highscore_eingeben (int punkte) 
    { 
      char name[256]; 
    
      highscore_lesen(); 
    
      if(punkte>=highpl[7].punkt) 
      { 
        printf("NEUER HIGHSCORE!\n\n"); 
        printf("Ihre Punktzahl ist: %i\n",punkte); 
    
        printf("Ihr Name (max. 3 Zeichen): "); 
        scanf("%s",name); 
        name[3]='\0'; /* auf 3 zeichen kürzen */ 
        printf("\n\n"); 
    
        highscore_einfuegen(punkte,name); 
        highscore_schreiben(); 
      } 
    } 
    
    void 
    highscore_ausgeben (void) 
    { 
      int i; 
    
      highscore_lesen(); 
    
      for(i=0; i<8; i++) 
        printf(" %i. %i Pkt %s\n",i+1,highpl[i].punkt,highpl[i].name); 
    }
    
    void
    main ()
    {
      highscore_ausgeben();
      highscore_eingeben(1000);
    }
    


  • Konfusius schrieb:

    void
    main ()
    

    Na, da hat aber einer den Standard nicht aufmerksam gelesen. Das heit doch wohl bitte

    int main(void)
    

    ...und am Ende das return 0; nicht vergessen.



  • 0xdeadbeef schrieb:

    ...und am Ende das return 0; nicht vergessen.

    Nirgends steht geschrieben dass main() eine return Anweisung benötigt:

    3.6.1 Main function [basic.start.main]
    1 A program shall contain a global function called main, which is the designated start of the program. It is
    implementation-defined whether a program in a freestanding environment is required to define a main
    function. [Note: in a freestanding environment, start-up and termination is implementation-defined; startup
    contains the execution of constructors for objects of namespace scope with static storage duration; termination
    contains the execution of destructors for objects with static storage duration. ]
    2 An implementation shall not predefine the main function. This function shall not be overloaded. It shall
    have a return type of type int, but otherwise its type is implementation-defined. All implementations
    shall allow both of the following definitions of main:
    int main() { /* ... / }
    and
    int main(int argc, char
    argv[]) { /* ... */ }
    In the latter form argc shall be the number of arguments passed to the program from the environment in
    which the program is run. If argc is nonzero these arguments shall be supplied in argv[0] through
    argv[argc-1] as pointers to the initial characters of null-terminated multibyte strings (NTMBSs)
    (17.3.2.1.3.2) and argv[0] shall be the pointer to the initial character of a NTMBS that represents the
    name used to invoke the program or "". The value of argc shall be nonnegative. The value of
    argv[argc] shall be 0. [Note: it is recommended that any further (optional) parameters be added after
    argv. ]
    3 The function main shall not be used (3.2) within a program. The linkage (3.5) of main is
    implementation-defined. A program that declares main to be inline or static is ill-formed. The
    name main is not otherwise reserved. [Example: member functions, classes, and enumerations can be
    called main, as can entities in other namespaces. ]
    4 Calling the function
    void exit(int);
    declared in <cstdlib> (18.3) terminates the program without leaving the current block and hence without
    destroying any objects with automatic storage duration (12.4). If exit is called to end a program during
    the destruction of an object with static storage duration, the program has undefined behavior.
    5 A return statement in main has the effect of leaving the main function (destroying any objects with automatic
    storage duration) and calling exit with the return value as the argument. If control reaches the end
    of main without encountering a return statement, the effect is that of executing
    return 0;



  • also bei mir tuts schon so wunderbar außer das ich eben void main zu int main machen musste da ich mit dem dev-c++ arbeite.

    also, muss dann noch paar kleinigkeiten für mich selber ändern, thx a lot, cya



  • @FireFlow: Warum zitierst du im C-Forum den C++-Standard?



  • @0xdeadbeef
    Auch wenn er die Deklaration von C++ bekommen hat, 😋 gute reine C-Bücher sind inzwischen selten. hat er dennoch recht. Wenn ich eine returnwert deklariere (oder deklarieren muss)sollte ich ihn auch benutzen / initialisieren.

    @--linuxuser--
    Form ist was schönes, dafür gibt es auch tolle code reformatierer
    ich persönlich mag den Stil der die öffnende Klammern unmittelbar dahinter und die
    schließende Klammer auf eine eigene Zeile schreibt überhaupt nicht.

    Bevor ich mich aber um die Form kümmere, ist mir der Inhalt wichtiger (der Anschiss ist aber trotzdem angekommen).
    Ich hatte leider einen entscheidenden Kommentar vergessen

    // Diese Routinn sind wegen der Übersichtlichkeit ohne Errorhandling
    // Dies muss noch zusätzlich eingebaut werden.
    

    Auch main sollte im Erfolgsfall eine 0 und sonst einen von 0 verschiedenen Wert liefern, womit wir wieder bei der return Wert Frage von main sind
    ➡ IMHO main hat immer einen Wert zu liefern

    P.S. zum Formatieren empfehle ich aus persönlicher Erfahrung astyle und zwar in der Form

    astyle --style=ansi %1
    

    👍 Was ist astyle?
    Artistic Style 1.17.0-dev
    A Free, Fast and Small Automatic Formatter
    for C, C++, C#, and Java Source Codes

    http://astyle.sourceforge.net



  • @PAD

    PAD schrieb:

    @0xdeadbeef
    @--linuxuser--
    Form ist was schönes, dafür gibt es auch tolle code reformatierer
    ich persönlich mag den Stil der die öffnende Klammern unmittelbar dahinter und die
    schließende Klammer auf eine eigene Zeile schreibt überhaupt nicht.

    Bevor ich mich aber um die Form kümmere, ist mir der Inhalt wichtiger (der Anschiss ist aber trotzdem angekommen).
    http://astyle.sourceforge.net

    im endeffekt ist es ja eh scheiß egal welchen style man anwendet aber waenn ich dich richtig verstehe magst du folgendes nicht:

    int xxx(){
      //anweisung
    }//end xxx
    

    dann muss folglich dein style sein:

    int xxx()
    {
       /*anweisung*/}
    

    da du die schließ3nde klammer nicht in eine eigene zeile setzt und die öffnende nicht "direkt dahinter"
    also ich weiß nicht ob das sooo intelligent ist aber jeder hat seine volieben
    andere schreibens weider so:

    int xxx(){/*anweisung*/}
    

    da ist deiner wieder besser aber das wichtigste sind einrückungen ohne die kann man einen code (find ich) ziemlich unlaeserlich gestalten



  • @--linuxuser--

    Der Stil den ich bevorzuge ist
    int xxx()
    {
    //anweisungen
    }//end xxx

    Der wird durch das Programm astyle mit dieser Option erzeugt,
    Das schöne ist man kann in jeden der Stile auch umformatieren!!

    --style=ansi // Mein bevorzugter Stil
    ANSI style formatting/indenting.

    --style=kr // Dein bevorzugter Stil
    Kernighan&Ritchie style formatting/indenting.

    Aber wie schon gesagt 🙂 der Anschiss ist angekommen 🙂


Anmelden zum Antworten