Как перебрать массивы, чтобы скопировать их в другой массив типа uint32_t?

Я создал C-программу, состоящую из целочисленных структур массива состояний [2]. Мне также нужен массив типа uint32_t с именем store. Я просто хочу скопировать содержимое массива состояний [0] в хранилище [0] и содержимое состояний [1] в хранилище [1]. Я использовал этот подход для массивов символов, и это, похоже, сработало. Мой код выглядит так:

 #include <stdlib.h>
 #include <stdio.h>

 int main()
 {
     uint32_t *store[2];
     int i;
     int *states[2];
     int states[0] = {1,0,0,1};
     int states[1] = {0,0,0,2};

     for (i = 0; i < 3; i++)
     {
        store[i] = states[i];
        i++;
     }
 }

Код, однако, не выполняется и говорит, что массивы, которые я объявил, имеют недопустимый формат. Я не уверен, что это правильный подход для этого. Может ли кто-нибудь помочь мне с этим.

2 ответа

Решение

Я переписал ваш пример - форсирование размеров массивов - в этом все работает.

РЕДАКТИРОВАТЬ - Добавление вызовов printf для отображения содержимого хранилища массивов.

 #include <stdlib.h>
 #include <stdio.h>

 int main()
 {
     int store[3][4];
     int i;
     int states[3][4] = {{1,0,0,1},{0,0,0,2}};

     for(i=0; i<3; i++)
     {
        printf( "store[%d] = ", i );
        for( int inner = 0; inner < 4; inner++ )
        {
           store[i][inner] = states[i][inner];
           printf( "%d ", store[i][inner] ); 
        }
        printf( "\n" );
     }

    return( 0 );   

}

При создании указателей в массивах вам действительно нужно выделить, а затем скопировать.

Есть две проблемы в вашем коде,

Первый,

int *states[2];
int states[0] = {1,0,0,1};
int states[1] = {0,0,0,2};

проблемные. При доступе к переменной тип не упоминается, он требуется только при определении. так, используя int states[0] или же ..[1] является недействительным.

Тогда, во-вторых,

states[0] = {1,0,0,1};

state[0] имеет тип int *и вы пытаетесь инициализировать то же самое с помощью заключенного в скобки списка инициализатора ints. Это тоже не правильно.

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

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>   //added for uint32_t 

 int main(void)        //corrected signature
 {
     uint32_t *store[2];
     int i;
     int *states[2];
     states[0] = (int []){1,0,0,1};     //compound literal, C99 and above
     states[1] = (int []){0,0,0,2};

     for (i = 0; i < 2; i++)           //bound corrected
     {
        store[i] = states[i];
                                       //i++; remove this, you're incrementing twice
     }
 }
Другие вопросы по тегам