Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что происходит? Срочно 
V
    Опции темы
PandaRus
Дата 24.3.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 27.12.2006

Репутация: нет
Всего: нет



...Извините за название темы.


Добрый день.


Моя первая программа на Си.

Код

//=========================================================================================================================
//--------------------------------------- Ïðîãðàììà ìîäåëèðîâàíèÿ ïðîòåêàíèÿ òîêîâ ----------------------------------------
//=========================================================================================================================

#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
    FILE *outfile;
    outfile=fopen("1.txt","w");

    int i,j,m,k,s,r,n,si,rj,h,hm,ii;
    float Ps[15][15][31],Pr[15][16][30],Ph[16][15][30],s1,G1,I1;

    float** G=new float*[6750];
    for(i=0;i<6750;i++)
        G[i]=new float[6750];

    float* Fi=new float[6750];
    float* F=new float[6750];
    float* I=new float[6750];
    float* S=new float[6750];



//Ââîä ïàðàìåòðîâ íà ìîäåëèðîâàíèå------------------------------------------------------------------------------------------
    s=15;                            //ðàçìåðû òåëà
    r=30;
    h=15;
    k=s*r*h-1;                        

    for(i=1; i<=k; i++)                //ìåñòà ïîäêëþ÷åíèÿ òîêîâûõ ýëåêòðîäîâ
        I[i]=0;
    I[3901]=1;
    I[4000]=-1;                         
    
    for(m=1; m<=h; m++)
        for(i=1; i<=s; i++)
            for(j=0; j<=r; j++)
                Ps[m][i][j]=0;
    for(m=1; m<=h; m++)
        for(i=0; i<=s; i++)
            for(j=1; j<=r; j++)
                Pr[m][i][j]=0;
    for(m=0; m<=h; m++)
        for(i=1; i<=s; i++)
            for(j=1; j<=r; j++)
                Ph[m][i][j]=0;

    for(m=1; m<=h; m++)                //çàäàíèå õàðàêòåðèñòèêè òåëà
        for(i=1; i<=s; i++)
            for(j=1; j<=r-1; j++)
                Ps[m][i][j]=1;
    for(m=1; m<=h; m++)
        for(i=1; i<=s; i++)
            for(j=1; j<=r-1; j++)
                Pr[m][i][j]=1;
    for(m=1; m<=h-1; m++)
        for(i=1; i<=s; i++)
            for(j=1; j<=r; j++)
                Ph[m][i][j]=0.1;
//=========================================================================================================================

//Ôîðìèðîâàíèå ìàòðèöû ïðîâîäèìîñòåé G-------------------------------------------------------------------------------------
    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
            G[i][j]=0;

    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
            if(i==j)
            {    
        //        r=30;
                hm=(i-i%(r*s))/r*s;
                if(hm==0)
                    hm=1;
                ii=i-(hm-1)*r*s;
                rj=ii%r;
                if(rj==0)
                    rj=r;
                if(ii==rj)
                    si=1;
                else
                    si=(ii-rj)/r+1;
                G[i][j]=Pr[hm][si-1][rj]+Pr[hm][si][rj]+Ps[hm][si][rj-1]+Ps[hm][si][rj]+Ph[hm][si][rj]+Ph[hm-1][si][rj];
            }

/*    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
        {
            if(j==i+1)
            {
                rj=i%r;
                if(rj==0)
                    rj=r;
                if(i==rj)
                    si=1;
                else
                    si=(i-rj)/r+1;
                G[i][j]=-Ps[hm][si][rj];
            }
            if(j==i-1)
            {
                rj=i%r;
                if(rj==0)
                    rj=r;
                if(i==rj)
                    si=1;
                else
                    si=(i-rj)/r+1;
                G[i][j]=-Ps[hm][si][rj-1];
            }
            if(j==i+r)
            {
                rj=i%r;
                if(rj==0)
                    rj=r;
                if(i==rj)
                    si=1;
                else
                    si=(i-rj)/r+1;
                G[i][j]=-Pr[hm][si][rj];
            }
            if(j==i-r)
            {
                rj=i%r;
                if(rj==0)
                    rj=r;
                if(i==rj)
                    si=1;
                else
                    si=(i-rj)/r+1;
                G[i][j]=-Pr[hm][si-1][rj];
            }
            if(j==i+1)
            {
                rj=i%r;
                if(rj==0)
                    rj=r;
                if(i==rj)
                    si=1;
                else
                    si=(i-rj)/r+1;
                G[i][j]=-Ph[hm][si][rj];
            }
            if(j==i+1)
            {
                rj=i%r;
                if(rj==0)
                    rj=r;
                if(i==rj)
                    si=1;
                else
                    si=(i-rj)/r+1;
                G[i][j]=-Ph[hm][si][rj];
            }
        }                                */
//==========================================================================================================================
//    for(i=1; i<=k; i++)
//    {    
//        printf("\n");
//        for(j=1; j<=k; j++)
//            printf("% 2.0f",G[i][j]);
//    }
//Ïðèâåäåíèå ìàòðèöû G ê òðåóãîëüíîìó âèäó----------------------------------------------------------------------------------
    for(i=1; i<=k; i++)
    {    
        for(j=1; j<=k; j++)
            S[j]=G[i][j];
        s1=S[i];
        I1=I[i];
        for(j=i+1; j<=k; j++)
            if (G[j][i]!=0)
            {
                G1=G[j][i];
                for(n=i; n<=k; n++)
                    G[j][n]=G[j][n]-S[n]*G1/s1;
                I[j]=I[j]-I1*G1/s1;
            }
    }        
//==========================================================================================================================

//Âû÷èñëåíèå ïîòåíöèàëîâ----------------------------------------------------------------------------------------------------
    Fi[k]=I[k]/G[k][k];
    for(i=k-1; i>=1; i--)
    {    
        F[i]=0;
        for(j=i+1; j<=k; j++)
            F[i]=F[i]+Fi[j]*G[i][j];
        Fi[i]=(I[i]-F[i])/G[i][i];
        
    }
//==========================================================================================================================

//Âûâîä ìàññèâà ïîòåíöèàëîâ â ôàéë------------------------------------------------------------------------------------------    
    for(i=1; i<=k; i++)
    {    
        printf("\n");
//        for(j=1; j<=k; j++)
//            printf("% 3.2f",G[i][j]);
        printf("  % 3.5f",I[i]);
    }
        printf("\n");    printf("\n");
    
    
    Fi[k+1]=0;
    n=1;
    for(i=1; i<=s; i++)
    {
        for(j=1; j<=r; j++)
        {    
            fprintf(outfile,"  % 7.6f",Fi[n],outfile);
            n=n+1;
        }
        fprintf(outfile,"\n");
    }
//==========================================================================================================================

    fclose(outfile);
    for(i=0;i<6750;i++)
    {
        delete [] G[i];
    }
    delete [] G;
    getch();
    return 0;
}




Вопросы:

Почему переменная r=0, при выполнении строки 75? Где она обнуляется? Как исправить?

Почему не считается строка 86 (если предварительно r=30 (74 строка))? Как исправить?

Во всем виновато динамическое выделение памяти? Если да - как исправить?

Как прогонять программу построчно с выводом значений каждой переменной?


Очень требуется ваша помощь!
С уважением, Иван.
Модератор: Название темы должно отражать ее суть!

Это сообщение отредактировал(а) MAKCim - 24.3.2007, 18:06
PM MAIL   Вверх
zkv
Дата 24.3.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(PandaRus @  24.3.2007,  17:20 Найти цитируемый пост)
Почему переменная r=0, при выполнении строки 75?

а почему вы решили, что там она равна 0?
Цитата(PandaRus @  24.3.2007,  17:20 Найти цитируемый пост)
Почему не считается строка 86 (если предварительно r=30 (74 строка))? 

еще бы знать что вы там пытаетесь получить
Цитата(PandaRus @  24.3.2007,  17:20 Найти цитируемый пост)
Во всем виновато динамическое выделение памяти? 

с чего вдруг?
Цитата(PandaRus @  24.3.2007,  17:20 Найти цитируемый пост)
Как прогонять программу построчно с выводом значений каждой переменной?

скажите хоть, что за компилятор у вас?
PM MAIL   Вверх
threef
Дата 25.3.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Вряд ли кто будет изучать 238 строк Вашего кода. Необходимо пользоваться функциями - так Вы быстрее сможете локализовать ошибку. Для поиска ответа на Ваши вопросы попытайтесь 1 - использовать отладчик 2 - использовать отладочную промежуточную печать значений переменных. Успехов.
PM MAIL   Вверх
PandaRus
Дата 25.3.2007, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 27.12.2006

Репутация: нет
Всего: нет



Саму программу проверять не надо, прошу обратить внимание на текст программы до 86 строки включительно.

Пишу на Вижуал Си++ 6.0

Интересует, почему при проходе программы с 41 на 42 (нашел функцию Run to Cursor) строку каким-то не понятным мне образом обнуляется r и некоторые другие переменные - что их обнуляет и как с этим бороться?

Цитата

Цитата

Почему не считается строка 86 (если предварительно r=30 (74 строка))?  


еще бы знать что вы там пытаетесь получить

- простое суммирование элементов. Интересует, почему не работает, и почему начинает работать, как только убрать все слогаемые-массивы и заместо их присваивать просто числа?
PM MAIL   Вверх
zkv
Дата 25.3.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(PandaRus @  25.3.2007,  13:38 Найти цитируемый пост)
Интересует, почему при проходе программы с 41 на 42 (нашел функцию Run to Cursor) строку каким-то не понятным мне образом обнуляется r и некоторые другие переменные - что их обнуляет и как с этим бороться?

вы наверное имеете ввиду, просмотр значений переменной под отладчиком в окне watch? К сожалению, ему нельзя доверять на 100%. Если хотите установить истину, используйте макрос TRACE() - пример:
Код

TRACE("\nLine 41: r == %d\n", r );

ставите это на 41 строку в вашей проге и смотрите в окно Output.

Можно конечно использовать обычные средства вывода при трассировке, просто TRACE не придется выковыривать из проги после отладки.

Вообще, судя по коду, переменная r у вас нигде не обнуляется (хотя это только первичный осмотр).
Цитата(PandaRus @  25.3.2007,  13:38 Найти цитируемый пост)
- простое суммирование элементов. Интересует, почему не работает, и почему начинает работать, как только убрать все слогаемые-массивы и заместо их присваивать просто числа? 

хм, ну посмотрите, что у вас в слагаемых - массивах перед суммированием.
PM MAIL   Вверх
BigHeart
Дата 25.3.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



PandaRus, я бы на твоём месте во первых написал бы что это программа должна делать для начала, чтобы в ней легче было разобраться, а вообще ясно только что работа с трёхмерной матрицей. во вторых не следует объявлять ткую кучу int'ов в самом начале, их можно объявить в каждом цикле - это тебе же упростит жизнь. 
Код

for ( int count = 0; count < ...; ++ count )
     for ( int count_1 = 0; count_1 < ...; ++ count_1 )
          for ( int count_2 = 0; count_2 < ...; ++ count_2 )
 
Цитата

Во всем виновато динамическое выделение памяти?

тебе не доступно столько статической памяти smile 
Цитата

outfile=fopen("1.txt","w");

outfile = fopen ("D:\\1.txt","w") //(например)
Цитата

Как прогонять программу построчно с выводом значений каждой переменной?

если у тебя Visual Studio 2003 или 2005, то F5. выход Shift+F5.
я так понимаю, что проблема в делении на 0?

 
PM MAIL   Вверх
PandaRus
Дата 25.3.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 27.12.2006

Репутация: нет
Всего: нет



Программа.

Задача.
Кубическое тело виртуально бьется на кубики. Углы кубов - узлы в теле (sxrxh), их ребра - значения проводимостей между узлами в теле (Ps,Pr,Ph). Получается виртуальная сетка. Программа ищет напряжение в каждом узле при подключении источника тока к любым узлам. Затем в МатЛабе смотрю распространение тока (градиент напряжения).

Метод.
Каждому узлу присваивается свой номер (от 1 до i=sxrxh). Составляется матрица проводимостей G(ixj). Если i=j, то элемент матрицы равен сумме проводимостей между узлом и соседними узлами. Остальные элементы i,j равны проводимости, соединяющей узлы i и j. То-есть практически все элементры матрицы равны 0, так как любой узел соединяется проводимостью максимум с 6 другими узлами.
Составляется столбец I[1xi],  где все элементы равны 0 кроме тех, чьи порядковые номера равны номерам узлов, подключенных к источникам тока. Затем решается GxFi=I, в результате чего находим Fi - напряжение в каждой точке.

Точно такая-же программа, более простая, для плоскости работает. Меня именно удручает непонятные для меня процессы при прогоне программы (в программе для 2D таким и не пахло):

Строка 75: деление на ноль (почему r=0)? Помогите.
Строка 86: не вычисляется (если разкоментирована строка 74 для обхода ДЕЛНИЕ НА НОЛЬ) (видимо слагаемые становятся нехорошими, аналогично, как и с r). Помогите.

Меня интересует именно эти два момента. Как избавиться?
PM MAIL   Вверх
nickless
Дата 25.3.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Несколько замечаний к коду.

Массивы float Ps[15][15][31], Pr[15][16][30], Ph[16][15][30] разного размера. Это так и задумано?

В любом случае во всех for-ах используются s=15; r=30; h=15 как границы, причём то с 0 то с 1, то до <=r то <=r-1 вперемешку, в результате несколько раз происходит запись за пределы массивов (кстати инициализировать всё 0, а потом сразу 1 не очень эфективно  smile  ).
Так как массивы в стеке, при этом затирается половина локальных переменных и еще бог знает что, так что разберись сначала с границами, а потом уже со всем остальным.

Это сообщение отредактировал(а) nickless - 25.3.2007, 18:04


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
PandaRus
Дата 25.3.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 27.12.2006

Репутация: нет
Всего: нет



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

Спасибо форумчанам за участие, превратившееся для меня в моральную поддержку.

Это сообщение отредактировал(а) PandaRus - 25.3.2007, 20:33
PM MAIL   Вверх
JackYF
Дата 26.3.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(PandaRus @  24.3.2007,  17:20 Найти цитируемый пост)
Моя первая программа на Си.


Извините за оффтоп, но если это первая программа на Си, то какая же будет десятая... smile
Мне просто интересно  smile 



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.