Здравствуйте, nah, Вы писали:
nah>...warning и я не понимаю его смысл.
nah>Так что же не нравится копилятору и как написать коректно?
Проблема решилась.
Оказывается:
1) Mac mac; //mac равен &mac (ну и, конечно всё равно указателя на первый элемент)
(операция & к имени массива не действует)
2) Компилятором трактуются по-разному "указатель на массив" и "указатель на указатель на элемент массива"
void f(const TMac* mac); НЕ то же самое что
void f(const unsigned char** mac);
Т.о. в моем случае надо писать
void f(const TMac mac);
вместо
void f(const TMac* mac);
На мой взгляд, такое поведение компилятора не очевидно, но логика в этом есть.
Здесь можно найти интересную информацию по теме.
http://stackoverflow.com/questions/1810083/c-pointers-pointi...
Здесь комментарий на эту тему от разработчика компилятора gcc.
http://gcc.gnu.org/ml/gcc-help/2009-12/msg00026.html
Всем спасибо
Здрасти, всем.
Проект под Линукс, компилятор gcc.
Решил собирать проект с опцией -std=gnu99.
Все хорошо, но есть один warning и я не понимаю его смысл.
---<Код proba.c>----------------------------------------
#include <stdio.h>
typedef unsigned char TMac[6];
void f(const TMac* mac)
{
puts(mac?"mac":"no mac");
}
int main()
{
/*const*/ TMac mac;
f(&mac);
return 0;
}
---</Код proba.c>----------------------------------------
gcc -std=gnu99 -o q proba.c
proba.c: In function ‘main’:
proba.c:10: warning: passing argument 1 of ‘f’ from incompatible pointer type
proba.c:3: note: expected ‘const unsigned char (*)[6]’ but argument is of type ‘unsigned char (*)[6]’
Соответственно, если раскоментировать /*const*/ то варнинга не будет.
Так что же не нравится копилятору и как написать коректно?
Например, если функция ждет аргумент "const int*", а передается "int*", то все ОК и внутри функции аргумент будет указателем на константный инт.
Вроде, у меня ситуация аналогична.
Ещё раз, что же не нравится копилятору и как написать коректно?
Здравствуйте, nah, Вы писали:
[skip]
nah> typedef unsigned char TMac[6];
nah> int main()
nah> {
nah> /*const*/ TMac mac;
nah> f(&mac);
nah> return 0;
nah> }
nah> ---</Код proba.c>----------------------------------------
nah> Соответственно, если раскоментировать /*const*/ то варнинга не будет.
nah> Так что же не нравится копилятору и как написать коректно?
Напиши
TMac const mac;
а то компилятору не очень понятно что у тебя за тип.
Здравствуйте, aga1, Вы писали:
a> Напиши
a> TMac const mac;
a> а то компилятору не очень понятно что у тебя за тип.
Или сделай приведение типа аргумента функции к указателю на константу:
f((TMac const *)&mac);