Передача указателя на массив int в c-функцию - PullRequest
3 голосов
/ 31 января 2011

У меня очень простой вопрос.

Что не так с этим звонком?

int params[2] = {1, 1};
return strcmp95((char*)buffer1, (char*)buffer2, (long)stringLength, &params);

Функция определяется следующим образом:

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c[])

{...

Когда я компилирую в XCode, я получаю следующее предупреждение:

предупреждение: передача аргумента 4 из 'strcmp95' из несовместимого указателя тип

Извините за неточность. Вот описание функции:

/ * Аргументы: ying и yang - это указатели на 2 сравниваемые строки. Струны не должны быть строки, оканчивающиеся NUL потому что длина пройдена. y_length - длина строк. ind_c - это массив, который используется для определения того, должны ли определенные параметры быть активирован. Ненулевое значение указывает, что опция деактивирована.
Варианты: ind_c [0] Увеличение вероятности совпадения, когда количество совпавших персонажи большие. Этот вариант позволяет немного больше терпимости когда строки большие. Это не соответствующий тест при сравнении поля фиксированной длины, такие как телефон и номера социального страхования. ind_c [1] Все символы нижнего регистра преобразуются в верхний регистр до сравнения. Отключение эта функция означает, что нижний
Строка case "code" не будет признается таким же, как верхний регистр "КОД". Так же корректировка для похожих персонажей раздел относится только к верхнему регистру персонажи. Предлагаемые значения - все нули для символьных строк, таких как имена. * /

Ответы [ 5 ]

4 голосов
/ 31 января 2011

params - это int [2], который уменьшается до int * при передаче в функцию, а функции, которые принимают int [] с в качестве параметров, действительно берут int * с за кадром.К сожалению, &params - это int(*)[2], что ближе к int *, чем int ** (так же, как int *[] в параметре функции), который вам нужен.

Лучший вариант - изменитьВаша функция:

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c)

И предположим, что вызывающий абонент всегда передаст int[2].Или вы можете явно запросить int(*)[2] - указатель на массив из 2 int s:

double  strcmp95(char *ying, char *yang, long y_length, int (*ind_c)[2])

Но это кажется ненужным, чтобы гарантировать, что два int s пройдены, и если выНеобходимость учесть возможность более двух int с в массиве не подходит.Лучший способ:

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c, size_t len)

size_t - это целочисленный тип без знака, гарантированно способный хранить размер любого объекта или любого индекса массива, и в этом случае параметр len является длинойвашего массива ((sizeof params / sizeof params[0]), если вы хотите быть фантазийным / дальновидным, 2, если вы этого не сделаете).Это самый безопасный маршрут.

Кстати, ваш параметр y_length также должен быть переменной size_t.long подписано, и я бы не хотел обрабатывать строку длиной -1.Даже если вы используете unsigned long, нет никакой гарантии, что long будет достаточно для обработки размеров системы (или, наоборот, что слишком большое значение long будет слишком большим для вашей системы, чтобы вызывать путаницу).

2 голосов
/ 31 января 2011

strcmp95 принимает указатель на указатель на int (int **), в то время как вы передаете ему указатель на массив из двух целых (int (*)[2]).

Вы можете изменить strcmp95так что его подпись выглядит следующим образом:

double  strcmp95(char *ying, char *yang, long y_length, int (*ind_c)[] );

Дело в том, что указатель на массив (int (*x)[]) не совпадает с массивом указателей (который равен int *(x[]) и являетсятакой же как int *x[])

1 голос
/ 31 января 2011

Также я думаю, что вы передаете params (который сам по себе является целочисленным указателем), а функция strncmp95 ожидает указатель на массив целых чисел, т.е. int * ind_c [].

1 голос
/ 31 января 2011

Почему вы передаете ¶ms, параметров будет достаточно, так как массив действует как указатель.

return strcmp95((char*)buffer1, (char*)buffer2, (long)stringLength, params);

А во-вторых, теперь strcmp95 должен ожидать массив целых чисел, это будет хорошо:

double  strcmp95(char *ying, char *yang, long y_length, int ind_c[])
1 голос
/ 31 января 2011

Трудно понять, должен ли strcmp95 принимать массив целых чисел, как вы пытаетесь передать, или он должен принимать массив указателей на int как запросы прототипа. Первое кажется вероятным - если это так, вы должны измениться ...

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c[])

... для ...

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c)

... или, что эквивалентно ...

double  strcmp95(char *ying, char *yang, long y_length, int ind_c[])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...