как qsort динамически размещать 2d массив символов - PullRequest
0 голосов
/ 20 ноября 2011

Я пытаюсь qsort динамически распределенный 2d массив, но безуспешно.Я предполагаю, что это как-то связано с динамическим размещением, потому что все работает нормально, если я использую глобальный 2d массив (например, fileList [148096] [100]).Есть идеи?

// global:
char **fileList;

void allocateFileListArray(void)
{
  int arraySize = 148096;
  int fileNameLength = 100;

  /*  allocate storage for an array of pointers */
  fileList = (char **) malloc(arraySize * sizeof(char *));

  /* for each pointer, allocate storage for an array of chars */
  for (int i = 0; i < arraySize; i++)
  {
      if ((fileList[i] = (char *) malloc(fileNameLength * sizeof(char))) == NULL)
          printf("failed fileList alloc\n");
    }
}

void sortTheArray(int fileListCount)
{
    qsort (( char * ) fileList, fileListCount, sizeof ( *fileList ), 
     (compfn) compareStrings );
}



 int compareStrings(char *stackA, char *stackB)
 {
    int result;

    result = strcmp( stackA->name, stackB->name);

    return(result);

}

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

Ваш список файлов char [4095] [100] пример не совпадает с вашим распределением в allocateFileListArray, массив указателей не совпадает с массивом массива.Вы должны изменить функцию сравнения для qsort следующим образом:

int compareStrings(const void *stackA, const void *stackB)
{
  const char *a=*(const char**)stackA;
  const char *b=*(const char**)stackB;
  return strcmp(a,b);
}

, и вы можете использовать эту функцию без отвратительного преобразования в qsort.

0 голосов
/ 20 марта 2014

У меня была похожая проблема с двумерными массивами int. Это массив указателей на неправильное пространство. Есть несколько хитрых компонентов:

1) приведение указателя в функцию сравнения, как упомянуто @ user411313, это указатель на указатель, поэтому вы должны дважды разыменовать, чтобы получить значение

2) размер, который вы передаете qsort. Размер - это размер указателя, а не количество столбцов двумерного массива (как в случае с var [row] [col]).

0 голосов
/ 20 ноября 2011

Как насчет:

void sortTheArray(void)
{
    qsort (fileList, arraySize, sizeof(char *), (compfn) compareStrings );
}

Посмотрите определение qsort и передайте параметры соответствующим образом.

Если это не сработает, взгляните на compareStrings (). У вас есть один уровень косвенности слишком много или слишком мало? Поскольку информация о CompareStrings () отсутствует, невозможно сказать, имеет ли она какое-либо отношение к этому.

...