Dateizugriff und Sortierung von 2 Dimensionalem Array in ANSI C



  • mit structs kenn ich mich aber garnicht aus ^^ hab bis jetzt nur mit arrays gearbeitet...

    und ja...da woltle ich das vorgefertigte nehmen...



  • Schade, dass du mit structs noch nichts gemacht hast (solltest du unbedingt mal ;)). Mit structs würdest du dich leichter tun. Du bräuchtest ohne struct übrigens sogar ein 3 Dimensionales oder wahlweise 2 2D-Arrays, was ziemlich umständlich ist.

    Wenn du die vorgefertigte Funktion nimmst, dann brauchst du eigentlich nur eine Funktion anlegen, die den Vergleich macht und diese Funktion dann der quicksort-Funktion als Parameter übergeben bzw. einen Zeiger auf die Funktion, wenn es die quicksort-Funktion ist, die ich meine. Kannst du evtl. mal die Deklaration posten?

    Die struct in deinem Fall würde übrigens in etwa so aussehen:

    typedef struct
    {
       double punkte;
       char name[11];
    } eintrag;
    

    Verwenden kannst du sie so:

    ...
    eintrag highscore[12]; //Deklaration + Definition (@SideWinder ;))
    ...
    //ersten Eintrag füllen
    highscore[0].punkte = 10000.00;
    strcpy(highscore[0].name, "Spieler");
    ...
    

    Viel Spaß und Erfolg!



  • Also meine Deklaration dürfte das hier sein 😉

    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef struct HIGHSCORE   
    
    { 
       char cName[11];
       double dScores; 
    
    } Scores;
    
    int main(char cName1[11], char cName2[11], double dScoresP1, double dScoresP2)
    {
    int i;
    FILE *File;
    

    cName enthält den Namen des jeweiligen Spielers
    dScore die jeweiligen Punkte 😉



  • int main(char cName1[11], char cName2[11], double dScoresP1, double dScoresP2)...
    

    sag mal welcher compiler frisst das eigentlich... da ich kein standardgläubiger bin weiss ich nicht was alles erlaubt ist, aber das sollte imho noch nicht mal ein weit vom standard entfernter compiler fressen oder?



  • Das mit den Parametern bei main() geht leider so nicht. Die Parameter für main() sehen so aus:

    int main(int argc, char *argv[])
    

    In argv stehen alle übergebenen Parameter. Beispiel:

    C:\> programm.exe das sind Parameter
    

    entspricht bei argv

    argv[0] //= "programm.exe" (evtl sogar mit kompletten Pfad)
    argv[1] //= "das"
    argv[2] //= "sind"
    argv[3] //= "Parameter"
    

    in argc ist die Anzahl der Inhalte in argv enthalten. Beim Beispiel also 4.

    Eigentlich hat mich aber eher die Deklaration (nur Rückgabewert, Name und Parameter) des quicksort interesiert :).



  • http://www.mingw.org/
    😉 😃 😃 😉

    der frisst das 😉

    ne, aber das ist auch nicht die main, sondern eine funktion die aufgerufen wird, von nem anderen proggie...nur hab ich DIESES noch nicht da reingepflantzt 😉



  • Dann ists natürlich in Ordnung 😉



  • #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef struct HIGHSCORE   
    
    { 
       char cName[11];
       double dScores; 
    
    } Scores;
    
    int main()
    {
    
    Scores HIGHSCORE[12]; 
    
    FILE *File; 
    
    char cName1[11];
    char cName2[11];
    double dScoresP1;
    double dScoresP2;
    
    //---------Zu Testzwecken vordefinierte Werte
    strcpy(cName1, "Player");
    strcpy(cName2, "Bender");
    dScoresP1 = 450;
    dScoresP2 = 500;
    //-------------------------------------------
    
    HIGHSCORE[11].dScores = dScoresP1;
    HIGHSCORE[12].dScores = dScoresP2; 
    strcpy(HIGHSCORE[11].cName, cName1); 
    strcpy(HIGHSCORE[12].cName, cName2);
    
    File=fopen("highscore.txt","r+"); 
    if(File==NULL)
    return -1;
    
    fseek(File,0,SEEK_END);
    fprintf(File, "11");
    fprintf(File, HIGHSCORE[11].dScores); <---Fehler :open_mouth:
    fprintf(File, HIGHSCORE[11].cName);
    fprintf(File, "\r");
    fprintf(File, "12");
    fprintf(File, HIGHSCORE[12].dScores); <---Fehler :open_mouth:
    fprintf(File, HIGHSCORE[12].cName);
    printf(File, "\r");
    
    fclose(File);
    
    return 0;
    
    }
    

    Wollte mal n bissl erstmal das schreiben testen, aber der compiler bricht an den markierten stellen immer ab

    Fehlermeldung:

    C:\TEST\main.c
    [Warning] In function `main':
    55 C:\TEST\main.c
    incompatible type for argument 2 of `fprintf'
    59 C:\TEST\main.c
    incompatible type for argument 2 of `fprintf'
    61 C:\TEST\main.c
    [Warning] passing arg 1 of `printf' from incompatible pointer type
     C:\TEST\Makefile.win
    [Build Error]  [main.o] Error 1
    

    Hab direkt auch mal nachgeschaut, wegen den QSort Parametern:

    Performs a quick sort.
    
    void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
    Routine 	Required Header 	Compatibility
    qsort 	<stdlib.h> and <search.h> 	ANSI, Win 95, Win NT
    
    For additional compatibility information, see Compatibility in the Introduction.
    
    Libraries
    LIBC.LIB 	Single thread static library, retail version
    LIBCMT.LIB 	Multithread static library, retail version
    MSVCRT.LIB 	Import library for MSVCRT.DLL, retail version
    
    Return Value
    
    None
    
    Parameters
    
    base
    
    Start of target array
    
    num
    
    Array size in elements
    
    width
    
    Element size in bytes
    
    compare
    
    Comparison function
    
    elem1
    
    Pointer to the key for the search
    
    elem2
    
    Pointer to the array element to be compared with the key
    
    Remarks
    
    The qsort function implements a quick-sort algorithm to sort an array of num elements, each of width bytes. The argument base is a pointer to the base of the array to be sorted. qsort overwrites this array with the sorted elements. The argument compare is a pointer to a user-supplied routine that compares two array elements and returns a value specifying their relationship. qsort calls the compare routine one or more times during the sort, passing pointers to two array elements on each call:
    
    compare( (void *) elem1, (void *) elem2 );
    
    The routine must compare the elements, then return one of the following values:
    Return Value 	Description
    < 0 	elem1 less than elem2
    0 	elem1 equivalent to elem2
    > 0 	elem1 greater than elem2
    
    The array is sorted in increasing order, as defined by the comparison function. To sort an array in decreasing order, reverse the sense of “greater than” and “less than” in the comparison function.
    

    also komplizierter gehts ja nimmer 😕

    Ich hoffe das war es, was dich interessierte ^^

    falls nicht:

    kA was du meinst 🙂 Es soll einfach nach den Punkten sortiert werden...



  • du musst dir quasi nur ne vergleichsfunktion schreiben den rest macht qsort für dich...

    struct mystruct {
      char *text;
      int anotherattrib;
    }
    
    int cmp_mystruct(void *p, void *q) {
      return strcmp(((struct mystruct*) p)->text, ((struct mystruct*) q)->text);
    }
    
    struct mystruct a[10];
    /* a füllen */
    qsort(a, 10, sizeof(struct mystruct), cmp_mystruct);
    


  • ok...soweit so gut...hat jemand ne idee bezüglich der fehlermeldung? 🙂



  • Du willst double-Zahlen in die Datei schreiben. Das geht bei fprintf genau wie bei den anderen printf-Funktionen mit dem Formatstring "%lf" (steht für long float).

    diesen Formatstring musst Du als zweites Argument an fprintf übergeben, also etwa so:

    fprintf(File, "%lf", HIGHSCORE[11].dScores);
    

    So sollte er den Code schlucken.
    qsort() funktioniert übrigens wirklich so: Du bastelst dir selber eine Vergleichsfunktion und übergibst deren Namen an qsort. Das macht dann den Rest für dich



  • @Ronin
    Ja genau das hatte ich gemeint wegen der quicksort-Funktion 🙂
    Wie man sie benutzt, hat dir ja Windalf schon gezeigt.

    Noch ein kleiner Hinweis. Vermeide es Variablennamen zu verwenden, die bereits als Typen benutzt werden. Das zieht speziell auf HIGHSCORE ab. Deine struct heißt bereits HIGHSCORE, daher ist es schlecht, dass du auch als Variablennamen HIGHSCORE verwendest.


Anmelden zum Antworten