1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

qsort problem

  • AlexW
  • 17. April 2009 um 20:51
  • Unerledigt
  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 20:51
    • #1

    Guten Abend zusammen

    Ich habe ein kleines Problem mit der qsort Funktion
    bin ziemlicher Einsteiger beim Programmieren und gerade mit einer qsort-Funktion beschäftigt die Dateiinhalte sortieren soll nun tritt folgendes Problem auf:

    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int sort_down(const void *p1, const void *p2)
    {
       return (strcmp(* (char * const *) p1, * (char * const *) p2) )* -1;
    }
    
    
    int sort_up(const void *p1, const void *p2)
    {
       return strcmp(* (char * const *) p1, * (char * const *) p2);
    }
    
    
    int
    main(int argc, char *argv[])
    {
        int j;
    
    
       qsort(&argv[1], argc - 1, sizeof(char *), sort_up);         //aufsteigend sortieren
       //qsort(&argv[1], argc - 1, sizeof(char *), sort_down);    //absteigend
    
    
       for (j = 1; j < argc; j++)
            puts(argv[j]);
        exit(EXIT_SUCCESS);
    }
    Alles anzeigen
    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define ANZ 5
    
    
    static int
    sort(const void *p1, const void *p2)
    {
    
    
       return strcmp(* (char * const *) p1, * (char * const *) p2);
    }
    
    
    int
    main()
    {
       int i;
       char array[ANZ];
    
    
        array[0] = 7;   
        array[1] = 5;
        array[2] = 2;
        array[3] = 3;
        array[4] = 1;
    
    
           qsort(array, ANZ, sizeof(char *), sort);
    
         for (i = 0; i < ANZ; i++)
            printf("%c\n", array[i]);
    
        exit(EXIT_SUCCESS);
    }
    Alles anzeigen


    1) Ich kann über Argumentzeile Zahlen und Buchstaben auf und absteigend sortieren (Code 1)
    wieso funktioniert das nicht mit einem Array (Code 2)

    2) Wie sortier ich überhaupt eine Datei? Speicher ich den Dateiinhalt in ein Array das ich dann sortiere oder geht das auch einfacher?


    bin für jeden Vorschlag dankbar

    mfg Alex

  • Paulchen
    1
    Paulchen
    Gast
    • 17. April 2009 um 21:01
    • #2

    Im ersten Fall hast du sortierst du etwas vom Typ char **, im zweiten Fall vom Typ char *.

    Im zweiten Fall speicherst du außerdem ganze Zahlen in ein char-Array. strcmp sieht diese Zahlen dann als Strings an, findet kein abschließendes '\0' => Chaos bzw. Segmentation fault.

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:10
    • #3

    Danke für die schnelle Antwort

    wie kann ich denn Segmention Fault beim 2. Fall vermeiden?
    bzw

    Code
    array[0] = "a"; würde auch nicht funktionieren oder?


    wie krieg ich das mit EOS gebacken?

    mfg Alex

  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 17. April 2009 um 21:11
    • #4

    Schreibs einfach um

    C
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int compare(const void *a, const void *b)
    {
        return (*(char*)a - *(char*)b);
    }
    
    
    int main ()
    {
        char array1[] = { 'a', 'c', 'b'};
        char array2[] = { 1,2,3 };
    
        qsort (array1, 3, sizeof(char), compare);
        qsort (array2, 3, sizeof(char), compare);
    
        int c;
        for (c=0; c<3; ++c)
            printf ("%c ", array1[c]);
    
        for (c=0; c<3; ++c)
            printf ("%d ", array2[c]);
    
        return 0;
    }
    Alles anzeigen

    Und mit %c bei deinen integralen Werten wirst du nicht viel sehen - siehe Ascii Tabelle :winking_face:

    lg

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:20
    • #5

    danke vielmals :thumb:

    und wie kann ich das ganze jetzt auf eine Datei gesehen anwenden?
    zu mal ich da ja nicht mit %c und %d ausgebn kann sondern die ganze Datei betrachten muss, gibt es da ne Möglichkeit?

    oder kann ich eben den Dateiinhalt in ein Array speichern dann müsste ich aber irgendwie zwischen den Dateitypen unterscheiden

    Einmal editiert, zuletzt von AlexW (17. April 2009 um 21:25)

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:23
    • #6

    also was ich bisher habe

    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    #define FALSE 0
    #define TRUE  1
    
    
    int main (int argc, char *argv[])
    {
    
    
    FILE* f;
    char c;
    
    
    if(argc < 2) 
       {
        fprintf(stderr, "Fehlerhafe Eingabe");
             return EXIT_FAILURE;
    
       }
    
       else if(getopt(argv[1],"h") == TRUE ) 
       {
          help();
          exit(EXIT_SUCCESS);
       }
    
    
       else if(getopt(argv[1],"t") == TRUE ) 
       {
    
        f = fopen(argv[2], "r");
    
        //qsort(f, ANZ, sizeof(char *), compare);    
    
        if (f == NULL)
            fprintf(stderr, "Datei %s konnte nicht geoeffnet werden", argv[2]);
        else
        {
        while((c=getc(f)) != EOF)
        putc(c, stdout);    
        }
    
          exit(EXIT_SUCCESS);
       }
    
    
    return 0;    
    
    
    }
    Alles anzeigen
  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 17. April 2009 um 21:32
    • #7

    Hmm. Was willst du genau machen? Du hast eine Datei mit Werten (Strings und inigerale Typen) und willst die einlesen und sortieren?

    EDIT: Bzw. integrale Typen in der Datei ja auch mehr oder weniger Strings sind :winking_face:

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:36
    • #8

    eine beliebige (binär)Datei sortieren entweder auf- oder absteigend
    wobei ich mir nicht im klaren bin wie man Sonderzeichen (,;?=) sortieren kann (außer vl nach ASCII)

  • skinner33
    9
    skinner33
    Mitglied
    Reaktionen
    22
    Punkte
    862
    Beiträge
    168
    • 17. April 2009 um 21:38
    • #9

    Du könntest auch einfach mal in den passenden Thread im Sysprog Forum schauen

    µC-Leitung

  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 17. April 2009 um 21:44
    • #10

    Du musst den Wert in der Datei ja irgendwie interpretieren. Also zu sagen was da jetzt für ein Typ steht geht ohne weiteres nicht.
    Array kannst verwenden oder wenns online gehen muss z.B. 2-4 Baum (also wenn du es bearbeiten können musst o.ä.)

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:46
    • #11
    Zitat von skinner33

    Du könntest auch einfach mal in den passenden Thread im Sysprog Forum schauen

    ok hätt ich doch besser genauer geschaut
    danke werd mir das mal zu Gemüte führen

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:48
    • #12
    Zitat von damike

    Du musst den Wert in der Datei ja irgendwie interpretieren. Also zu sagen was da jetzt für ein Typ steht geht ohne weiteres nicht.
    Array kannst verwenden oder wenns online gehen muss z.B. 2-4 Baum (also wenn du es bearbeiten können musst o.ä.)

    wenn ich jetzt ne beliebige Datei hätte (einfaches bsp)

    Zitat

    defacb34tz1

    könnte ich da einfach jedes Zeichen als "string" verwenden und sortieren wies mit argc, argv schon funktioniert hat?

  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 17. April 2009 um 21:56
    • #13

    Puh. Kann man pauschal imo nicht beantworten - muss allerdings sagen, dass ich die Aufgabenstellung auch nicht genau kenn. Wenn readable chars geschrieben wurden dann nimm meine Version - wenn z.B. 6er Zeichenblöcke sind deine. Hab zu dem oben genannten Forum keinen Zugriff - kanns dir daher auch nicht genau sagen :winking_face:

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:58
    • #14

    nja danke auf jeden Fall mal
    jetzt hab ich eh das Wochenende Zeit und werd mir das alles mal in Ruhe anschauen mal schauen was dabei rauskommt

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 07:47
    • #15

    http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

    Mach's so wie in dem Beispielprogramm beschrieben. Nicht als String nehmen, sondern als Zeichen.

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 08:38
    • #16
    Zitat von Adok

    http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

    Mach's so wie in dem Beispielprogramm beschrieben. Nicht als String nehmen, sondern als Zeichen.

    da isses doch nur mit integers
    das funktioniert doch mit anderen Zeichen nicht oda versteh ich da grad was nicht

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 09:00
    • #17

    Zeichen (char) sind nichts Anderes als Integers.
    Du könntest auch schreiben:

    Code
    int integerVariable = 'A';

    Das ist ebenso möglich wie:

    Code
    char zeichenVariable = 255;

    Alles klar?

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 09:07
    • #18

    ja soweit is mir schon klar
    aber wenn ich mit dem qsort jetztdurch ne datei fege (Text) dann beachtet er doch nicht den ascii oda?

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 10:46
    • #19

    Eine Textdatei ist wie eine Zeichenkette eine Ansammlung von Zeichen, die durch ihre ASCII-Codes repräsentiert werden.

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 11:59
    • #20

    hab jetzt wieder auf meinen erste versuch mit argc argv zurückgegriffen und werd das über 2d array in ein qsort für Dateien ummodeln

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung