LINUX.ORG.RU

[C] странный варнинг

 


0

2

не пойму, что приводит к варнингу в этом коде

#include <stdio.h>

static int arr[][2][2] = {
    {
        { 0, 0 },
        { 1, 1 }
    },
    {
        { 1, 1 },
        { 2, 2 }
    },
    {
        { 2, 2 },
        { 3, 3 }
    },
};

void foo(const int (*m)[2])
{
}

int main()
{
    foo(arr[0]);
    return 0;
}

main.c:42: warning: passing argument 1 of ‘foo’ from incompatible pointer type

main.c:36: note: expected ‘const int (*)[2]’ but argument is of type ‘int (*)[2]’

★★★★★

Последнее исправление: vvviperrr (всего исправлений: 1)

Ответ на: комментарий от Led

const, желательно еще переведи для ТС почему указатель автоматом не кастится в него

aho
()
Ответ на: комментарий от Led

ничего переводить не надо. надо объяснить, почему указатель на неконстантные данные не может автоматически преобразоваться к указателю на константные данные

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от aho

спасиб, более-менее понятно. видимо проще использовать одномерный массив интов, размером 2 * 2 * n)

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

честно, никогда не заморачивался const. Более того, знаю ситуации где это приводило к необоснованному задротству и дискуссиям (в glibc, где конкретно не помню, просто в чейнжлоге увидел).

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

глупо. в данном случае не грех и кастануть при передаче параметра. странно, что ты еще макросы IN/OUT не предложил.

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от true_admin

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

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

в реальном коде главное чтобы твой код не глючил. А прогеры всегда найдут как прогу свалить в сегфолт или заглючить и const тут, имхо, никак не поможет. Это скорее нужно тому кто либу пишет а не тем кто использует.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin
#define IN
#define OUT

void foo(IN int (*m)[2], OUT int *some_data) {}

конечно не спасет от изменения, но предупредит) на другом форуме развернулась дискуссия о использовании такой техники, я протестовал, утверждая, что синтаксис языка и так показывает, где in, где out благодаря квалификатору const

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от true_admin

код то должен нравиться, который пишешь. вот отмена const мне не нравится)

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

предупредит

Как? :) Когда глазами на прототип смотришь?

Честно, ни разу не было проблем чтобы я перепутал in и out. Мне кажется проблема надуманна. Или я мало прогаю... Но читабельности это добавляет, это плюс.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

ну не компилятор же) естественно, чисто визуально скажет о смысле параметров

Честно, ни разу не было проблем чтобы я перепутал in и out.

потому что const не дает запутаться. ты же мне предлагаешь убрать const

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

потому что const не дает запутаться

не, не поэтому. Просто спеки вдумчиво читаю.

Честно говоря, я не так давно узнал для чего его вставляют :). Ведь он не мешает изменять данные по ссылке, поэтому для компилера пользы нет.

А если хочется описать что in а что out то просто дай нормальные имена аргументам:

void foo(int (*input)[2], int *output) {}

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

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

char *strcpy(char *, char *)

в общем, убрать const это последнее, что тут можно придумать :) а придумать тут можно многое (тот же одномерный массив, или засунуть матрицу в структуру и создать массив структур)

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

много ли тебе скажет такое объявление?

Ну ктож так объявляет :( Я бы с таким кодом не связывался.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.