Перевод с на цель с - PullRequest
       12

Перевод с на цель с

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

Я нашел функцию c, которую хотел бы использовать в своем приложении. К сожалению, мои c знания не велики. Первый раздел кода показывает исходный код c, а второй мой «перевод» в цель c. У меня есть 3 вопроса, с которыми я хотел бы помочь, пожалуйста:

  1. Допустим ли мой перевод переменных из их аналогов c в их целевые аналоги c? (У меня не было предупреждений компилятора)
  2. Допустимо ли использовать free () в конце или это должно быть сделано другим способом в задаче c

код c:

unsigned int i, j, diagonal, cost, s1len, s2len;
unsigned int *arr;

char *str1, *str2;

general code...

s1len = strlen(str1);
s2len = strlen(str2);

arr = (unsigned int *) malloc(sizeof(unsigned int) * j);

general code...

free(arr);

объективный код c:

NSUInteger i, j, diagonal, cost, s1len, s2len;
NSUInteger *arr;

const char *str1 = [source cStringUsingEncoding:NSISOLatin1StringEncoding];
const char *str2 = [target cStringUsingEncoding:NSISOLatin1StringEncoding];

general code...

s1len = strlen(str1);
s2len = strlen(str2);

arr = (NSUInteger *) malloc(sizeof(NSUInteger) * j);

general code...

free(arr);

Ответы [ 4 ]

6 голосов
/ 23 февраля 2010

Objective-C является строгим надмножеством C, поэтому вы можете использовать любой C-код без каких-либо изменений.Я предлагаю либо использовать код C как есть (насколько это возможно), либо заново реализовать алгоритм с объектами в Objective-C.

NSString to char

Что вам нужно предоставить, так этоспособ сделать преобразование объектов Objective C в типы C, такие как NSString * в char *.

Преобразование правильное, но вы можете использовать -UTF8String, чтобы сохранить все символы неповрежденными, Latin-1 можетпотерять некоторую информацию.Недостаток utf-8 в том, что ваш код на C может не работать с ним корректно.

Лучше получить длины, используя один из методов NSString вместо strlen , поскольку он имеет линейное время выполнения и методы NSString могут быть постоянными.

// utf-8
int len = [source length];
// latin 1
int len = [source lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding];

int для NSInteger

Нет причин для преобразования целых чисел в NSIntegers.Apple добавила этот тип для 64-битной совместимости.NSInteger является typedef'd так, что на 32-битных платформах ему нужно 32-битных и на 64-битных платформах 64-битных.

Я бы постарался изменить как можно меньше кода C.(Упрощает его обновление при обновлении оригинала.) Так что оставьте целые как они.

Управление памятью

Управление памятью C является более базовым, чем Objective-C, но какВы, кажется, знаете, что используете malloc и free, но это остается неизменным.Retain / release и сборщик мусора полезны только для объектов.

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

Вы можете смешивать Objective C с чистым C при разработке для iPhone. В общем, с Objectvie C вы хотите работать с объектами более высокого уровня, и поэтому вам не нужно вызывать malloc и тому подобное (хотя, конечно, вы можете).

Я бы предложил вам либо заново реализовать функциональность, которую код C предоставляет с нуля в Objective C, то есть подумать о том, что вам требуется для выполнения кода, а затем просто написать код Objective C, а не пытаться изменить Код C построчно. Или я просто включил бы чистый код C в ваш проект и вызвал бы нужные вам функции из Objective C.

1 голос
/ 23 февраля 2010

Ваша версия C - это совершенно правильный код Objective-C. Вам не нужно переводить это.

1 голос
/ 23 февраля 2010

Что мешает вам просто использовать функцию c в вашем коде как есть? Вы можете использовать любую функцию c в Objective-c, и это не вызовет проблем. Многие из функций в Какао являются функциями c (например, NSSearchPathForDirectoriesInDomains().

...