Member 14053974 Ответов: 3

Получение "возвращаемого значения 3221226356" в коде C++


Я компилирую один пример кода. Но я получаю ответ, когда компилирую этот код для ввода = 5, если я изменяю ввод с 5 на 6., то один раз ответ пришел, но в следующий раз для того же ввода, бросая сообщение "возвращаемое значение 3221226356". Если я снова изменю ввод с 6 на 8, то снова придет это сообщение.


#include <iostream>
#include <string>
#include <cmath>

void loop1(float *a, int &k )                                \
{
    int i = k / 2 ;                                          \
    for (int x = 0 ; x < i ; x++ )                           \
    {
        a[x] = x ;                                           \
        std::cout<<"a = "<< a[x] <<'\n' ;                    \
    }
}

void loop2(float *a, int &i, int &j )                        \
{
    for (int x = i ; x < j ; x++ )                           \
    {
        a[x] = a[x-i] ;                                      \
        std::cout<<"a ["<<x<<"]= "<< a[x] <<'\n' ;           \
    }
}
void loop3(float *a, int &i)
{
    for (int x = 0 ; x < i ; x++ )
    {
        a[x] = x * x * x ;
        a[x] += a[x];

    }
}

int main()                                                   \
{
    int nx ;                                                 \
    float* xpos = NULL;                                      \
    xpos = new float[nx];                                    \

    std::cout<<"enter the value for nx " ;                   \
    std::cin>>nx ;                                           \
    int a = nx/2 ;                                           \
    std::cout<<"a (= nx/2 )= "<< a <<'\n' ;                  \


    loop1(xpos, nx );                                        \
    loop2(xpos, a, nx);                                      \

    for (int x = 0 ; x < nx ; x++ )                          \
    {
        std::cout<<"xpos = "<< xpos[x] <<'\n' ;              \
    }
/*  loop3(xpos, nx );                                        \  */

    for (int x = 0 ; x < nx ; x++ )                          \
    {
        std::cout<<"new  xpos = "<< xpos[x] <<'\n' ;         \
    }
    return 0 ;
}


Результат для ввода = 5
enter the value for nx 5
a (= nx/2 )= 2
a = 0
a = 1
a [2]= 0
a [3]= 1
a [4]= 0
xpos = 0
xpos = 1
xpos = 0
xpos = 1
xpos = 0
new  xpos = 0
new  xpos = 1
new  xpos = 0
new  xpos = 1
new  xpos = 0

--------------------------------
Process exited after 4.442 seconds with return value 0
Press any key to continue . . .



Результат для ввода = 6

enter the value for nx 6
a (= nx/2 )= 3
a = 0
a = 1
a = 2
a [3]= 0
a [4]= 1
a [5]= 2
xpos = 0
xpos = 1
xpos = 2
xpos = 0
xpos = 1
xpos = 2
new  xpos = 0
new  xpos = 1
new  xpos = 2
new  xpos = 0
new  xpos = 1
new  xpos = 2

--------------------------------
Process exited after 3.427 seconds with return value 0
Press any key to continue . . .



Результат для ввода = 8

<pre lang="c++">enter the value for nx 8
a (= nx/2 )= 4
a = 0
a = 1
a = 2
a = 3
a [4]= 0
a [5]= 1
a [6]=
--------------------------------
Process exited after 7.167 seconds with return value 3221226356
Press any key to continue . . .



У тебя есть хоть малейшее представление о том, что я сделал не так ?
Есть ли какое-то конкретное название такой ошибки?
Но я не могу понять, почему это не удалось.

Что я уже пробовал:

Я попытался варьировать входные данные от одного к другому. Но передаю сообщение.

Richard MacCutchan

Вам нужно использовать свой отладчик, чтобы увидеть, где завершается процедура. Вам также нужно удалить все эти ненужные обратные косые черты в вашем источнике.

KarstenK

nx нуждается в некоторой ценности!!! А как насчет использования отладчика?

3 Ответов

Рейтинг:
1

OriginalGriff

Посмотрите на свой код:

int main()                                                   \
{
    int nx ;                                                 \
    float* xpos = NULL;                                      \
    xpos = new float[nx];   
Сколько поплавков выделено в массиве? Поскольку вы не устанавливаете значение для nx он будет (если Вам повезет, это зависит от компилятора и настроек, которые вы ему дали) по умолчанию равен нулю.

И поскольку это локальная переменная, массив находится в стеке. Когда вы используете его, вы получаете доступ к частям стека, которые вообще не являются частью вашего массива, и вы повреждаете их при записи в массив. В этот момент может произойти все, что угодно!

Выделите некоторый подходящий размер для массива или выделите массив, как только вы узнаете, сколько элементов он должен иметь!


Рейтинг:
0

Richard MacCutchan

int nx ;                                                 \
float* xpos = NULL;                                      \
xpos = new float[nx];                                    \

Вы не установили значение для nx, поэтому Ваш массив может быть любого размера между -2,147,483,647 и +2,147,483,647.

И уберите эти обратные косые черты везде, как вы думаете, для чего они нужны?


Рейтинг:
0

CPallini

Чтобы исправить очевидное в вашем коде

#include <iostream>

void loop1(float a[], size_t k )
{
    size_t limit = k / 2 ;
    for (size_t x = 0 ; x < limit ; x++ )
    {
        a[x] = x ;
        std::cout << "a = " << a[x] << '\n' ;
    }
}

void loop2(float a[], size_t i, size_t j )
{
    for (size_t x = i ; x < j ; x++ )
    {
        a[x] = a[x-i] ;
        std::cout<<"a ["<<x<<"]= "<< a[x] <<'\n' ;
    }
}
void loop3(float a[], size_t i)
{
    for (size_t x = 0 ; x < i ; x++ )
    {
        a[x] = x * x * x ;
        a[x] += a[x];
    }
}

int main()
{
    int nx ;
    float* xpos = NULL;

    std::cout<<"enter the value for nx " ;
    std::cin>>nx ;

    xpos = new float[nx];

    int a = nx/2 ;
    std::cout<<"a (= nx/2 )= "<< a <<'\n' ;

    loop1(xpos, nx );
    loop2(xpos, a, nx);

    for (int x = 0 ; x < nx ; x++ )
    {
        std::cout<<"xpos = "<< xpos[x] <<'\n' ;
    }
/*  loop3(xpos, nx );                                         */

    for (int x = 0 ; x < nx ; x++ )
    {
        std::cout<<"new  xpos = "<< xpos[x] <<'\n' ;
    }
    delete [] xpos;
}


Вы должны дать значимые имена своим функциям.
Вы могли бы использовать std::vector вместо того, чтобы динамически выделять себе массив.