Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: что-то не так с моей программой, или баг g++ [SOLVED]  (Прочитано 1148 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Compinfer

  • Автор темы
  • Любитель
  • *
  • Сообщений: 67
    • Просмотр профиля
Здравствуйте, пишу программу, которая генерирует наборы положительных случайных чисел, сумма в каждом из которых равняется единице.
#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

void pfromu(double u[],int count,double x[])
{
double S=0;
for (int j=1;j<=count;j++){
x[j-1]=u[j-1];
for (int k;k<=j-1;k++) x[j-1]*=(1-u[k-1]);
S+=x[j-1];
//(1) cout<<"x_"<<j<<"="<<x[j-1]<<endl;
}
x[count]=1-S;
}


int main()
{
int n=3,j;
double p[n],u[n-1],ita;
for (int k=1;k<=200;k++) {
for (j=1;j<=n-1;j++) {
ita=((double)rand())/((double)RAND_MAX);
u[j-1]=1-pow(1.0-ita,(double)1/(n-j));
//(2) cout<<"u"<<u[j-1]<<endl;
// printf(" ");
}
pfromu(u,n-1,p);
for(j=1;j<=n;j++) cout<<p[j-1]<<" ";
cout<<endl;

}
return 0;
}
Проблема в том, что такой вариант программы работает неправильно, в тройках чисел встречаются отрицательные, однако стоит раскомментировать (2), этот эффект исчезает. printf(" ") тоже помогает. Это если использовать g++ "gcc версия 4.3.4 (Gentoo 4.3.4 p.10, pie-10.1.5)"

В Ubuntu ("gcc версия 4.3.3 (Ubuntu 4.3.3-5ubuntu4)") программа вылетает с Segmentation fault с кодом ошибки 139, после раскомментирования (2) - работает правильно

Под Windows ("gcc version 3.4.2 (mingw-special)") программа работает неправильно и с раскомментированным (2), однако ситуация исправляется, если раскомментировать (1).

В чем причина такой нестабильности, ведь команды (1) и (2) вообще ни на что не должны влиять?

p.s. с Си++ знаком очень мало.
« Последнее редактирование: 16 Ноября 2009, 08:13:38 от Compinfer »

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5665
  • Все по палатам!
    • Просмотр профиля
Re: что-то не так с моей программой, или баг g++
« Ответ #1 : 16 Ноября 2009, 01:30:18 »
for (int k;k<=j-1;k++) x[j-1]*=(1-u[k-1]);
Извините, я все еще учусь

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: что-то не так с моей программой, или баг g++
« Ответ #2 : 16 Ноября 2009, 01:37:37 »
#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
#define n 3
void pfromu(double u[],int count,double x[])
{
double S=0;
for (int j=1;j<=count;j++){
x[j-1]=u[j-1];
for (int k = 0;k<=(j-1);k++) x[j-1]*=(1-u[k-1]);
S+=x[j-1];
//(1) cout<<"x_"<<j<<"="<<x[j-1]<<endl;
}
x[count]=1-S;
}


int main()
{
int j;
double p[n],u[n-1],ita;
for (int k=1;k<=200;k++) {
for (j=1;j<=n-1;j++) {
ita=((double)rand())/((double)RAND_MAX);
u[j-1]=1-pow(1.0-ita,(double)1/(n-j));
//(2) cout<<"u"<<u[j-1]<<endl;
// printf(" ");
}
pfromu(u,n-1,p);
for(j=1;j<=n;j++) cout<<p[j-1]<<" ";
cout<<endl;

}
return 0;
}
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5665
  • Все по палатам!
    • Просмотр профиля
Re: что-то не так с моей программой, или баг g++
« Ответ #3 : 16 Ноября 2009, 01:43:08 »
for (int k = 0;k<=(j-1);k++) x[j-1]*=(1-u[k-1]);
при k =0 где взять элемент u[-1] ?
Извините, я все еще учусь

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: что-то не так с моей программой, или баг g++
« Ответ #4 : 16 Ноября 2009, 02:13:34 »
Не заметил :-[. Да k=1
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн Compinfer

  • Автор темы
  • Любитель
  • *
  • Сообщений: 67
    • Просмотр профиля
Re: что-то не так с моей программой, или баг g++
« Ответ #5 : 16 Ноября 2009, 08:10:03 »
спасибо! Глупейшая моя ошибка.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5665
  • Все по палатам!
    • Просмотр профиля
Вообще-то компилятор должен был выдавать предупреждение на эту ошибку. А пренебрегать предупреждениями не следует ;)
Извините, я все еще учусь

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Вообще-то компилятор должен был выдавать предупреждение на эту ошибку. А пренебрегать предупреждениями не следует ;)

Ничего не выдает, даже с -Wall
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5665
  • Все по палатам!
    • Просмотр профиля
Проверил, и действительно не выдает   :-\ Это как-то ненормально - на ничего не значащих местах кода выдает, а здесь нет.
Извините, я все еще учусь

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Для таких вещей есть Valgrind.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

 

Страница сгенерирована за 0.076 секунд. Запросов: 25.