Pokaż wyniki 1 do 8 z 8

Temat: [c++] odwolanie sie do wartosci uzyskanych w innej funkcji

  1. #1
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie [c++] odwolanie sie do wartosci uzyskanych w innej funkcji

    Tworze program potrzeby mi do obliczen fizycznych i napotkalam na mly problem.

    Storzylam strukture w pliku date.h;

    Kod:
    typedef struct {
      int n;
      double r, ze1, ze2;
      } int_par_t;
    
      typedef struct {
      double s12, t11;
      } int_com_t;
    Mam nastepujaca funkcje w pliku col.cpp
    Kod:
    #include<iostream>
    #include"date.h"
    
      mat_com_t colect(int_com_t int_com)
      {
        mat_com_t mat_com;
    
        mat_com.s[0][0] = 1.0;
        mat_com.s[0][1] = int_com.s12;
        mat_com.s[1][0] = mat_com.s[0][1];
        mat_com.s[1][1] = 1.0;
    
      }
    w pliku integral.cpp jest znajduje sie funcja:
    Kod:
    #include "date.h"
    #include <iostream>
    #include<math.h>
    using namespace std;
    
    void integrl(int_par_t int_par)
     {
       double d1[3], a1[3], d2[3], a2[3], r2;
       int n;
       double r, ze1, ze2; 
       n=int_par.n;
       r=int_par.r;
     
       int_com_t int_com;
       
         r2 = r * r;
    
       for(int i=0;i<n;i++) {
       a1[i] = ex[n-1][i] * (ze1 * ze);
       d1[i] = co[n-1][i] * pow(2.0 * a1[i] / pi, 0.8);
       a2[i] = ex[n-1][i] * (ze2 * ze2);
       d2[i] = co[n-1][i] * pow(2.0 * a2[i] / pi, 0.8);
       }
    
        
        int_com.s12 = 0.0;
     
        for(i=0;i<n;i++)
        for(j=0;j<n;j++) {
       int_com.s12 += s_(a1[i], a2[j], r2) * d1[i] * d2[j];
        }
     }
    w pliku s.cpp:
    Kod:
     double s_(double a, double b, double rab2)
       {
       return (pow(pi / (a + b), 1.5) * exp(-a * b * rab2 / (a+b) ));
       }
    Problem pojawia mi sie w pliku col.cpp. W tej funkcji chcialbym odwlolac sie do wartosci otrzymanych w integral.cpp, tzn. mat_com.s[0][1] = int_com.s12;

    Zastosowalam nawet w pliku integral.cpp :
    Kod:
     static int_com_t int_com;
    , ale nic to nie zmienilo.

    Czy jest ktos wstanie mi pomoc?

  2. #2
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Lightbulb

    To może zwracaj ten int_com jako wynik funkcji integrl i przekazuj do colect w argumencie.

    W funckji colect masz zadeklarowany typ zwracany jako mat_com_t, a nic nie zwracasz.

    Polecam:
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  3. #3
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    [QUOTE=Rolek;62722]To może zwracaj ten int_com jako wynik funkcji integrl i przekazuj do colect w argumencie.

    W funckji colect masz zadeklarowany typ zwracany jako mat_com_t, a nic nie zwracasz.
    Zgadza sie, nie skopiowalam wszystkiego, juz na koncu napisalam: return mat_com;

    Funkcje itegral przerobilam:
    Kod:
     int_com_t integrl(int_par_t int_par)
       {
         int_com_t int_com;
       
         //dalsze_instrukcje;
       
         return int_com;
       }
    Jednakze problem nie zniknal. Nadal funkcja colect nie pobiera warosci uzyskanych w funkcji integrl.

  4. #4
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Question

    Cytat Napisał Gosik Zobacz post
    Nadal funkcja colect nie pobiera warosci uzyskanych w funkcji integrl.
    Hmmm... ale przekazujesz wynik integrl jako argument do colect?
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  5. #5
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Funkcja colect wyglada nastepujaco:
    Kod:
       int_com_t integrl(int_par_t int_par);
       {
        //instrukcje
         return mat_com;
        }
    Wg mnie wynik integrl jest przekazywany do funkcji colect. Jednakze moje myslenie moze byc bledne.

  6. #6
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Question

    Cytat Napisał Gosik Zobacz post
    Funkcja colect wyglada nastepujaco:
    Kod:
       int_com_t integrl(int_par_t int_par);
       {
        //instrukcje
         return mat_com;
        }
    Pokazałaś funkcję integrl


    Cytat Napisał Gosik Zobacz post
    Wg mnie wynik integrl jest przekazywany do funkcji colect.
    Sam z siebie się nie przekaże; to, że zmienne mają takie same nazwy nic nie znaczy bo należą one do różnych zakresów widzialności.
    Powinnaś przekazywać tak
    Kod:
    int_com_t wynik = integrl(twoje_int_par);
    mat_com_t wynik2 = colect(wynik);
    lub od razu
    Kod:
    mat_com_t wynik2 = colect(integrl(twoje_int_par));
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  7. #7
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Udalo sie!
    Bardzo Ci dziekuje za pomoc!!!!
    Ostatnio edytowane przez Gosik : 02-24-2013 - 00:04

  8. #8
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Chcialabym sie jeszcze doradzic w jednej sprawie.

    Pragne w swoim programie zastosowac dyanamiczna alokacje pamieci.

    mam plik date.h:
    Kod:
    typedef struct {
      int n;
      double r, ze1, ze2;
      } int_par_t;
    
      typedef struct {
      double **s;     //TABLICA!
      } int_com_t;
    I mam teraz takie pytanie, czy dynamiczna alokacje pamieci i zwolnienie pamieci tworze w kazdej funkcji?
    czyli

    w pliku col.cpp:
    Kod:
    #include<iostream>
    #include"date.h"
    
      mat_com_t colect(int_com_t int_com)
      {
        mat_com_t mat_com;
      
        mat_com.s = new double *[2]; 
        for (int i = 0; i < 2; i++) mat_com.s[i] = new double [2];
       
        mat_com.s[0][0] = 1.0;
        mat_com.s[0][1] = int_com.s12;
        mat_com.s[1][0] = mat_com.s[0][1];
        mat_com.s[1][1] = 1.0;
    
     for(int i = 0;i <2 ;i++) delete [] mat_com.s[i];
     delete []mat_com.s;
     
      }
    plik integral.cpp:
    Kod:
    #include "date.h"
    #include <iostream>
    #include<math.h>
    using namespace std;
    
    void integrl(int_par_t int_par)
     {
       double d1[3], a1[3], d2[3], a2[3], r2;
       int n;
       double r, ze1, ze2; 
       n=int_par.n;
       r=int_par.r;
     
       int_com_t int_com;
       
       mat_com.s = new double *[2]; 
       for (int i = 0; i < 2; i++) mat_com.s[i] = new double [2];
    
         
         r2 = r * r;
    
       for(int i=0;i<n;i++) {
       a1[i] = ex[n-1][i] * (ze1 * ze);
       d1[i] = co[n-1][i] * pow(2.0 * a1[i] / pi, 0.8);
       a2[i] = ex[n-1][i] * (ze2 * ze2);
       d2[i] = co[n-1][i] * pow(2.0 * a2[i] / pi, 0.8);
       }
    
        
        int_com.s12 = 0.0;
     
        for(i=0;i<n;i++)
        for(j=0;j<n;j++) {
       int_com.s12 += s_(a1[i], a2[j], r2) * d1[i] * d2[j];
        }
     for(int i = 0;i <2 ;i++) delete [] mat_com.s[i];
     delete []mat_com.s;
         
     }

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj