Таким образом, в основном проблема заключалась в функции DynamoDB библиотеки Python boto3 get_item () , поддерживающей несогласованные чтения по умолчанию (что довольно странно, как и другие методы поиска записей, такие как batch_get_items () дают постоянную способность к чтению). Поэтому мне просто нужно было включить флаг ConsistantRead в значение True .
response = table.get_item(
Key = {
"scheduleTime": scheduleTime,
"appName": appName
},
ConsistentRead=True
)
Таким образом, приведенный выше фрагмент кода отлично подходит для немедленного чтения.
Основное волшебство здесь является этими идентификационными данными в 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;
}
Почему даже возвращают arrAddr? Ваша передача [10] ссылкой так содержание массива будет изменена. Если Вам не нужна другая ссылка на массив затем charlies, предложение корректно.
Я не уверен, что Вы пытаетесь сделать, но присвоение значения указателя к массиву - то, что беспокоит компилятор, как упомянуто 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.
Хм, я знаю, что на Ваш вопрос ответили, но что-то еще о коде прослушивает меня. Почему Вы используете тест против '\0' для определения конца массива? Я вполне уверен, который только работает со струнами до. Код действительно компилирует после предложенной фиксации, но если Вы циклично выполняетесь через свой массив, мне любопытно видеть, получаете ли Вы правильные значения.
Попытайтесь назвать свой параметр int* arrAddr
, нет int arrAddr[]
. Хотя, когда я думаю об этом, параметры для main
метод похож все же, который работает. Так не уверенный в части объяснения.
Править: Гм все ресурсы, которые я могу найти в Интернете, говорят, что он должен работать. Я не уверен, я всегда передавал массивы как указатели сам, поэтому никогда не имел это препятствие прежде, таким образом, я очень интересуюсь решением.
Путем Ваше использование его arrayGen () не должно возвращать значение. Также необходимо поместить '\0' в последнем элементе, он не сделан автоматически, или передайте индекс последнего элемента для заполнения.
@jeffD, Передающий индекс, был бы предпочтительным путем, поскольку нет никакой гарантии, Вы не поразите другой '\0 перед своим заключительным одно (я, конечно, был, когда я протестировал его).