Не понял выход этого кода [duplicate]

Angular1

Для людей, которые используют AngularJS , может справиться с этой ситуацией, используя Promises.

Здесь it говорит,

Обещания могут использоваться для отключения асинхронных функций и позволяют объединять несколько функций вместе.

blockquote>

Вы можете найти приятное объяснение здесь .

Пример, найденный в docs , упомянутом ниже.

  promiseB = promiseA.then(
    function onSuccess(result) {
      return result + 1;
    }
    ,function onError(err) {
      //Handle error
    }
  );

 // promiseB will be resolved immediately after promiseA is resolved 
 // and its value will be the result of promiseA incremented by 1.

Angular2 and Later

In Angular2, посмотрите на следующий пример, но его рекомендовал использовать Observables с Angular2.

 search(term: string) {
     return this.http
  .get(`https://api.spotify.com/v1/search?q=${term}&type=artist`)
  .map((response) => response.json())
  .toPromise();

}

Вы можете использовать это таким образом,

search() {
    this.searchService.search(this.searchField.value)
      .then((result) => {
    this.result = result.artists.items;
  })
  .catch((error) => console.error(error));
}

См. здесь оригинал . Но TypScript не поддерживает native es6 Promises , если вы хотите его использовать, для этого вам может понадобиться плагин.

Кроме того, здесь представлены обещания spec определите здесь.

134
задан PJTraill 5 May 2015 в 22:08
поделиться

8 ответов

Перед выполнением арифметики указателя вы должны направить его на другой тип указателя.

7
ответ дан Jakob 28 August 2018 в 03:06
поделиться

Арифметика указателя не допускается в указателях void*.

53
ответ дан Job 28 August 2018 в 03:06
поделиться

Вы не можете выполнять арифметику указателя на типах void *, именно по этой причине!

13
ответ дан Oliver Charlesworth 28 August 2018 в 03:06
поделиться

Стандарт C не допускает арифметику указателей пустоты. Однако GNU C допускается, учитывая размер void 1.

C11 standard §6.2.5

Параграф - 19

Тип void содержит пустой набор значений; это неполный тип объекта, который не может быть завершен.

Следующая программа отлично работает в компиляторе GCC.

#include<stdio.h>

int main()
{
    int arr[2] = {1, 2};
    void *ptr = &arr;
    ptr = ptr + sizeof(int);
    printf("%d\n", *(int *)ptr);
    return 0;
}

Возможно, другие компиляторы генерируют ошибку.

3
ответ дан rsp 28 August 2018 в 03:06
поделиться

Компилятор знает по типу cast. Учитывая void *x:

  • x+1 добавляет один байт в x, указатель переходит к байту x+1
  • (int*)x+1 добавляет sizeof(int) байты, указатель переходит к байт x + sizeof(int)
  • (float*)x+1 addres sizeof(float) байт и т. д.

Хотя первый элемент не переносится и выступает против Galateo of C / C ++, тем не менее, C-language-correct, то есть он скомпилирует что-то на большинстве компиляторов, возможно, требуя соответствующего флага (например, -Wpointer-arith)

0
ответ дан rytis 28 August 2018 в 03:06
поделиться

Окончательный вывод: арифметика на void* является незаконной как в C, так и в C ++.

GCC разрешает ее как расширение, см. Арифметика на void - и указатели функций (обратите внимание, что этот раздел является частью главы «C Расширения» руководства). Clang и ICC, вероятно, разрешают арифметику void* для совместимости с GCC. Другие компиляторы (такие как MSVC) отклоняют арифметику на void*, а GCC запрещает ее, если указан флаг -pedantic-errors, или если указан флаг -Werror-pointer-arith (этот флаг полезен, если ваша база кода также должна компилироваться с помощью MSVC ).

C Standard Speaks

Котировки берутся из черновика n1256.

Стандартное описание состояний операции добавления:

6.5.6-2: Для добавления оба операнда должны иметь арифметический тип, или один операнд должен быть указателем на тип объекта, а другой должен иметь целочисленный тип.

Итак, вопрос в том, является ли void* указателем на «тип объекта» или, что то же самое, является ли void «типом объекта». Определение для «типа объекта»:

6.2.5.1: Типы разделены на типы объектов (типы, которые полностью описывают объекты), типы функций (типы, описывающие функции) и неполные типы (типы, которые описывают объекты, но не имеют информации, необходимой для определения их размеров).

И стандарт определяет void as:

6.2.5-19: Тип void содержит пустой набор значений; это неполный тип, который не может быть завершен.

Поскольку void является неполным, он не является типом объекта. Поэтому он не является допустимым операндом операции сложения.

Поэтому вы не можете выполнить арифметику указателя на указателе void.

Примечания

Первоначально он считалось, что арифметика void* разрешена из-за этих разделов стандарта C:

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

Однако

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

Итак, это означает, что printf("%s", x) имеет то же значение, что x имеет тип char* или void*, но это не означает, что вы можете сделать арифметику на void*.

Примечание редактора: этот ответ был отредактирован, чтобы отразить окончательный вывод.

222
ответ дан Slipp D. Thompson 28 August 2018 в 03:06
поделиться

Указатели Void могут указывать на любой фрагмент памяти. Следовательно, компилятор не знает, сколько байтов для увеличения / уменьшения при попытке арифметики указателя на указателе пустоты. Поэтому указатели void должны быть сначала приведения типов к известному типу, прежде чем они могут быть вовлечены в любую арифметику указателя.

void *p = malloc(sizeof(char)*10);
p++; //compiler does how many where to pint the pointer after this increment operation

char * c = (char *)p;
c++;  // compiler will increment the c by 1, since size of char is 1 byte.
4
ответ дан tchrist 28 August 2018 в 03:06
поделиться

передайте его указателю на char, указав указатель вперед вперед x байтами.

16
ответ дан Ultimate Gobblement 28 August 2018 в 03:06
поделиться
Другие вопросы по тегам:

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