Тот же код ... но предупреждение! Есть идеи? - PullRequest
0 голосов
/ 17 мая 2010

У меня вопрос к предупреждающему сообщению, которое я получаю. Для этой строки используется функция библиотеки qsort:

qsort(catalog, MAX ,sizeof catalog, struct_cmp_by_amount); 

Я получаю это предупреждение:

предупреждение: передача аргумента 4 из qsort делает указатель из целого числа без литые

РЕДАКТИРОВАТЬ:

struct_cmp_by_amount - следующая функция в программе. (--->) Каталог является структурой и Макс определяется как 100

НО, для другой программы с тем же кодом, с той же функцией struct_cmp_by_amount, я не получаю это предупреждение для 4-го аргумента!

РЕДАКТИРОВАТЬ: Я также должен сказать, что в обеих программах я не использовал прототипы функций! Но для 2-й программы она работает нормально, в отличие от 1-й.

qsort(structs, structs_len, sizeof(struct st_ex), struct_cmp_by_amount);

EDIT:

st_ex - это структура

struct st_ex structs[]={./*elements*/..}

size_t structs_len = sizeof(structs) / sizeof(struct st_ex);

int struct_cmp_by_amount(const void *a, const void *b)
{
    struct catalogue *ia = (struct catalogue *)a;
    struct catalogue *ib = (struct catalogue *)b;
    return (int)(100.f*ia->amount - 100.f*ib->amount);  
}

Я брожу о том, почему это происходит. У тебя есть идеи?

Ответы [ 6 ]

5 голосов
/ 17 мая 2010

Я предполагаю, так как я не вижу ваш код.

qsort () принимает сортируемый массив, количество записей, размер записи и указатель на процедуру сравнения, которая берет два указателя на записи и сравнивает их. (Я не помню тип возвращаемого значения функции или соглашения.)

Похоже, что компилятор не видит объявление функции или прототип функции для вашей процедуры сравнения struct_cmp_by_amount, поэтому предполагает, что это int (согласно правилам C), и предупреждает вас, что ему нужен указатель (функции) в этой позиции параметра.

1 голос
/ 17 мая 2010

Проблема заключается в том, что в одном случае вызов qsort() может увидеть объявление struct_cmp_by_amount(), а в другом - нет. Поскольку вы не используете прототипы функций, я предполагаю, что в одном случае объявление функции было до вызова qsort(), а в другом - после.

Кроме того, первый из перечисленных вызовов qsort() может вызвать проблемы, поскольку catalog - это указатель или массив, который вы передаете, а sizeof catalog - это размер, который вы ему передаете. Если catalog - это массив здесь, вы говорите, что он состоит из MAX-объектов, таких же больших, как весь массив, что означает, что вы будете возиться с гораздо большим объемом памяти, чем выделено, и, возможно, не будут вызывать ошибок , Если catalog является указателем, вы говорите, что он указывает на массив элементов размера указателя. Ни то, ни другое не кажется правдоподобным. Использование sizeof *catalog или sizeof catalog[0] имело бы гораздо больше смысла.

Кроме того, использование чисел с плавающей запятой для представления суммы в долларах подвержено ошибкам; вам обычно лучше использовать целочисленный тип для представления количества центов. Это другая проблема.

1 голос
/ 17 мая 2010

Прототип struct_cmp_by_amount должен быть объявлен как

int struct_cmp_by_amount (const void* a, const void* b) {
  ...
}

чтобы избежать предупреждения, даже если вы знаете, a и b - некоторые T*.

Кроме того, перед вызовом qsort.

убедитесь, что существует прямое объявление.
0 голосов
/ 17 мая 2010

Правильно ли скопирована эта строка кода?:

qsort(catalog, MAX ,sizeof catalog, struct_cmp_by_amount);

Если это так, то оно обязательно должно быть:

qsort(catalog, MAX ,sizeof(*catalog), struct_cmp_by_amount);

Также ваш пример рабочей строки qsort использует struct_cmp_by_price, а не struct_cmp_by_amount.

Так что, как было указано, лучше всего проверить там свои декларации и их охват. То, что компилятор привел struct_cmp_by_amount как целое число, предполагает, что он не может найти объявление для него.

0 голосов
/ 17 мая 2010

Полагаю, вы имеете в виду qsort из стандартной библиотеки C. Скорее всего, вы забыли включить stdlib.h, который объявляет функцию qsort.

РЕДАКТИРОВАТЬ: Извините, неправильно прочитал сообщение об ошибке. Фактически, другой ответ Джона Р. Штрома, вероятно, прав: у вас нет объявления для функции, видимой для компилятора.

0 голосов
/ 17 мая 2010

Не зная типов операндов, мы не сможем устранить ошибку вашего типа.

...