2016-09-07 2 views
1

У меня есть серьезная проблема при заполнении массива. Мои функции выглядит следующим образом:Массив заполнения дает неожиданные значения

int s_in[]; /* Array filled with a lot of integer values */ 
for(frame=0; frame<maxFrames; frame++){ 
    left = 240*(frame-1) + 1; 
    right = 240*(frame +1); 
    int x[right-left+1]; /* is always 480 long */ 

    for(i=left-1;i<right;i++){ 
    x[i] = s_in[i]; 
    } 

Когда я теперь пытаюсь напечатать значения, хранящиеся в х [] для каждого прогона, я часто либо получаю пустой х [] или некоторые случайные числа, которые не появляются в s_in []. Можно ли решить эту проблему с помощью какого-то управления памятью?

+0

Извините, это в C. – Alex

+0

Можете ли вы показать нам, что вы вкладываете в 's_in'? – byxor

+0

Где вы печатаете 'x'. Это внутри цикла «frame» или снаружи? –

ответ

1

Есть две проблемы в линии:

x[i] = s_in[i]; 

На первой итерации, когда aboce строка выполняется, значения переменные:

frame: 0 
left: -239 
i:  -240 

код пытается прочитать из-за пределов границ s_in[] и писать пишет за пределами границ x[].

Это undefined behaviour.

Трудно обеспечить исправление кода, не зная, как информация выложена в s_in[]. Предполагая, что кадр 240 байт и на каждой итерации вы хотите скопировать значения для двух последовательных кадров из s_in[] в x[], код должен выглядеть примерно вдоль этих линий:

int s_in[]; /* Array filled with a lot of integer values */ 
for (frame = 1; frame < maxFrames; frame ++) { 
    left = 240 * (frame - 1);  /* the first value of the previous frame */ 
    right = 240 * (frame + 1);  /* the first value of the next frame */ 
    int x[480];      /* is always 480 long */ 

    for (i = 0; i < 480; i ++) { 
    x[i] = s_in[left + i]; 
    } 
} 

Там нет смысла в вычислении right-left+1 на каждом Итерация, так как вы уже знаете, она должна быть 480. Как видно из приведенного выше кода, значение right даже не требуется.

Внешний контур должен начинаться с frame = 0, но для кадра #0 нарушающая линия пытается читать снаружи s_in[]; поэтому он начинается с кадра #1.

Я полагаю, что вы делаете больше обработки внутри внутреннего контура. В противном случае вы можете заменить его вызовом на memcpy(&x, &s_in[left], 480);. Он делает то же самое, что и текущий статус цикла for, но он работает намного быстрее.

+0

Благодарим вас за ответ! Я изменил код и применил ваши предложения. Теперь я получаю ошибку сегментации в кадре 253, и я просто не знаю, почему. Я получаю ошибку только при попытке распечатать значения x []. Я уверен, что s_in [] заполнен внутри этого фрейма, но как это может быть, что он только дает мне ошибку сегментации, когда я пытаюсь прочитать и распечатать массив x []? – Alex

1

Вы используете алгоритм get вне границ массива x. Когда вы перебираете кадры, вы получаете значения дольше, чем максимальный размер массива x, а затем вы пытаетесь получить доступ к позициям x, которые не были зарезервированы в памяти, и, следовательно, странные числа. Всегда помните, что C не проверяет, если массив находится вне границ