С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 1
Регистрация: 06.07.2016
Сообщений: 21
1

Ошибка в программе Stack limit exceeded. На пк всё работает

12.11.2017, 23:04. Показов 1844. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет,

Прошу помочь. Написал код программы, которая решает определенную задачу. На домашнем ПК программа прекрасно работает и решает задачу, работает. Пользователь вводит данные на вход, программы выдает верные данные на выход (задачу задали в универе, есть примеры на ввыод и вывод).

Однако при проверке на университетском сервере (именно туда заливается, и именно там проверяется программа) выскочила ошибка.
Сервер проводит несколько тестов для программы, первый из них - проверяет, решает ли программа задачи из примера (определенные значения на ввод, и на вывод должна дать соотвутствующие).

Однако когда сервер начинает проверять прогармму на то, отсеивает ли она некорректный ввод (отрицательные значения, нулевые, буквы), то сервер пишет что программа не проходит текст, т.к. (Segmentation fault/Bus error/Memory limit exceeded/Stack limit exceeded)

Код программы:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
int CheckInput(double width, double length, double r_plt, double r_sch)
{
    double max = 10000000.0;
    if( (length <= 0) || (width <= 0) || ((round(length * 1e1) / 1e1) != length) || ((round(width * 1e1) / 1e1) != width) || (length > max) || (width > max) )
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
 
int DoStuff(int in_res_local, double r_plt, double r_sch, int *X0, double *r, int *r0, double *X, int *a0)
{
    double real_size = 0;
    int j0 = 0;
    
    double m = round(r_plt * 1e1) / 1e1, n = round(r_sch * 1e1) / 1e1;
    if (((in_res_local < 2) || (r_plt <= 0) || (r_sch < 0) || (m != r_plt) || (n != r_sch) || (r_plt > 10000000) || (r_sch > 10000000)) && (in_res_local != EOF))
            {
                printf("Neverny vvod.\n");
                in_res_local = EOF;
                return 1;
            }
            else
            {
                if (in_res_local != EOF)
                {
                    r_plt *= 10;
                    r_sch *= 10;
                    real_size = r_plt + r_sch; //реальный размер плитки
                    *r0 = round(*r), j0 = round(r_sch), *a0 = round(real_size), *X0 = round(*X);
                    while (*r0 % *a0 != j0)
                    {
                        *r0 += *X0;
                        if (*r0 > 10000000)
                        {
                            *X0 = 1;
                            *r = 0;
                            return 2;
                            
                        }
                    }
                
                }
            }
             return 0;
        }
 
int main(int argc, char **argv)
{
    double length, width, r_plt, r_sch, r = 0, d = 0, X = 1;
    int in_res = 0;//, error = 0;
    int X0 = 0;
    int r0 = 0;
    int res = 0;
    int a2, b2, s, a1, b1, a0 = 0;
    printf("Minimalny razmer:\n");
    //проверка, округление до первого разряда (round(w*1e1))
    if ((scanf("%lf%lf", &width, &length) < 2) || (width <= 0) || (length <= 0) || CheckInput(length, width, r_plt, r_sch) == 1)
        printf("Nespravny vstup.\n");
    else
    {
        printf("Plitka:\n");
        while (in_res != EOF)
        {
            in_res = scanf("%lf%lf", &r_plt, &r_sch);
            
                    res = DoStuff(in_res, r_plt, r_sch, &X0, &r, &r0, &X, &a0);
                    r = r0;
                    a2 = X0;
                    b2 = a0;
                    s = 0;
                    a1 = a2;
                    b1 = b2;
                    while (a2 > 0 && b2 > 0)
                        if (a2 >= b2)
                            a2 = a2 % b2;
                        else
                            b2 = b2 % a2;
                    if (a2 == 0)
                        s = b2;
                    if (b2 == 0)
                        s = a2;
                    X = (a1 * b1) / s;
                
            
        }
    //int res = DoStuff(in_res, r_plt, r_sch, &X0, &r, &r0, &X);
    if (res == 2)
            printf("Resenie ne susestvuet.\n");
        if (res == 0)
        {
            d = r;
            d /= 10;
            r /= 10;
            X /= 10;
            while (r < length)
                r += X;
            while (d < width)
                d += X;
            printf("Razmer: %.1lf x %.1lf\n", d, r);
        }
}
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2017, 23:04
Ответы с готовыми решениями:

ERROR: stack depth limit exceeded
всем привет! Создал тригер для инсерта и в результате вставки выдает ошибку ERROR: stack depth...

Ошибка: Maximum call stack size exceeded
Решил поучиться js и решил написать простенькую прогу для решения квадратных уравнений(через...

Ошибка при решении задачи "Сумма максимума и минимума" - Time limit exceeded
Вот http://********/asp/do/index.asp?main=task&amp;id_course=1&amp;id_section=3&amp;id_topic=34&amp;id_problem=611...

Time limit exceeded
http://acm.timus.ru/problem.aspx?space=1&amp;num=1196 Уже все перепробовал, и всегда возникает...

2
Заклинатель змей
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
12.11.2017, 23:20 2
Setnad, это 4 разные ошибки, прогоняйте в дебаге разные значения. SegFaul -- доступ к несуществующему элементу
Bus -- обращение к элементу памяти, который не может быть адресован CPU
Превышен предел памяти -- исполнимый файл занимает слишком много ОЗУ
Переполнен лимит стека -- слишком много функций на стеке вызова, обычно из-за рекурсии
0
16 / 28 / 5
Регистрация: 10.11.2017
Сообщений: 90
12.11.2017, 23:30 3
Не знаю, почему сервер так описывает ошибки (все типы в кучу). Может, он просто код возврата проверяет? И у него это стандартное сообщение на все случаи жизни. В любом случае, программа не совсем корректно работает и на простых тестах:
Код
$ ./a.out 
Minimalny razmer:
3
3
Plitka:
-4
5
Neverny vvod.
Floating point exception
$ echo $?
136
exception случился. Не понятно, почему DoStuff возвращает коды ошибок, если код, использующий эту функцию, их проверку игнорирует. Для кого DoStuff старается?
0
12.11.2017, 23:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2017, 23:30
Помогаю со студенческими работами здесь

Time limit exceeded
Решаю задачки на одном сайте, там есть онлайн компилятор. Моя VS справляется, но компилятор с сайта...

Time limit exceeded
Добрый день. Программа - бинарный поиск правой границы в упорядоченном множестве фраз. Возникает...

Матрица инцидентности = Time-limit exceeded
Как переделать программу, чтобы время ее выполнения было &lt;0.250 sec? #include &lt;iostream&gt; using...

Acm.timus.ru Time limit exceeded
Добрый день. Сама задача http://acm.timus.ru/problem.aspx?space=1&amp;num=1021 и мое решение: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru