Форум программистов, компьютерный форум CyberForum.ru

Debug Assertion Failed - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
11.06.2014, 02:39     Debug Assertion Failed #1
Привет всем. Написал такую программу.
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
#include <stdio.h>
 
int n, m;
int i, q, d;
 
void merge(int a[], int b[], int c[], int n, int m){
    int A(0), B(0);
 
    while((A + B) < (n + m))
    {
        if( (B >= m) || ( (A < n) && (a[A] >= b[B]) ) )
        {
            c[A + B] = a[A];
            ++A;
        } else
        {
            c[A + B] = b[B];
            ++B;
        }
    }
}
int main()
{
    FILE *f;
    FILE *e;
    f = fopen("merge.dat", "r");
 
    fscanf(f,"%d", &n);
    int *a = new int[n];
 
    for(i = 0; i < n;i++)
        fscanf(f,"%d", &a[i]);
    fscanf(f,"%d", &m);
    int *b = new int[m];
 
    for(q = 0;q < m;q++)
        fscanf(f,"%d", &b[q]);
    fclose(f);
 
    e = fopen("merge.sol", "w");
    int *c = new int[n + m];
 
    merge(a, b, c, n, m);
 
    for(d = 0; d < (n + m);d++)
        fprintf(e,"%d\n", c[d]);
    fclose(e);
 
    delete[]a;
    delete[]b;
    delete[]c;
 
    return 0;
}
Выводит ошибку "Debug Assertion Failed. Line 52". Скажите, в чем проблема?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2014, 02:39     Debug Assertion Failed
Посмотрите здесь:

C++ debug assertion failed
Debug assertion failed C++
ошибка debug assertion failed C++
Debug assertion failed C++
C++ Debug Assertion Failed
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2014, 02:45     Debug Assertion Failed #2
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Скажите, в чем проблема?
Открытие файла для чтения всегда проверять нужно. В файле что? Как создавался?
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
11.06.2014, 02:51  [ТС]     Debug Assertion Failed #3
alsav22, Я знаю, что нужно делать проверку. Но с проверкой система не примет ответ к задаче.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2014, 02:59     Debug Assertion Failed #4
Отладчиком смотрели, данные правильно читаются?
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
11.06.2014, 12:37  [ТС]     Debug Assertion Failed #5
alsav22, В общем, я нашел файл merge.dat, открыл его и оказалось, что он пуст. Сделал проверку и удостоверился в этом. Но как он может быть пуст, если я открываю его с флагом r и считываю с него данные?

Добавлено через 9 часов 1 минуту
Вопрос еще в силе. Объясните, почему мой файл merge.dat пуст? Ведь я с него считываю данные.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2014, 17:30     Debug Assertion Failed #6
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
общем, я нашел файл merge.dat
Поздравляю!
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
открыл его и оказалось, что он пуст
Какая неожиданность!...
Цитата Сообщение от alsav22 Посмотреть сообщение
В файле что? Как создавался?
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Но как он может быть пуст, если я открываю его с флагом r и считываю с него данные?
Цитата Сообщение от alsav22 Посмотреть сообщение
Отладчиком смотрели?
Как видите, что данные читаются?
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Объясните, почему мой файл merge.dat пуст?
Вы его заполняли, чтобы он не был пуст? Если нет, то почему он должен быть не пуст? Только от того, что вы его открываете для чтения?
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
11.06.2014, 17:53  [ТС]     Debug Assertion Failed #7
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы его заполняли, чтобы он не был пуст? Если нет, то почему он должен быть не пуст? Только от того, что вы его открываете для чтения?
Вот подобная программа, которую я писал как мне объяснили и она работает. Я ее так же писал как эту.
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
#include <stdio.h>
 
int main()
{
    long long int x1,y1,x2,y2,x3,y3;
    long long int a,b;
 
    FILE *c;
    FILE *d;
 
    c = fopen("trian.dat", "r");
    fscanf(c,"%lld %lld\n%lld %lld\n%lld %lld\n%lld %lld", &x1, &y1, &x2, &y2, &x3, &y3, &a, &b);
    fclose(c);
 
    d = fopen("trian.sol", "w");
 
    if((a-x1)*(y1-y2)-(b-y1)*(x1-x2) >= 0 && (a-x2)*(y2-y3)-(b-y2)*(x2-x3) >= 0 && (a-x3)*(y3-y1)-(b-y3)*(x3-x1) >= 0)
        fprintf(d,"YES");
    else
        fprintf(d,"NO");
    fclose(d);
 
    return 0;
}
Повторюсь, она работает. Хотя с файлами в ней я работаю так же, как в этой программе.
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
#include <stdio.h>
 
int n, m;
int i, q, d;
 
void merge(int a[], int b[], int c[], int n, int m){
    int A(0), B(0);
 
    while((A + B) < (n + m))
    {
        if( (B >= m) || ( (A < n) && (a[A] >= b[B]) ) )
        {
            c[A + B] = a[A];
            ++A;
        } else
        {
            c[A + B] = b[B];
            ++B;
        }
    }
}
int main()
{
    FILE *f;
    FILE *e;
    f = fopen("merge.dat", "r");
 
    fscanf(f,"%d", &n);
    int *a = new int[n];
 
    for(i = 0; i < n;i++)
        fscanf(f,"%d", &a[i]);
    fscanf(f,"%d", &m);
    int *b = new int[m];
 
    for(q = 0;q < m;q++)
        fscanf(f,"%d", &b[q]);
    fclose(f);
 
    e = fopen("merge.sol", "w");
    int *c = new int[n + m];
 
    merge(a, b, c, n, m);
 
    for(d = 0; d < (n + m);d++)
        fprintf(e,"%d\n", c[d]);
    fclose(e);
 
    delete[]a;
    delete[]b;
    delete[]c;
 
    return 0;
}
Так в чем же тогда проблема? Я готов к ответу "в программисте".
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2014, 18:06     Debug Assertion Failed #8
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Вот подобная программа, которую я писал как мне объяснили и она работает.
Даже смотреть не буду. На вопросы ответьте, если хотите разбираться.
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
11.06.2014, 20:26     Debug Assertion Failed #9
серьезно попробуй проверить что читается корректно все.
попробуй напиши чтение так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
if(fscanf(f, "%d", &n) != 1)
{
cout << "WTF" << endl;
while(1);
}
 
for(int i = 0; i < n; i++)
if(fscanf(f, "%d", &a[i]) != 1)
{
cout << "WTF 2" << endl;
while(1);
}
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
12.06.2014, 23:29  [ТС]     Debug Assertion Failed #10
Цитата Сообщение от alsav22 Посмотреть сообщение
В файле что? Как создавался?
Повторюсь, файл пуст. В нем ничего нет.
Цитата Сообщение от alsav22 Посмотреть сообщение
Отладчиком смотрели?
Смотрел. Может я не так смотрел. Но при отладке тоже выводит ошибку, как только доходит до функции main.
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
"Debug Assertion Failed. Line 52"
Отлаживал в меню Отладка. Первый раз это делал. Надеюсь, правильно.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 00:14     Debug Assertion Failed #11
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
файл пуст.
Извините за наивный вопрос: а почему он пуст?
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
файл пуст. В нем ничего нет.
В чём тогда вопрос? Хотите, чтобы ваш код читал данные из пустого файла?
На вопрос не ответили:
Цитата Сообщение от alsav22 Посмотреть сообщение
Как создавался?
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
13.06.2014, 00:41  [ТС]     Debug Assertion Failed #12
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
Как создавался?
Как это понять? Я читаю Дайтела и там нету ничего о создании файлов. Описывается только об открытии файлов для записи, чтения, чтения с конца, записи с конца.
Вот я так понимаю, что здесь
C++
1
f = fopen("merge.dat", "r");
я открываю файл, чтоб считать данные с него данные. А вот здесь
C++
1
e = fopen("merge.sol", "w");
открываю файл, чтоб записать в него результат. Я следую примерам из книги.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 00:50     Debug Assertion Failed #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Как это понять?
Понять это так: файл, который открывается для чтения, уже должен существовать (кстати, откуда он у вас появился, но пустой?). Создавать его можно вручную (блокнотом, например), и заносить туда данные вручную. Можно программно создавать, тогда нужно сначала открыть файл для записи, при этом файл создастся, и программно записать в него данные.
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Я читаю Дайтела и там нету ничего о создании файлов.
Не может быть, чтобы там об этом ничего не было сказано. Наверное, опять: читаете одно, смотрите другое, пишите третье?
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
13.06.2014, 01:37  [ТС]     Debug Assertion Failed #14
alsav22, Спасибо вам огромное. ВЫ ЖЕ МОЙ ДОРОГОЙ И ВРЕДНЫЙ ЧЕЛОВЕК Доделал программу.
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
#include <stdio.h>
 
int n, m;
int i, q, d;
 
void merge(int a[], int b[], int c[], int n, int m){
    int A(0), B(0);
 
    while((A + B) < (n + m))
    {
        if( (B >= m) || ( (A < n) && (a[A] >= b[B]) ) )
        {
            c[A + B] = a[A];
            ++A;
        } else
        {
            c[A + B] = b[B];
            ++B;
        }
    }
}
int main()
{
    FILE *g;
    FILE *f;
    FILE *e;
 
    g = fopen("merge.dat", "w");
    fprintf(g,"%d", n);
    int *a = new int[n];
 
    for(i = 0; i < n;i++)
        fprintf(g,"%d", a[i]);
    fprintf(g,"%d", m);
    int *b = new int[m];
 
    for(q = 0;q < m;q++)
        fprintf(g,"%d", b[q]);
    fclose(g);
 
    f = fopen("merge.dat", "r");
 
    fscanf(g,"%d", &n);
 
    for(i = 0; i < n;i++)
        fscanf(g,"%d", &a[i]);
    fscanf(g,"%d", &m);
 
    for(q = 0;q < m;q++)
        fscanf(g,"%d", &b[q]);
    fclose(f);
 
    e = fopen("merge.sol", "w");
    int *c = new int[n + m];
 
    merge(a, b, c, n, m);
 
    for(d = 0; d < (n + m);d++)
        fprintf(e,"%d\n", c[d]);
    fclose(e);
 
    delete[]a;
    delete[]b;
    delete[]c;
 
    return 0;
}
Все работает. Но мне все равно выводит "Неправильный ответ". Как же меня бесят эти "Неправильные ответы" Я проверял этот код без создания файлов. Ответ был верный.
Суть программы: вводятся 2 массива. Числа в них идут в убывающем порядке. Потом они объединяются в один массив, в котором все числа идут в убывающем порядке. Я решил воспользоваться процедурой слияния.

Добавлено через 2 минуты
В функции merge и происходит слияние.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:03     Debug Assertion Failed #15

Не по теме:

Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Спасибо вам огромное. ВЫ ЖЕ МОЙ ДОРОГОЙ И ВРЕДНЫЙ ЧЕЛОВЕК
Я знал, что мы подружимся...


Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Все работает.
Удивительное, буквально, рядом ...
C++
1
2
3
4
5
6
7
8
9
    int n, m;
...
    g = fopen("merge.dat", "w");
    fprintf(g,"%d", n);
    int *a = new int[n];
 
    for(i = 0; i < n;i++)
        fprintf(g,"%d", a[i]);
...
Создаёте файл и открываете его для записи, записываете туда неинициализированную переменную n, создаёте массив неизвестного размера, пустой. Записывете данные (какие, если он неинициализирован?) из этого массива в файл и т.д. И это всё работает? Вы в файл заглядывали, после такой записи?
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
13.06.2014, 02:42  [ТС]     Debug Assertion Failed #16
alsav22, Да, в файле 2 нуля... Но мне нужно сделать так, как в программе без файлов. То есть в программе без файлов я сам ввожу размер и элементы массива. То есть мне нужно сделать так, чтоб при каждом запуске программы в файле "merge.dat" были разные размеры и элементы массивов. Такое можно сделать?
На изображении пример входных и выходных данных.
Миниатюры
Debug Assertion Failed  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 03:36     Debug Assertion Failed #17
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
То есть мне нужно сделать так, чтоб при каждом запуске программы в файле "merge.dat" были разные размеры и элементы массивов. Такое можно сделать?
Можно. Делайте рандомные значения n и m, создавайте массивы, заполняйте их рандомными значениями, записывайте в файл.

Добавлено через 1 минуту
http://cppstudy.wordpress.com/2009/0...umbers-in-cpp/
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
13.06.2014, 03:58  [ТС]     Debug Assertion Failed #18
alsav22, Проверьте, пожалуйста. Теперь я правильно сделал?
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
#include <stdio.h>
#include <stdlib.h>
 
int n, m;
int i, q, d;
 
void merge(int a[], int b[], int c[], int n, int m){
    int A(0), B(0);
 
    while((A + B) < (n + m))
    {
        if( (B >= m) || ( (A < n) && (a[A] >= b[B]) ) )
        {
            c[A + B] = a[A];
            ++A;
        } else
        {
            c[A + B] = b[B];
            ++B;
        }
    }
}
int main()
{
    FILE *g;
    FILE *f;
    FILE *e;
 
    g = fopen("merge.dat", "w");
 
    fprintf(g, "%d", n = rand() % 100001);
    int *a = new int[n];
 
    for(i = 0; i < n;i++)
        fprintf(g,"%d", a[i] = 1 + rand() % 1000000001);
    fprintf(g, "%d", m = rand() % 100001);
    int *b = new int[m];
 
    for(q = 0;q < m;q++)
        fprintf(g,"%d", b[q] = 1 + rand() % 1000000001);
    fclose(g);
 
    f = fopen("merge.dat", "r");
 
    fscanf(g,"%d", &n);
 
    for(i = 0; i < n;i++)
        fscanf(g,"%d", &a[i]);
    fscanf(g,"%d", &m);
 
    for(q = 0;q < m;q++)
        fscanf(g,"%d", &b[q]);
    fclose(f);
 
    e = fopen("merge.sol", "w");
    int *c = new int[n + m];
 
    merge(a, b, c, n, m);
 
    for(d = 0; d < (n + m);d++)
        fprintf(e,"%d\n", c[d]);
    fclose(e);
 
    delete[]a;
    delete[]b;
    delete[]c;
 
    return 0;
}
Теперь в файле в одну строчку записано ОЧЕНЬ много чисел. Но при каждом запуске программы числа не изменяются. И программа выполняется долго. По идее, теперь будет ошибка "Превышено максимальное время работы".
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 04:16     Debug Assertion Failed #19
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Теперь в файле в одну строчку записано ОЧЕНЬ много чисел.
К чему такой максимальный размер массива - 100001?
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Но при каждом запуске программы числа не изменяются.
Информацию по ссылке читали?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 04:37     Debug Assertion Failed
Еще ссылки по теме:

C++ Debug assertion failed
Debug assertion failed C++
Debug Assertion Failed! C++

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

Или воспользуйтесь поиском по форуму:
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
13.06.2014, 04:37  [ТС]     Debug Assertion Failed #20
alsav22, В общем, я переделал немного и вот, что у меня получилось
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
#include <stdio.h>
 
int n, m;
int i, q, d;
 
void merge(int a[], int b[], int c[], int n, int m){
    int A(0), B(0);
 
    while((A + B) < (n + m))
    {
        if( (B >= m) || ( (A < n) && (a[A] >= b[B]) ) )
        {
            c[A + B] = a[A];
            ++A;
        } else
        {
            c[A + B] = b[B];
            ++B;
        }
    }
}
int main()
{
    FILE *g;
    FILE *f;
    FILE *e;
 
    g = fopen("merge.dat", "w");
 
    scanf("%d", &n);
    int *a = new int[n];
 
    for(i = 0; i < n;i++)
        scanf("%d", &a[i]);
 
    scanf("%d", &m);
    int *b = new int[m];
 
    for(q = 0;q < m;q++)
        scanf("%d", &b[q]);
 
    fprintf(g, "%d\n", n);
 
    for(i = 0; i < (n - 1);i++)
        fprintf(g,"%d ", a[i]);
    fprintf(g, "%d\n", a[n-1]);
 
    fprintf(g, "%d\n", m);
 
    for(q = 0;q < (m - 1);q++)
        fprintf(g,"%d ", b[q]);
    fprintf(g, "%d\n", a[m - 1]);
    fclose(g);
 
    f = fopen("merge.dat", "r");
 
    fscanf(g,"%d", &n);
 
    for(i = 0; i < n;i++)
        fscanf(g,"%d", &a[i]);
    fscanf(g,"%d", &m);
 
    for(q = 0;q < m;q++)
        fscanf(g,"%d", &b[q]);
    fclose(f);
 
    e = fopen("merge.sol", "w");
    int *c = new int[n + m];
 
    merge(a, b, c, n, m);
 
    for(d = 0; d < (n + m);d++)
        fprintf(e,"%d\n", c[d]);
    fclose(e);
 
    delete[]a;
    delete[]b;
    delete[]c;
 
    return 0;
}
Сейчас проверять буду.

Добавлено через 3 минуты
И снова неправильный ответ Это несправедливость.

Добавлено через 6 минут
alsav22, Скажите, а вот в выходном файле "merge.sol" я создаю массив C[n + m]. Для выходного файла переменные n, m уже известны?
Yandex
Объявления
13.06.2014, 04:37     Debug Assertion Failed
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru