Функция установки номера на ноль сама? - PullRequest
0 голосов
/ 29 марта 2012

Моя функция каким-то образом меняет число. Я передаю его в ноль, даже если я задаю произвольное число переменной, функция меняет его на ноль?
Что здесь происходит? Как это вообще возможно?

Здесь определены переменные

int count,i,binnumber,*histo,tempmax,tempmin;

float *data,y,temp,binwidth;

tempmin = floor(temp);
binnumber = ceil(sqrt((count-1)));          
//out_stream << binnumber << endl;          
binwidth = abs(tempmax-tempmin);
binwidth = binwidth/binnumber;  

for (int i=0; i<count; i++)
{
    data[i] = data[i] - tempmin; 
    out_stream2 << data[i] << "\n";
}
func.histogram(data ,histo, binwidth, binnumber);       //create array for histogram use
int holder = 0; 

и это переходит к функции, которая все время обнуляет ее

void DSP1D::histogram(float *data,int *histo, float _binwidth, int _binnumber)
{

    binwidth = _binwidth;
    cout << "binwidth is: " << binwidth <<  endl;
    binnumber = _binnumber;
    for( int i = 0; i < count; i++ )
    {
        binnumber = data[i]/binwidth;

        binnumber = binnumber / binwidth ;
        //binnumber = floor(binnumber);
        //cout << binnumber << "bin one\n" ;
        histo[binnumber] = histo[binnumber] + 1 ; //possibly import sorted numberlist and place sorted numbers in appropriate bins
    }
} 

binwidth - это значение, которое становится равным нулю, и мы используем

cout << "binwidth is: " << binwidth << endl;

чтобы проверить значение, помогите пожалуйста?

1 Ответ

0 голосов
/ 30 марта 2012

Из того, что я могу сказать из вашего кода - есть ряд проблем:

int count,i,binnumber,*histo,tempmax,tempmin;

float *data,y,temp,binwidth;

tempmin = floor(temp);
binnumber = ceil(sqrt((count-1)));          
//out_stream << binnumber << endl;          
binwidth = abs(tempmax-tempmin);
binwidth = binwidth/binnumber;

1) Вы используете temp, tempmax, подсчитываете все, не назначая их в первую очередь. Это означает, что в них будет какое-то случайное значение (какое бы значение не было уже в памяти, где была размещена каждая переменная). Чем они должны быть? Вы пропустили код между ними? Если count меньше единицы, вам также придется использовать какие-то мнимые числа в вашей программе, потому что sqrt ((count - 1)), а также binnumber будут случайными (если программа не останавливается, потому что эта базовая функция cmath sqrt не работает с мнимыми числами)

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

3) binwidth устанавливается на абсолютное значение tempmax - tempmin, оба из которых имеют случайные значения, поэтому binwidth также будет иметь некоторое случайное значение.

4) если вы дойдете до линии, где binwidth = binwidth / binnumber, поймите, что, поскольку вы используете все целые числа для деления, вы вернете int (в основном, остаток будет отброшен), поэтому вам потребуется бросьте одну сторону, как это:

binwidth = (float) binwidth / binnumber, или binwidth = bindwidth / (float) binnumber, или binwidth = (double) binwidth / binnumber, или bindwidth = binwidth / (double) binnumber.

Плюс - конечно, если binnumber равен 0 (и он может быть здесь, потому что он случайный, вы можете получить сбой), вы можете захотеть сделать что-то вроде этого:

if (binnumber) binwidth = (double) binwidth / binnumber; - или какое-то решение

if (binnumber) совпадает с if (binnumber! = 0), в C и C ++ все значения, отличные от 0, имеют значение true, а 0 - false.

Так что да, в основном у вас много проблем с вашим кодом, и я бы посоветовал вам убедиться, что вы не используете переменные в выражении или формуле, не присваивая их заранее, и попробуйте распечатать значение binnumber для различных ставит перед кодом до.

Подождите секунду, вы даже не распределили * данные, возможно сделать то, что вы сделали с данными, ваш компьютер будет часто позволять это до точки, пока длина не велика, есть ли большая недостающий кусок между вашим кодом? Где ваши переменные инициализируются?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...