Сортировка строк с C - PullRequest
       0

Сортировка строк с C

0 голосов
/ 13 февраля 2010

Моя цель - написать приложение, которое генерирует массив char (каждый должен быть произвольно заполнен строками длиной 4) и сортирует этот массив. Время, которое занимает этот процесс, должно быть измерено. Я кодировал следующее:

#include <string.h>
#include <jni.h>
#include <time.h>
#include <math.h>

clock_t start, finish;
static int ARRAY_LENGTH = 200;
static int WORD_LENGTH = 4;
char values[200];

void sortStringArray(void){
    int i, j;
    for(i = 0; i < ARRAY_LENGTH; i++){
        for(j = 0; j < ARRAY_LENGTH-1; j++){
          if(strcmp(values[j], values[j+1]) > 0) {
            char holder = values[j+1];
            values[j+1] = values[j];
            values[j] = holder;
          } 
        }
    }   
}
char generateRandomChar(char aC[]){
   int length = strlen(aC);
   char randStr[WORD_LENGTH];
   int m;
   for(m = 0; m <WORD_LENGTH; m++){
     int randNr = rand()%length;
     randStr[m] = aC[randNr];
  }
  return randStr;
}

void fillStringArray(void)
{
  char allowedChars[] = "abcdefghijklmnopqrstuvwxyz";
  int k;
  for(k = 0; k < ARRAY_LENGTH; k++){
     char randStr = generateRandomChar(allowedChars);
     values[k] = randStr;
  }
}
double
Java_com_example_hellojni_HelloJni_processStringSort( JNIEnv* env, jobject thiz)
{
    start = clock();
    fillStringArray();
    sortStringArray();
    finish = clock();
    return ((double)(finish - start));
}

Поскольку я довольно новичок в кодировании C, я не очень похож на концепцию указателей, и поэтому я получаю некоторые ошибки.

альтернативный текст http://img38.imageshack.us/img38/2894/androidndkdebugc.jpg

Было бы полезно, если бы sb мог объяснить мне, где было бы полезно использовать указатель в этом коде. Некоторая помощь с ошибками была бы очень признательна. Спасибо! Ripei

Ответы [ 3 ]

3 голосов
/ 13 февраля 2010

Без переписывания кода с нуля трудно понять, с чего начать. Боюсь, это все неправильно. Чтобы получить хорошее представление об использовании указателя и символьной строки в C, вы должны прочитать хорошую, авторитетную книгу по языку. К счастью, C имеет одну из лучших таких книг в мире - Язык программирования C . Если вы еще не получили копию, возьмите ее, и если она у вас есть, перечитайте главы, посвященные указателям и строкам.

2 голосов
/ 13 февраля 2010

Ну, во-первых, вы, кажется, думаете, что char означает string .... иногда? char означает символ, число от 0 до 255. Как указано в предупреждении в строке 15, values[j] и values[j+1] не являются строками (char *), они являются символами (char). Возможно, вы захотите сделать значения массивом строк, то есть массивом символов.


2-й набор предупреждений, которые вы получаете, относится к строке 31, где вы возвращаете массив символов (указатель) из функции, которая утверждает, что возвращает символ. Компилятор молча приводит указатель на символ (поскольку указатель является числом) и возвращает его. Вы получите случайное число, которое, вероятно, не то, что вы хотите.

Чтобы исправить это, вам нужно заставить функцию возвращать char *, но есть одна загвоздка. randStr исчезает, как только вы выходите из функции, что делает невозможным возврат. Вы можете использовать strdup для дублирования строки, а после того, как вы закончите использовать ее в своей основной функции, вы вызываете free, чтобы избавиться от нее.

Пока мы работаем с этой функцией, ее параметр должен быть char *, а не char[]. Они имеют разные значения.


Последнее сообщение (очевидно, единственная ошибка, о которой сообщается как таковое), потому что вы не определили rand(). Добавление #include <stdlib.h> в начале программы должно исправить это.

0 голосов
/ 13 февраля 2010

Большое спасибо Блинди за ваши подсказки. Я пытался реализовать ваши намеки. Теперь программа не выдает ошибок, но проблема в том, что я не могу проверить, правильно ли выполняется операция с программной средой, с которой мне приходится работать. Считаете ли вы код правильным, как показано ниже? Время, затрачиваемое на это, значительно меньше: 11 мс. Я правильно рассчитываю?

Нил Баттерворт, ... ну, ты, наверное, прав, но мне нужно было как-то начать ... и я изо всех сил старался это сделать. Винко Врсалович, ... ну, вы не правы;) Я делал это шаг за шагом, но я подумал, что лучше показать вам всю программу и все ошибки одновременно.

#include <string.h>
#include <jni.h>
#include <time.h>
#include <stdlib.h>

long start, finish;
static int ARRAY_LENGTH = 500;
static int WORD_LENGTH = 4;
static int LOOPS = 10;
char *values[1000];

static long getTime(void){
    struct timeval  now;
    gettimeofday(&now, NULL);
    return (long)(now.tv_sec*1000 + now.tv_usec/1000);
}

void sortStringArray(void){
    int i, j;
    for(i = 0; i < ARRAY_LENGTH; i++){
        for(j = 0; j < ARRAY_LENGTH-1; j++){
          if(strcmp(values[j], values[j+1]) > 0) {
            char *holder = values[j+1];
            values[j+1] = values[j];
            values[j] = holder;
          } 
        }
    }   
}
char* generateRandomChar(char *aC){
   int length = strlen(aC);
   char randStr[WORD_LENGTH];
   int m;
   for(m = 0; m <WORD_LENGTH; m++){
     int randNr = rand()%length;
     randStr[m] = aC[randNr];
  }
  return strdup(randStr);
}


void fillStringArray(void)
{
  char *allowedChars = "abcdefghijklmnopqrstuvwxyz";
  int k;
  for(k = 0; k < ARRAY_LENGTH; k++){
     char *randStr = generateRandomChar(allowedChars);
     values[k] = randStr;
  }
}

jlong
Java_com_example_hellojni_HelloJni_processStringSort( JNIEnv* env, jobject thiz)
{
    start = getTime();
    int i;
    for(i = 0; i < LOOPS; i++){
      fillStringArray();
      sortStringArray();
    }
    finish = getTime();
    return (finish - start);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...