pointerarray übergeben



  • hallo!

    ich hab ein struct array mit namen und alter, das lass ich mir dann von qsort sortieren...geht alles...jetzt möchte ich ein pointerarray auf das structarray zeigen lassen (jeder pointer auf ein array) und dann dieses pointerarray sortieren geht irgendwie nicht....wobei er glaub ich nicht mal in die vergleichsfunktion hineingeht

    mein code:

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct
    {
     char name[101];
     int alter;
    
    }PERSON;
    
    int vglf(const void *p,const void *q);
    int vglpf(const void *p, const void *q);
    
    int main()
    {
     int i=0;
    
     PERSON f[5]={"Karl",40,"Franz",50,"Michael",18,"Franz",45,"Thomas",15},*pf[5];
    
     clrscr();
    
     for(i=0;i<5;i++)
     {
      pf[i]=(PERSON *) calloc(1,sizeof(PERSON));  //feld umkopieren
      strcpy(pf[i]->name,f[i].name);
      pf[i]->alter=f[i].alter;
      printf("Name: %s Alter: %d\n",f[i].name,f[i].alter); //normales feld ausgeben
     }
    
     qsort(f,sizeof(f)/sizeof(f[0]),sizeof(f[0]),vglf);  //feld sortieren
    
     putc('\n',stdout);
    
     for(i=0;i<5;i++)
     {
      printf("Name: %s Alter: %d\n",f[i].name,f[i].alter); //sort. feld ausgeben
     }
    
     putc('\n',stdout);
    
     for(i=0;i<5;i++)
     {
      printf("Name: %s Alter: %d\n",pf[i]->name,pf[i]->alter); //pointerarray ausgeben
     }
    
     qsort(pf,sizeof((*pf))/sizeof((*pf)[0]),sizeof((*pf)[0]),vglpf); //sortieren
    
     putc('\n',stdout);
    
     for(i=0;i<5;i++)
     {
      printf("Name: %s Alter: %d\n",pf[i]->name,pf[i]->alter); //sort. ausgeben
     }
    
     getch();
    
     return 0;
    }
    
    int vglf(const void *p,const void *q)
    {
     const PERSON *a=(const PERSON *)p;  //von void * auf PERSON * casten
     const PERSON *b=(const PERSON *)q;
    
     if(!(strcmp(a->name,b->name)))  //nach namen vergleichen
     {
      return (a->name-b->name);      //wenn gleich nach alter
     }
     else
     {
      return (strcmp(a->name,b->name));  
     }
    
    }
    
    int vglpf(const void *p, const void *q)
    {
     const PERSON **a=(const PERSON **)p;  //von void * nach PERSON ** casten
     const PERSON **b=(const PERSON **)q;  //
    
     printf("\n\n%s\n\n",(*p)->name);    //wird nicht ausgegeben ??? 
    
     if(!(strcmp((*a)->name,(*b)->name))) //vergleich der namen
     {
      return ((*a)->name-(*b)->name);  //wenn gleich dann alter
     }
     else
     {
      return (strcmp((*a)->name,(*b)->name));
     }
    
    }
    

    immer wenn ich dachte jetzt kenn ich mich komplett aus mit den zeigern, dann kam sowas....

    mfg



  • Du machst Dir die Sache zu kompliziert. Hier mal meine Lösung, um ein Pointer-Array zu sortieren:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct
    {
      char name[101];
      int alter;
    }PERSON;
    
    int cmp_fct(const void *, const void *);
    
    int main(void)
    {
      int i=0;
      PERSON f[5]={"Karl",40,"Franz",50,"Michael",18,"Franz",45,"Thomas",15};
      PERSON *pf[5] = { f, f+1, f+2, f+3, f+4 };  /* Zeiger auf die Einträge */
    
      qsort(pf, sizeof pf / sizeof pf[0], sizeof pf[0], cmp_fct);
    
      for(i=0;i<5;i++)
        printf("Name: %s Alter: %d\n",pf[i]->name,pf[i]->alter); //normales feld ausgeben
    
      return 0;
    }
    
    int cmp_fct(const void *a, const void *b)
    {
        PERSON **pa = (PERSON **) a, **pb = (PERSON **) b;
    
        /* return (*pa)->alter - (*pb)->alter; */
        return strcmp( (*pa)->name, (*pb)->name );
    }
    

    Vielleicht hilft Dir das weiter.

    [ Dieser Beitrag wurde am 24.10.2002 um 13:11 Uhr von mady editiert. ]



  • hmm...ich meins jetzt soweit abgeändert, das ich das pointerarray auch gleich bei der deklaration initialisiere (mit den elementen des normalen feldes)....jetzt funktioniert es....der einzige unterschied ist doch aber, das die pointer jetzt auf die feldelemente zeigen und nicht auf extra reservierten speicher, in den die feldelemente hineinkopiert wurden....das dürfte doch keinen unterschied machen oder?

    mfg



  • Naja ... der Vorteil ist doch, dass wenn ich schon Pointer auf irgendwelche (größeren) Objekte im Speicher habe, ich einfach die Pointer umsortiere und somit diese Objekte nicht rumschieben muss (geht schneller). Zudem spar' ich mir noch Speicher und die Rumkopiererei.

    In anderen Fällen, z.B. ein Array mit int-Werten würde man das natürlich nicht so machen sondern direkt sortieren.



  • das is schon klar, um das ist es mir auch gar nicht gegangen....ich meine ja nur das es doch rein theoretisch keinen unterschied machen sollte, ob die pointer jetzt auf zusätzlichen speicher zeigen (wo ja das selbe drinn steht wie im original) oder auf das original.....aber wie man sieht is da anscheinend doch ein unterschied, sonst hätte ja meine erste version auch funktioniert

    mfg


Anmelden zum Antworten