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 :).
-
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.