2010-02-13 4 views
-1

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

#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, я не то, что fimilar с понятием указателей, и поэтому я получаю некоторые ошибки.

alt text http://img38.imageshack.us/img38/2894/androidndkdebugc.jpg

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

+2

Не показывать скриншоты, чтобы показать свои ошибки. Опубликовать их в виде текста, используя копию и вставить, как и ваш код. – 2010-02-13 11:13:27

+0

Idk, я вроде как скриншот ошибки, думаю, я слишком привык к консоли :) – Blindy

+1

@Blindy У этого есть две проблемы - я не могу изменить размер шрифта или шрифта, чтобы сделать его доступным для чтения, и я не могу выбрать и копировать его части для использования в ответах. – 2010-02-13 11:27:25

ответ

2

Ну что ж, вы, кажется, думаете, что 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

Для большинства реализаций '' unsigned char' содержит значения от 0 до 255, но реализация может указывать любой верхний предел для типа unsigned char, если он не меньше * 8 бит. – dreamlax

+0

Насколько вы уверены? Насколько мне известно, стандарт требует, чтобы символ «char» составлял ровно 1 байт. – Blindy

3

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

+2

Как следствие, он показывает, что кодер не пошел шаг за шагом, попробовав, если написанное было написано. Он должен, особенно при изучении нового языка. –

+0

@Vinko Очень хорошая точка. Это довольно шокирует, сколько программистов-программистов пишут огромные козыри кода и затем удивляются, когда они не будут компилироваться или работать. – 2010-02-13 11:29:43

0

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

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

#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); 
} 
+0

Вы делаете это шаг за шагом и тестируете его до тех пор, пока он не сделает то, что он должен делать ... с полной и неправильной программой показывает, что вы этого не делали. Вам просто не следует переходить к следующей функции или фрагменту кода, пока другой не будет протестирован и не будет показан правильно. –

+0

Вам нужно добавить цикл над «значениями», чтобы освободить выделенную память с помощью strdup, например, как отдельную функцию, которая будет вызвана после sortStringArray. В противном случае вы создадите утечки памяти. – Slauma

+0

Альтернативно, используя strdup, вы можете заменить «char randStr [WORD_LENGTH];» по "char * randStr = (char *) malloc (WORD_LENGTH + 1);" и добавьте randStr [WORD_LENGTH] = 0 перед возвратом. Он сохраняет копию строки. – Slauma

Смежные вопросы