Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Проблема с функцией на языке си

Влади Каста Ученик (226), открыт 2 часа назад
Задание требует создать арифметику чисел в виде децимал. Все работало, пока я не решил задать значения value_1 -15 и value_2 5. Задаю через необходимую функцию, по отладкам вижу что входят значения верно, знаки получаем верные, а дальше магия какая то. Ни в один из ифов, ни дальше программа не идет. Просто встает, приходится убивать процесс. Прошу помощи, дополнительные функции отрабатывают корректно, какие могут быть причины такого поведения?

int s21_add(s21_decimal value_1, s21_decimal value_2, s21_decimal *result) {
//printf("Value1 3: %u, Value 4: %u\n", value_1.bits[0], value_2.bits[0]);
if (s21_is_decimal_correct(value_1) || s21_is_decimal_correct(value_2) ||
result == S21_NULL)
return 4;
s21_clear_decimal(result);
int return_value = 0;
int sign_1 = s21_get_decimal_sign(value_1);
int sign_2 = s21_get_decimal_sign(value_2);
printf("Value1 Sign: %d, Value 4 Sign: %d\n",sign_1,sign_2 );
//printf("Value1 Sign: %u, Value 4 Sign: %u\n", value_1.bits[3], value_2.bits[3]);
printf("Value1 3: \n%u %u %u %u\n Value 4: %u %u %u %u\n", value_1.bits[3], value_1.bits[2],value_1.bits[1],value_1.bits[0],value_2.bits[3],value_2.bits[2],value_2.bits[1], value_2.bits[0]);
if (sign_1 == 0 && sign_2 == 1) {
//printf("ok1");
s21_set_decimal_sign(&value_2, 0);
return_value = s21_sub(value_1, value_2, result);
} else if (sign_1 == 1 && sign_2 == 0) {
printf("ok2");
s21_set_decimal_sign(&value_1, 0);
return_value = s21_sub(value_2, value_1, result);
} else {
//printf("ok3");
s21_big_decimal a1 = {{0}};
s21_big_decimal a2 = {{0}};
s21_big_decimal a3 = {{0}};
s21_clear_big_decimal(&a3);
s21_to_big_decimal(value_1, &a1);
s21_to_big_decimal(value_2, &a2);
s21_normalisation_big_decimal(&a1, &a2);
s21_bitwise_addition(a1, a2, &a3);
s21_set_big_decimal_scale(&a3, s21_get_big_decimal_scale(a1));
if (sign_1 == 1) s21_set_big_decimal_sign(&a3, 1);
return_value = s21_to_decimal(a3, result);
}
//printf("ok4");
return return_value;
}

Децимал представлен как 4 unsigned int. Буду благодарен помощи
Дополнен 9 минут назад
оказалось, что принт "NEok2" не выводится из-за отсутсвия переноса строки, а ошибка как всегда внутри в логике. Всем спасибо и помните, это не комп тупой, это вы не внимательны. Отдыхаем, переводим дух, отвлекаемся и снова пробуем. на какой то итерации у вас все получится
2 ответа
sasha Мыслитель (7692) 1 час назад
Компилятор в С не контролирует корректность указателей. При невнимательности легко затереть память за пределами объекта. Так как на стеке лежат и данные (auto) и адреса возврата, то это обычно и приводит к разнообразной "магии", включая зависание. Причем, скорее всего, ошибка совсем в другой функции.
Нужно, чтобы компилятор всегда видел прототипы всех используемых функций. Либо они либо их прототипы должны стоять в том же файле раньше. Либо прототипы должны быть в подключенном раньше .h файле. Тогда компилятор сможет заметить ошибки передачи указателя вместо значения или наоборот.
Можешь в отладчике переключиться в режим ассемблерного текста и посмотреть детально, что происходит.
Влади КастаУченик (226) 54 минуты назад
но ведь при других значениях все работает корректно, когда речь заходит о других ифах
Влади КастаУченик (226) 53 минуты назад
мало вводных, а у вас развернутый ответ, спасибо
Батаев Дмитрий Просветленный (23228) 57 минут назад
int s21_add(s21_decimal value_1, s21_decimal value_2, s21_decimal *result) ЭТО ЧТО ЗА КОНСТРУКЦИЯ???
Влади КастаУченик (226) 55 минут назад
аргументы с самостоятельным типом данных, эта функция вызвана мейном
Батаев ДмитрийПросветленный (23228) 52 минуты назад
int ФУНКЦИЯ ( int ПЕРЕМЕННАЯ_1, int ПЕРЕМЕННАЯ_2, int *РЕЗУЛЬТАТ);
Если возврат функции int РЕЗУЛЬТАТ = ФУНКЦИЯ (2, 2);
получим просто 4 и передавать адрес приёмника дополнительно не нужно. Если void ФУНКЦИЯ (2, 2, РЕЗУЛЬТАТ); тогда это можно понять
Батаев ДмитрийПросветленный (23228) 48 минут назад
s21_decimal value_1 как и где определён САМОСТОЯТЕЛЬНЫЙ тип данных???
Батаев ДмитрийПросветленный (23228) 47 минут назад
и выше комментарий правильный был - прототип функции какой - то есть описание для компилятора самой функции
Похожие вопросы