На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Си массивы
    Добрый день всем, подзабыл немного Си, ооочень давно не применял. Вопрос с массивами. Можно инициализировать массив следующим образом
    ExpandedWrap disabled
      int i[] = {0, 1, 2, 3};


    но после изменить его таким же образом нельзя, то есть строка
    ExpandedWrap disabled
      i={6, 7, 8, 9, 7, 8, 9};

    приведет к ошибке компиляции, так вот не пойму что не так, почему так нельзя и как можно не перечисляя каждый элемент массива
      В текстовой части стандартов я не силен.
      Но, i - это константный указатель.
      И вы ему пытаетесь присвоить другой указатель.

      примерно так, корректность не ручаюсь, код набираю тут, как то так примерно, использовать специальные классы.
      std::array<int, 4> aaa = {0, 1, 2, 3};
      aaa = std::array<int, 5>{4, 5, 6, 7, 8};

      ну или так:
      int aaa[] = {0, 1 ,2 ,3};
      int bbb[] = {4, 5, 6, 7};
      for(int i= 0;i<4;++i) aaa[i] = bbb[i];
      размеры у массивов должны совпадать.
        Цитата Black_Dragon @
        В текстовой части стандартов я не силен.
        Но, i - это константный указатель.
        И вы ему пытаетесь присвоить другой указатель.
        Та не. Синтаксически список значений через , внутри {} является инициализатором, а грамматически инициализаторы позволяются только в определениях. Выражения являются выполняемыми инструкциями, а не определениями, поэтому инициализаторы в них недопустимы.
          Цитата Qraizer @
          Та не. Синтаксически список значений через , внутри {} является инициализатором, а грамматически инициализаторы позволяются только в определениях. Выражения являются выполняемыми инструкциями, а не определениями, поэтому инициализаторы в них недопустимы.


          спасибо, коротко и ясно )))

          Цитата Black_Dragon @
          примерно так, корректность не ручаюсь, код набираю тут, как то так примерно, использовать специальные классы.
          std::array<int, 4> aaa = {0, 1, 2, 3};
          aaa = std::array<int, 5>{4, 5, 6, 7, 8};


          Black_Dragon, классы не могу использовать ибо чистый Си

          Всем спасибо!

          Добавлено
          не поставил галочку (
          Сообщение отредактировано: Pit-Bul -
            Цитата Qraizer @
            Та не. Синтаксически список значений через , внутри {} является инициализатором, а грамматически инициализаторы позволяются только в определениях. Выражения являются выполняемыми инструкциями, а не определениями, поэтому инициализаторы в них недопустимы.

            И да, и нет, ИМХО! "Инициализаторы", вангую, те же операторы. Пример части кода (x86_x64 gcc 10.1):

            ExpandedWrap disabled
              const int A[]={0,1,2,3,4,5,6,7,8,9};

            ... трансформируется в:

            ExpandedWrap disabled
                mov     DWORD PTR [rbp-48], 0
                mov     DWORD PTR [rbp-44], 1
                mov     DWORD PTR [rbp-40], 2
                mov     DWORD PTR [rbp-36], 3
                mov     DWORD PTR [rbp-32], 4
                mov     DWORD PTR [rbp-28], 5
                mov     DWORD PTR [rbp-24], 6
                mov     DWORD PTR [rbp-20], 7
                mov     DWORD PTR [rbp-16], 8
                mov     DWORD PTR [rbp-12], 9
              Цитата Pit-Bul @
              классы не могу использовать ибо чистый Си

              DEFINE-ы
              Типа так у меня
              ExpandedWrap disabled
                #define RESETVAR(var, def) auto old = var; var = def; return old;
                 
                bool GetResVisible() { RESETVAR(m_Visible, false) }


              ExpandedWrap disabled
                #define cp_arr(t, a, b) { t tmp[] = b; for(int i = 0; i < size_of(tmp); ++i) a[i] = tmp[i];};
                 
                cp_arr(int, i, {5, 6, 7, 8})
                Цитата Black_Dragon @
                cp_arr(int, i, {5, 6, 7, 8})

                i что тут делает?
                  Цитата prografix @
                  i что тут делает?

                  Наверно дестенейшен.
                  Цитата Pit-Bul @
                  int i[] = {0, 1, 2, 3};
                    Цитата
                    { int tmp[] = {5, 6, 7, 8}; for(int i = 0; i < size_of(tmp); ++i) i[i] = tmp[i];};

                    Это будет работать?
                      Цитата prografix @
                      Это будет работать?

                      Как идея для размышления, набранная в блокноте, да...

                      А если брать нормальны редактор, то вот так:
                      ExpandedWrap disabled
                        #define singleArgument(...) __VA_ARGS__
                        #define cp_arr(t, a, b) { t tmp[] = b; int ss = sizeof(tmp) / sizeof(t); for(int idx = 0; idx < ss; ++idx) a[idx] = tmp[idx];};
                         
                        int ai[] = {1, 2, 3, 4};
                        cp_arr(int, ai, singleArgument({5, 6, 7, 8}))
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0332 ]   [ 16 queries used ]   [ Generated: 25.04.24, 05:03 GMT ]