2013-03-14 2 views
0

У меня есть следующая функция в C, которая принимает целое число как вход (например, число 1000), разбивает число на отдельные цифры (так 1, 0, 0, 0 в этот случай) и присваивает каждую цифру в массиве называется цифры:C Программирование: функция Loop, которая присваивается массиву

int splitnumber(int x) 
{ 
    temp=x; 

    while(temp) 
    { 
     temp=temp/10; 
     factor = factor*10; 
    } 

    while (factor>1) 
    { 
     factor = factor/10; 
     digits[i]= x/factor; 
     x = x % factor; 
     i = i + 1; 
    } 
} 

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

do 
{ 
    splitnumber(number); 

    lowhigh = sort_lowtohigh(digits); 
    highlow = sort_hightolow(digits); 

    printf ("\n\nLoop number is:%d\n", number); 
    printf ("High to Low is: %d\n", highlow); 

    printf ("Low to high is: %d", lowhigh); 

    printf("\n"); 

    printf ("Subtraction is: %d", subtraction(highlow, lowhigh)); 

    number++; 
} while (number <= 1020); 

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

 
Loop number is:1001 
High to Low is: 1100 
Low to high is: 11 
Subtraction is: 1089 

Loop number is:1002 
High to Low is: 1100 
Low to high is: 11 
Subtraction is: 1089 

Loop number is:1003 
High to Low is: 1100 
Low to high is: 11 
Subtraction is: 1089 

Цикла приращение счетчика номеров, но, опять же, цифры массив не обновляются.

+0

Где объявлен массив цифр? И где он очищается? – Mike

+0

Где инициализируются 'factor' и' i'? Всегда указывайте ** действующий код **, который вы запускаете, включая все декларации/определения. –

ответ

0

Я вижу некоторые проблемы в коде (что может привести к тому, описанное поведение):

В функции «splitnumber (интермедиат х)»:

  • У вас нет локальных переменных (темп, я , factor)
  • «i» никогда не инициализируется!
  • нет возвращаемого значения

Я считаю, переменная я (вероятно, объявлены глобально) вызывает проблему. Каждый раз, когда вы вызываете «splitnumber», я буду увеличиваться. Во время первого вызова splitnumber i, вероятно, 0 и будет расти во время этого вызова до 3. Это повлияет на первые 4 записи в цифрах (что, вероятно, снова объявлено глобально как int [4]). Когда вы вызываете splitnumber второй раз, i все равно 4. Таким образом, на этот раз вы измените значения цифры [4 5 6 и 7].

Если моя догадка правильная, вам повезло, что ваша программа не вылетает из-за ошибки сегментации. Вы пытаетесь получить доступ к памяти (все с цифрой [i]; i> 3), которую вы никогда не выделяли.

Просто добавив

i = 0; 

в начале splitnumber зафиксирует вашу проблему. Использование локальных переменных в вашей функции может решить дополнительные проблемы.

+0

Спасибо! Вы правы, i = 0 было объявлено глобально. Перемещение внутри функции исправлено. – jj2170937

0

Поскольку i не инициализируется 0 в splitnumber, вы будете только установить каждый элемент digits один раз ... последующие вызовы будут выходить за рамки массива.

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