Передающие указатели массивов в C

Таким образом, в основном проблема заключалась в функции DynamoDB библиотеки Python boto3 get_item () , поддерживающей несогласованные чтения по умолчанию (что довольно странно, как и другие методы поиска записей, такие как batch_get_items () дают постоянную способность к чтению). Поэтому мне просто нужно было включить флаг ConsistantRead в значение True .

response = table.get_item(
    Key = {
         "scheduleTime": scheduleTime,
         "appName": appName
    },
    ConsistentRead=True
)

Таким образом, приведенный выше фрагмент кода отлично подходит для немедленного чтения.

7
задан Bill Lynch 24 October 2011 в 20:01
поделиться

7 ответов

Основное волшебство здесь является этими идентификационными данными в C:

*(a+i) == a[i]

Хорошо, теперь я заставлю это быть читаемым английским языком.

Вот проблема: имя массива не является lvalue; этому нельзя присвоить. Так строка Вы имеете с

a = arrayGen(...)

проблема. Посмотрите этот пример:

int main() {
    int a[10];

    a = arrayGen(a,9);

    return 0;
}

который дает ошибку компиляции:

gcc -o foo foo.c
foo.c: In function 'main':
foo.c:21: error: incompatible types in assignment

Compilation exited abnormally with code 1 at Sun Feb  1 20:05:37

У Вас должен быть указатель, который является lvalue, которому можно присвоить результаты.

Этот код, например:

int main() {
    int a[10];
    int * ip;

    /* a = arrayGen(a,9);  */
    ip = a ; /* or &a[0] */
    ip = arrayGen(ip,9);

    return 0;
}

прекрасные компиляции:

gcc -o foo foo.c

Compilation finished at Sun Feb  1 20:09:28

Обратите внимание, что из-за идентификационных данных в вершине, можно рассматривать IP как массив, если Вам нравится, как в этом коде:

int main() {
    int a[10];
    int * ip;
    int ix ;

    /* a = arrayGen(a,9);  */
    ip = a ; /* or &a[0] */
    ip = arrayGen(ip,9);

    for(ix=0; ix < 9; ix++)
        ip[ix] = 42 ;

    return 0;
}

Полный пример кода

Только для полноты вот мой полный пример:

int gen(int max){
    return 42;
}

int* arrayGen(int arrAddr[], int maxNum)
{
    int counter=0;
    while(arrAddr[counter] != '\0') {
        arrAddr[counter] = gen(maxNum);
        counter++;
    }
    return arrAddr;
}

int main() {
    int a[10];
    int * ip;
    int ix ;

    /* a = arrayGen(a,9);  */
    ip = a ; /* or &a[0] */
    ip = arrayGen(ip,9);

    for(ix=0; ix < 9; ix++)
        ip[ix] = 42 ;

    return 0;
}
17
ответ дан 6 December 2019 в 07:08
поделиться

Почему даже возвращают arrAddr? Ваша передача [10] ссылкой так содержание массива будет изменена. Если Вам не нужна другая ссылка на массив затем charlies, предложение корректно.

4
ответ дан 6 December 2019 в 07:08
поделиться

Я не уверен, что Вы пытаетесь сделать, но присвоение значения указателя к массиву - то, что беспокоит компилятор, как упомянуто Charlie. Мне любопытно на предмет проверки по сравнению с символьной константой NUL '\0'. Ваш демонстрационный массив является неинициализированной памятью так сравнение в arrayGen движение не должно делать то, что Вы хотите, чтобы оно сделало.

Список параметров, который Вы используете, заканчивает тем, что был идентичен:

int* arrayGen(int *arrAddr, int maxNum)

в большинстве целей. Фактический оператор в стандарте:

Объявление параметра как "массив типа" должно быть скорректировано к "квалифицированному указателю на тип", где спецификаторы типа (если таковые имеются) являются теми specified в [и] деривации типа массива. Если ключевое слово static также появляется в [и] деривации типа массива, затем для каждого вызова к функции, значение соответствующего действительного аргумента должно обеспечить доступ к первому элементу массива с, по крайней мере, столькими же элементов сколько specified по выражению размера.

Если Вы действительно хотите вынудить вызывающую сторону использовать массив, то используйте следующий синтаксис:

void accepts_pointer_to_array (int (*ary)[10]) {
    int i;
    for (i=0; i<10; ++i) {
        (*ary)[i] = 0; /* note the funky syntax is necessary */
    }
}

void some_caller (void) {
    int ary1[10];
    int ary2[20];
    int *ptr = &ary1[0];
    accepts_pointer_to_array(&ary1); /* passing address is necessary */
    accepts_pointer_to_array(&ary2); /* fails */
    accepts_pointer_to_array(ptr);   /* also fails */
}

Ваш компилятор должен жаловаться, называете ли Вы его с чем-нибудь, что не является указателем на массив 10 целых чисел. Я могу честно сказать, хотя это я никогда не видел этого нигде за пределами различных книг (Книга C, Опытный C, Программирующий)..., по крайней мере, не в программировании C. В C++, однако, у меня была причина использовать этот синтаксис точно в одном случае:

template <typename T, std::size_t N>
std::size_t array_size (T (&ary)[N]) {
    return N;
}

Ваш пробег может варьироваться все же. Если Вы действительно хотите вырыть в материал как это, я не могу рекомендовать Опытный C, Программирующий достаточно высоко. Можно также найти Книгу C онлайн в gbdirect.

2
ответ дан 6 December 2019 в 07:08
поделиться

Хм, я знаю, что на Ваш вопрос ответили, но что-то еще о коде прослушивает меня. Почему Вы используете тест против '\0' для определения конца массива? Я вполне уверен, который только работает со струнами до. Код действительно компилирует после предложенной фиксации, но если Вы циклично выполняетесь через свой массив, мне любопытно видеть, получаете ли Вы правильные значения.

2
ответ дан 6 December 2019 в 07:08
поделиться

Попытайтесь назвать свой параметр int* arrAddr, нет int arrAddr[]. Хотя, когда я думаю об этом, параметры для main метод похож все же, который работает. Так не уверенный в части объяснения.

Править: Гм все ресурсы, которые я могу найти в Интернете, говорят, что он должен работать. Я не уверен, я всегда передавал массивы как указатели сам, поэтому никогда не имел это препятствие прежде, таким образом, я очень интересуюсь решением.

0
ответ дан 6 December 2019 в 07:08
поделиться

Путем Ваше использование его arrayGen () не должно возвращать значение. Также необходимо поместить '\0' в последнем элементе, он не сделан автоматически, или передайте индекс последнего элемента для заполнения.

0
ответ дан 6 December 2019 в 07:08
поделиться

@jeffD, Передающий индекс, был бы предпочтительным путем, поскольку нет никакой гарантии, Вы не поразите другой '\0 перед своим заключительным одно (я, конечно, был, когда я протестировал его).

0
ответ дан 6 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: