C - изменение многомерного массива на CONST в функции? - PullRequest
1 голос
/ 28 июля 2011

У меня есть следующее c объявление функции:

float Sum2d( const unsigned int nRows, const unsigned int mCols, float arr[nRows][mCols] )
{
    float sumAll = 0;

    // I would like to make this change illegal! 
    arr[0][0] = 15;

    for (int i = 0; i < nRows; i++)
        for (int j = 0; j < mCols; j++)
            sumAll += arr[i][j];

    return sumAll;
}

Используя код:

int main()
{
    // define a 2d float array
    float myArr2d[3][2] = {{1,2}, {3,4}, {5,6}};

    // calculate the sum
    float sum = Sum2d(3, 2, myArr2d);

    // print the sum
    printf("%f\n", myOpResult);

    // return 1
    return 1;
}

Эта функция работает хорошо, но есть одна проблема: элементы arr могут быть изменены в функции Sum2d().

Как я могу изменить Sum2d() прототип , чтобы предотвратить любые изменения arr's элементов?

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

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

1 голос
/ 28 июля 2011

Я не знаю, какой компилятор вы используете, но он не компилируется для меня как C или C ++.

Но независимо от этого достаточно просто сделать arr const.

0 голосов
/ 28 июля 2011

Изменить прототип функции для использования const с плавающей точкой

Также вы указали nRows / nCols в аргументе массива, что недопустимо в C. Если вы не знаете границ массива, используйте двойной указатель.

Этот подход не предотвращает встраивание типов в функцию.

#include <stdio.h>

float Sum2d( const unsigned int nRows, const unsigned int mCols, const float arr[][2] )
{
    float sumAll = 0;

    // I would like to make this change illegal! 
    //arr[0][0] = 15;

    for (int i = 0; i < nRows; i++)
        for (int j = 0; j < mCols; j++)
            sumAll += arr[i][j];

    return sumAll;
}

int main()
{
    // define a 2d float array
    float myArr2d[3][2] = {{1,2}, {3,4}, {5,6}};

    // calculate the sum
    float sum = Sum2d(3, 2, (const float (*)[2])myArr2d);

    // print the sum
    printf("%f\n", sum);

    // return 1
    return 1;
}

Так как вы используете следующую командную строку, я полагаю:

gcc <file.c> -o out -std=c99

Running on Debian Squeeze
$ gcc array.c -o array -std=c99

$ gcc --version       
gcc (Debian 4.4.5-8) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO   
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.             
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...