Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Bar-bar1an
1 / 1 / 6
Регистрация: 12.12.2014
Сообщений: 50
Завершенные тесты: 1
#1

Error in function

20.09.2016, 17:50. Просмотров 260. Ответов 3
Метки нет (Все метки)

Если Progonka(...) в окремой функции - не работает. Если код из функции скопировать в main() все работает.
Код ->
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void Progonka(int N,double **A, double* B , double* X);
int main(int argc, char *argv[])
{
    int N = 4;
    //double A[N][N];
    double** A = malloc(N * sizeof *A);
    for (int i = 0; i < N; i++)
      {
        A[i] = malloc(N * sizeof *A[i]);
      }
   // double B[N];
    //double X[N];
    double* B = malloc(N * sizeof *B);
    double* X = malloc(N * sizeof *X);
    A[0][0] = 1;    A[0][1] = 2;
    A[1][0] = 1;    A[1][1] = 10;   A[1][2] = -5;
                    A[2][1] = 1;    A[2][2] = -5;   A[2][3] = 2;
                                    A[3][2] = 1;    A[3][3] = 4;
 
    B[0] = -5;
    B[1] = -9;
    B[2] = -20;
    B[3] = -27;
 
    puts("A matrix\n");
 
    for(int i = 0;i < N;i++){
        for(int j = 0; j < N;j++){
        printf("%lf   ",A[i][j]);
        }
        putchar('\n');
    }
 
 
    Progonka(N, A, B, X);
 
    putchar('\n');
    puts("X vector....");
    for(int i = 0;i < N;i++)
       printf("%lf   ", X[i]);
 
    for (int i = 0; i < N; i++)
    {
       free(A[i]);
    }
    free(A);
    free(B);
    free(X);
    return 0;
}
 
void Progonka(int N, double **A, double* B , double* X){
    double Alp[N];
    double Bet[N];
    int i = 0;
 
    Alp[0] = -A[0][ 1] / A[0][0];
    Bet[0] = B[0] / A[0][0];
 
    for (i = 1; i < N; i++)
    {
      Alp[i] = -A[i][ i + 1] /(A[i][ i] + Alp[i - 1] * A[i][i - 1]) ;
      Bet[i] = (B[i] - A[i][i - 1] * Bet[i - 1]) / (A[i][ i] + Alp[i - 1] * A[i][i - 1]);
    }
 
    X[N] = (B[N] - A[N][ N - 1] * Bet[N - 1]) / (A[N][N] + Alp[N - 1] * A[N][N - 1]);
 
    for (i = N - 1; i >= 0; i--)
    {
        X[i] = Alp[i] * X[i + 1] + Bet[i];
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2016, 17:50
Ответы с готовыми решениями:

Error: too few arguments to function 'pow'
Как правильно записать формулу? f\left(x,y...

[Error] too few arguments to function 'pow'?
int main() { double b,a,x,y,z; scanf(&quot;%fl%fl%fl&quot;, &amp;z, &amp;x, &amp;y); ...

Error C4996: 'scanf': This function or variable may be unsafe
error C4996: 'scanf': This function or variable may be unsafe. Consider using...

Error C2668: 'pow': ambiguous call to overloaded function
Всем доброй ночи! Проблемка с функцией pow. Ошибка в строке 83: error C2668:...

Error C2064: term does not evaluate to a function taking 1 arguments
компилю в Visual Stdudio 2005 выдает ошибку error C2064: term does not...

3
shvyrevvg
523 / 496 / 255
Регистрация: 12.05.2016
Сообщений: 1,438
21.09.2016, 03:57 #2
Если у Вас что-то не работает, пишите ошибки, которые выдает компилятор.
Цитата Сообщение от Bar-bar1an Посмотреть сообщение
C
1
2
3
4
5
void Progonka(int N, double **A, double* B , double* X)
{ 
    double Alp[N]; // выделяйте память через malloc()
    double Bet[N]; // тут также
//......
У вас на этапе компиляции не понятно сколько памяти выделять под массив.
free() делается для всех указателей полученных с помощью malloc().
0
Bar-bar1an
1 / 1 / 6
Регистрация: 12.12.2014
Сообщений: 50
Завершенные тесты: 1
21.09.2016, 22:08  [ТС] #3
gcc -Wall -pedantic -std=c11 -g *.c && valgrind --leak-check=full --track-origins=yes ./a.out
==24704== Memcheck, a memory error detector
==24704== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==24704== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==24704== Command: ./a.out
==24704==
A matrix

==24704== Conditional jump or move depends on uninitialised value(s)
==24704== at 0x4E8A6A8: __printf_fp (printf_fp.c:379)
==24704== by 0x4E89078: vfprintf (vfprintf.c:1631)
==24704== by 0x4E8F848: printf (printf.c:33)
==24704== by 0x4008EE: main (main.c:38)
==24704== Uninitialised value was created by a heap allocation
==24704== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24704== by 0x400710: main (main.c:13)

Syscall param write(buf) points to uninitialised byte(s)
==24704== at 0x4F30A10: __write_nocancel (syscall-template.S:84)
==24704== by 0x4EB2B2E: _IO_file_write@@GLIBC_2.2.5 (fileops.c:1263)
==24704== by 0x4EB4338: new_do_write (fileops.c:518)
==24704== by 0x4EB4338: _IO_do_write@@GLIBC_2.2.5 (fileops.c:494)
==24704== by 0x4EB474A: _IO_file_overflow@@GLIBC_2.2.5 (fileops.c:859)
==24704== by 0x4EAB2C7: putchar (putchar.c:28)
==24704== by 0x400904: main (main.c:40)
==24704== Address 0x52032f8 is 24 bytes inside a block of size 1,024 alloc'd
==24704== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24704== by 0x4EA7184: _IO_file_doallocate (filedoalloc.c:127)
==24704== by 0x4EB54C3: _IO_doallocbuf (genops.c:398)
==24704== by 0x4EB4827: _IO_file_overflow@@GLIBC_2.2.5 (fileops.c:820)
==24704== by 0x4EB31BC: _IO_file_xsputn@@GLIBC_2.2.5 (fileops.c:1331)
==24704== by 0x4EA9677: puts (ioputs.c:40)
==24704== by 0x40089D: main (main.c:34)
==24704== Uninitialised value was created by a heap allocation
==24704== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24704== by 0x400710: main (main.c:13)
==24704==
1.000000 2.000000 0.000000 0.000000
1.000000 10.000000 -5.000000 0.000000
0.000000 1.000000 -5.000000 2.000000
0.000000 0.000000 1.000000 4.000000
==24704== Invalid read of size 8
==24704== at 0x400B69: Progonka (main.c:71)
==24704== by 0x400926: main (main.c:44)
==24704== Address 0x52031e0 is 0 bytes after a block of size 32 alloc'd
==24704== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24704== by 0x400710: main (main.c:13)
==24704==
==24704== Invalid read of size 8
==24704== at 0x400D16: Progonka (main.c:75)
==24704== by 0x400926: main (main.c:44)
==24704== Address 0x5203240 is 0 bytes after a block of size 32 alloc'd
==24704== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24704== by 0x400730: main (main.c:17)
==24704==
==24704== Invalid read of size 8
==24704== at 0x400D2E: Progonka (main.c:75)
==24704== by 0x400926: main (main.c:44)
==24704== Address 0x5203060 is 0 bytes after a block of size 32 alloc'd
==24704== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24704== by 0x4006DD: main (main.c:10)
==24704==
==24704== Invalid read of size 8
==24704== at 0x400D42: Progonka (main.c:75)
==24704== by 0x400926: main (main.c:44)
==24704== Address 0x18 is not stack'd, malloc'd or (recently) free'd
==24704==
==24704==
==24704== Process terminating with default action of signal 11 (SIGSEGV)
==24704== Access not within mapped region at address 0x18
==24704== at 0x400D42: Progonka (main.c:75)
==24704== by 0x400926: main (main.c:44)
==24704== If you believe this happened as a result of a stack
==24704== overflow in your program's main thread (unlikely but
==24704== possible), you can try to increase the size of the
==24704== main thread stack using the --main-stacksize= flag.
==24704== The main thread stack size used in this run was 8388608.
0
shvyrevvg
523 / 496 / 255
Регистрация: 12.05.2016
Сообщений: 1,438
22.09.2016, 05:45 #4
Смотрим
Цитата Сообщение от Bar-bar1an Посмотреть сообщение
C
1
2
3
4
for (i = 1; i < N; i++) { 
    Alp[i] = -A[i][ i + 1] /(A[i][ i] + Alp[i - 1] * A[i][i - 1]) ; 
    Bet[i] = (B[i] - A[i][i - 1] * Bet[i - 1]) / (A[i][ i] + Alp[i - 1] * A[i][i - 1]); 
}
В цикле вы пытаетесь получить элемент массива по индексу i+1, на последней итерации у вас выход за границу массива.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2016, 05:45

Ошибка 1 error C4996: 'fopen': This function or variable may be unsafe
есть такой код: // Лабораторная №5.cpp: определяет точку входа для консольного...

Ошибка: error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.
подскажите плиз в чем проблема? #include &lt;stdio.h&gt; #include &lt;conio.h&gt;...

Ошибка в поиске седловых точек: Error C2447: missing function header
в коде поиска седловых точек матрицы выдает ошибку - (56) : error C2447:...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru