2015-05-26 3 views
0

Я использую функцию fill_n() для инициализации значений моего массива, но тогда я не могу изменить значения массива, это всегда начальное значение.fill_n() не позволяет изменять значение переменной

Может кто-нибудь объяснить мне, почему это так?

#include<iostream> 
#include<ctime> 


int main(){ 

    //Matrix 
    int m[3][3] = {{1,0,0},{0,1,0},{0,0,1}}; 
    int v[3] = {5,6,7}; 
    int result[3];// = {0,0,0}; 
    int n = 0, i, j; 

    std::fill_n(result,sizeof(result),0); 

    clock_t time = clock(); 

    while(n<1000){ 
     n++; 
     for(i=0;i<3;i++){ 
      for(j=0;j<3;j++){ 
       result[j] = result[j]+(v[i]*m[j][i]); //changing the values here. 
      } 
     } 
    } 

    time = clock() - time; 

    for(i=0;i<3;i++){ 
    std::cout<<result[i]<<"\n"; 
    } 

    std::cout<<"Execution time: "<<((float)time)/CLOCKS_PER_SEC<<"\n"; 

    return 0; 
} 

Выход кода всегда 0.

ответ

2

sizeof(result) возвращает количество байтов, принадлежащих переменной result. Так как result представляет собой массив из 3 int s, его размер в памяти равен 3 * sizeof(int), который (если только sizeof(int) не является 1) намного больше, чем 3. Таким образом, вы записываете границы массива pass и выполняете неопределенное поведение.

Фактический способ рассчитать размер будет состоять в том, чтобы разделить весь размер result по типу элемента. То есть, sizeof(result)/sizeof(int).

Если вы хотите инициализировать каждый элемент 0, более простой способ сделать это было бы значение инициализации массив:

int result[3]{}; // or = {} (pre C++11) 
3

К std::fill_n(result,sizeof(result),0); вы просите, чтобы заполнить первые sizeof(result) элементы на 0.

Однако только 3 элементы доступны в result. Таким образом, вы выписали из-за границы и привели к неопределенному поведению. Вместо этого вы должны написать std::fill_n(result, sizeof(result)/sizeof(result[0]), 0);.

sizeof(result) Обратите внимание, что возвращает размер result в байт, а не в элементов.

0

Количество элементов (или размера) с массива типа тип будет размерof (массив)/размерof (тип). Второй аргумент, необходимый для fill_n, - это количество элементов для заполнения контейнера (в вашем случае - массив типа int), а не размер массива в байтах. Естественно, размерof (массив) возврат размерof (тип) раз количество элементов.

Смежные вопросы