Frage zum qsort

Schnelle objektorientierte, kompilierende Programmiersprache.
Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Frage zum qsort

Beitrag von Bruno » Do Dez 08, 2011 9:48 am

Hallo!

Ich möchte ein mehrdim. Array nach dem ersten Eintrag sortieren.

Mit diese Arrays klappt das wunderbar:

Code: Alles auswählen

int eindim_Array[100];
int zweidim_Array[100][2];
//[...]
qsort(eindim_Array,k,sizeof(int),cmp);
qsort(zweidim_Array,k,sizeof(int*),cmp);
Jetzt habe ich aus zweidim_Array[100][2] ein zweidim_Array[100][3] gemacht und dachte, daß würde jetzt genauso klappen.

Aber leider macht qsort hier nur Mist... Was mache ich hier falsch?

Ciao

Bruno
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum qsort

Beitrag von Xin » Do Dez 08, 2011 11:02 am

Bruno hat geschrieben:Hallo!

Ich möchte ein mehrdim. Array nach dem ersten Eintrag sortieren.

Mit diese Arrays klappt das wunderbar:

Code: Alles auswählen

int eindim_Array[100];
int zweidim_Array[100][2];
//[...]
qsort(eindim_Array,k,sizeof(int),cmp);
qsort(zweidim_Array,k,sizeof(int*),cmp);
Jetzt habe ich aus zweidim_Array[100][2] ein zweidim_Array[100][3] gemacht und dachte, daß würde jetzt genauso klappen.

Aber leider macht qsort hier nur Mist... Was mache ich hier falsch?
Es gibt keine zweidimensionalen Arrays.

Hier gibt es ein Array der Breite 100 ints und davon liegen zwei hintereinander.
Es geht also nicht um sizeof( int * ), sondern um sizeof( int[100] ).

zweidim_Array zeigt damit auf den ersten Eintrag des ersten Arrays.
Was ist k? Und was ist der erste Eintrag bei einem mehrdimensionalen Array?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: Frage zum qsort

Beitrag von Bruno » Do Dez 08, 2011 12:05 pm

Hallo!
Xin hat geschrieben:
Es geht also nicht um sizeof( int * ), sondern um sizeof( int[100] ).

zweidim_Array zeigt damit auf den ersten Eintrag des ersten Arrays.
Was ist k? Und was ist der erste Eintrag bei einem mehrdimensionalen Array?
Der Wert k bezeichnet die Anzahl der Werte im Array (siehe auch http://www.proggen.org/doku.php?id=c:lib:stdlib:qsort)

Hier ein kleiner Quellcode, der eigentlich tut was er soll:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int cmp(const void *ptr1, const void *ptr2) {
   if( *(int *)ptr1 < *(int *)ptr2 )
      return (-1);
   else if( *(int *)ptr1 > *(int *)ptr2 )
      return (1);
   else
      return (0);  /* Beide Elemente sind gleich */
}

int main (void)
{
int tmp1[10];
int tmp2[10][2];
int i = 0;

tmp2[0][0]= 2245;
tmp2[1][0]= 2245;
tmp2[2][0]=  235;
tmp2[3][0]= 2245;
tmp2[4][0]= 2245;
tmp2[5][0]=  400;
tmp2[6][0]= 4391;
tmp2[7][0]= 4391;
tmp2[8][0]=  400;
tmp2[9][0]= 4391;

tmp2[0][1]= 65907;
tmp2[1][1]= 65908;
tmp2[2][1]= 65909;
tmp2[3][1]= 65910;
tmp2[4][1]= 65911;
tmp2[5][1]= 65912;
tmp2[6][1]= 65913;
tmp2[7][1]= 65914;
tmp2[8][1]= 65915;
tmp2[9][1]= 65916;


  for( i = 0; i < 10; ++i ){
  tmp1[i]=tmp2[i][0];
  }
  printf( "\n1-dimArray:\n" );
  printf( "unsortierte Reihenfolge:\n" );
  for( i = 0; i < 10; ++i ){
    printf( "%d: %8d \n", i, tmp1[i] );
  }
 
  qsort( tmp1, 10, sizeof( int  ), cmp );
 
  printf( "\nsortierte Reihenfolge:\n" );
  for( i = 0; i < 10; ++i ){
    printf( "%d: %8d \n", i, tmp1[i] );
  }

  printf( "\n2-dimArray:\n" );
  printf( "unsortierte Reihenfolge:\n" );
  for( i = 0; i < 10; ++i ){
    printf( "%d: %8d %8d\n", i, tmp2[i][0], tmp2[i][1] );
  }
 
  qsort( tmp2, 10, sizeof( int * ), cmp );
 
  printf( "\nsortierte Reihenfolge:\n" );
  for( i = 0; i < 10; ++i ){
    printf( "%d: %8d %8d\n", i, tmp2[i][0], tmp2[i][1] );
  }
 
  return EXIT_SUCCESS;
}
Wenn ich sizeof(int[10]) einsetzte kommt qsort auch ins schleudern...

Und mit temp2[10][3] klappts leider auch nicht.
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum qsort

Beitrag von Xin » Do Dez 08, 2011 12:31 pm

Bruno hat geschrieben:Hallo!
Xin hat geschrieben:
Es geht also nicht um sizeof( int * ), sondern um sizeof( int[100] ).

zweidim_Array zeigt damit auf den ersten Eintrag des ersten Arrays.
Was ist k? Und was ist der erste Eintrag bei einem mehrdimensionalen Array?
Der Wert k bezeichnet die Anzahl der Werte im Array (siehe auch http://www.proggen.org/doku.php?id=c:lib:stdlib:qsort)
;-)

Ich wollte wissen, was Du angibst. ^^
Bruno hat geschrieben: Hier ein kleiner Quellcode, der eigentlich tut was er soll:
Der erstaunt mich gerade etwas, das kann eigentlich nicht sein.

Was sein kann ist, dass es nicht sizeof( int[10] ), sondern sizeof( int[2] ) wäre, wenn ich mich im Aufbau des Arrays vertue.

Daraus schlussfolgere ich, dass Du auf einem 64Bit-System arbeitest und der Code auf einem 32 Bit-System nicht zu korrekten Ergebnissen kommt.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: Frage zum qsort

Beitrag von Bruno » Do Dez 08, 2011 12:51 pm

Hallo!
Xin hat geschrieben:Was sein kann ist, dass es nicht sizeof( int[10] ), sondern sizeof( int[2] ) wäre, wenn ich mich im Aufbau des Arrays vertue.
Das war der Bringer :P

Es muß lauten:

Code: Alles auswählen

int tmp2[10][3];
//[...]
qsort( tmp2, k, sizeof( int[3]), cmp );
Huschhusch im Originalcode eingebaut...compiliert, ausgeführt und nachgeschaut... Jepp, hier klappts auch

Danke fürs auf die Sprünge helfen!
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum qsort

Beitrag von Xin » Do Dez 08, 2011 1:55 pm

Bruno hat geschrieben:Danke fürs auf die Sprünge helfen!
Dafür ist's Forum da. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: Frage zum qsort

Beitrag von Bruno » Fr Dez 09, 2011 9:36 am

Hallo!

Scheint nur ein Eintagssprung gewesen zu sein :-(

Da ich vorher nicht weiß wie groß das Array wird definiere ich zur Laufzeit:

Code: Alles auswählen


  int **ElemPerNodeLst;
  int ElemPerNodeSize=4;
//[...] hier wird irgendwo MaxNodID bestimmt
  ElemPerNodeLst = (int**) malloc ((MaxNodID+1) * sizeof(int *));
  if (NULL == ElemPerNodeLst )
  {
    printf("%s: ERROR: Malloc error  ElemPerNode Phase 1!\n", method_name );
    rc = 1;
    goto Exit;
  }
//
  for (i=0; i <= MaxNodID; i++)
  {
  ElemPerNodeLst[i] = (int*) malloc (ElemPerNodeSize*sizeof(int));
    if (NULL == ElemPerNodeLst[i] )
    {
      printf("%s: ERROR: Malloc error  ElemPerNodeLst Phase 2!\n", method_name );
      rc = 1;
      goto Exit;
    }
  }
//[...]
 qsort(ElemPerNodeLst,AnzElemPerNode,sizeof(int[ElemPerNodeSize]),cmp);
Das Array ElemPerNodeLst soll also die Größe [MaxNodID][4] haben.

Nach den Erkenntnissen gestern sollte der Fehler nicht mehr im qsort sein. Ist evt. die Definition des Arrays falsch?

Ciao

Bruno
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum qsort

Beitrag von Xin » Fr Dez 09, 2011 11:07 am

Bruno hat geschrieben: Nach den Erkenntnissen gestern sollte der Fehler nicht mehr im qsort sein. Ist evt. die Definition des Arrays falsch?
Du hast jetzt keine hintereinanderliegenden Arrays mehr, sondern Arrays von Zeigern!
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: Frage zum qsort

Beitrag von Bruno » Fr Dez 09, 2011 11:59 am

OK, d.h. man kann dynamische "mehrdimensionale" (man beachte die ""!!) Arrays mit qsort nicht sortieren?
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum qsort

Beitrag von Xin » Fr Dez 09, 2011 12:38 pm

Bruno hat geschrieben:OK, d.h. man kann dynamische "mehrdimensionale" (man beachte die ""!!) Arrays mit qsort nicht sortieren?
Wieso nicht?
Nur wenn Du Zeiger sortiertst, ist ein Zeiger halt sizeof( int * ) groß.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten