Passare un elemento di una vettore ad una funzione

Messaggioda frnero » 27/01/2017, 19:59

Salve,
sto cercando, con qualche difficoltà, di convertire un programma da Mathlab al c++. Ho un problema con il passare un elemento di un vettore ad una funzione. La mia funzione $Residuo$ ha bisogno di un valore del vettore $x$ ,x[i], per poter calcolare il valore da me voluto. Ho capito che in C++ si deve passare il valore dell'indirizzo di memoria dell'elemento del vettore e non direttamente il valore del vettore, tuttavia non sono troppo esperto con i puntatori e mi continua a dare errore. Come potrei fare? Grazie

Codice:
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

//Variabili da rappresentare
float yN, J, dy;

int N = 1000;
//Intervallo di rappresentazione
float Inizio = 0;
float Fine = 10;
float dx = (Fine-Inizio) / N;
// Per l'equazione
float ValIniziale = 0;
//Tolleranza per Newton
double toll = 1e-7;

vector<float> x(float Inizio, float Fine, float dx) {
   vector<double> vet;
   while (Inizio <= Fine) {
      vet.push_back(Inizio);
      Inizio += dx;         
   }
}

float Residuo(float y, float yN, float* x) {
   y = yN - y + dx*(cos(x)*y - exp(-sin(x)));
   return y;
}

float Jacobiano(float* x) {
   J = 1 - dx*cos(x);
   return J;
}

float y = ValIniziale;

int main() {

   for (int i = 0; i <= N; i++) {

      float res = 0;

      while (res < toll) {

         //Ciclo di Newton
         res = Residuo(y, yN, x[i]);
         dy = -res / Jacobiano(x[i]);
         yN = dy + y;
         cout << dy << endl;

      }

      y = yN;

      cout << "Ciclo " << i << endl;

   }

}
frnero
Junior Member
Junior Member
 
Messaggio: 155 di 332
Iscritto il: 11/06/2013, 21:28

Re: Passare un elemento di una vettore ad una funzione

Messaggioda apatriarca » 27/01/2017, 21:05

Quale sarebbe il codice matlab che vorresti convertire? Non ho ancora iniziato a dare una occhiata al codice ma immagino possa essere utile come riferimento.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4518 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Passare un elemento di una vettore ad una funzione

Messaggioda apatriarca » 27/01/2017, 21:10

Il C++ non supporta alcuna operazione su matrici o array. Pure operazioni come copiare i valori da un vettore ad un altro vanno scritti per ogni elemento a meno di usare funzioni apposite. Certamente non è possibile applicare funzioni come cos, sin, exp.. su un intero array per esempio. Non è neanche possibile sommare un singolo valore con un array o due array insieme. Infine, quando si passa un array ad una funzione come puntatore, questo perde la sua dimensione che va quindi passata come argomento aggiuntivo.

A meno di usare una qualche libreria matematica la conversione è insomma molto più complicata che trasferire le operazioni da un linguaggio all'altro in modo meccanico.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4519 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Passare un elemento di una vettore ad una funzione

Messaggioda frnero » 28/01/2017, 11:39

Me ne sono reso conto, ieri con non poca fatica sono riuscito a convertire il codice. Adesso però ho un altro problema quello della divisione del codice per generalizzarlo. Voglio creare più sotto-funzioni che vengano richiamate di volta in volta dal programma principale, così se voglio cambiare l'equazione differenziale basta che cambio le sotto-funzioni e non il main. Il problema è che anche in questo caso non ho capito come fare. Il mio intento è fare una cosa di questo tipo.

Funzione principale: Main, che contiene:
Funzione per: Ciclo per Newton, che contiene:
Funzione per: Residuo + Jacobiano

e così via.

Avete una guida sintetica che spiega come farlo?

Propongo questo esempio banalissimo:

Il file prova modulare fornisce la somma di due valori x e y:
primo: passa il primo valore;
secondo:passa il secondo valore;
funzione: somma primo+secondo;
Provamodulare:stampa a schermo;

I file che ho scritto sono:

Provamodulare
Codice:
#include "stdafx.h"
#include <iostream>   
#include <funzione.h>

using namespace std;

int x = 2;
int y = 1;

int main()
{
   cout << funzione(int x, int y) << endl;

    return 0;
}


funzione.cpp:
Codice:
int funzione(int x, int y) {

   return secondo(int x) + primo(int y);

}


primo.cpp
Codice:
#include <iostream>
using namespace std;

int primo(int x) {

   return x;

}


secondo.cpp
Codice:
int secondo(int y) {

   return y;

}


funzione.h:
Codice:
#ifndef FUNZIONE_H
#define FUNZIONE_H

void funzione(int x, int y);

#endif


Quando lo compilo mi restituisce errore dicendo che non trova il file funzione.h. Ho prestato attenzione a mettere tutto nelle cartelle giuste....


Grazie
frnero
Junior Member
Junior Member
 
Messaggio: 156 di 332
Iscritto il: 11/06/2013, 21:28

Re: Passare un elemento di una vettore ad una funzione

Messaggioda apatriarca » 28/01/2017, 16:42

Non ho capito che cosa tu stia cercando di fare.. Il codice che hai scritto non ha senso ed è quindi normale che ti fornisca diversi errori. L'errore nella riga su funzione.h è legato alla decisione di usare <> per i file di sistema e "" per i file locali.

Per chiamare una funzione non devi poi inserire i tipi dei valori come se la stessi dichiarando. Devi semplicemente inserire gli argomenti alla funzione come faresti in matlab. Quindi il file provamodulare potrebbe avere semplicemente la forma:
Codice:
#include <iostream>   
#include "funzione.h"

int x = 2;
int y = 1;

int main()
{
    std::cout << funzione(x, y) << std::endl;
    return 0;
}

Tuttavia questa funzione richiamerebbe la funzione con valori 2 e 1, che non è quello che credo tu voglia fare. Sbaglio? Discorso simile vale per le funzioni primo e secondo quando vengono usare in funzione.cpp.. Devono essere chiamate nel modo seguente (non sono al contrario primo e secondo?):
Codice:
int primo(int x);
int secondo(int y);

int funzione(int x, int y)
{
   return secondo(x) + primo(y);
}

Ho inserito i prototipi delle due funzioni in modo che tu potessi usarle (puoi anche inserire i prototipi in file header che poi dovrai includere).

Ma qual'è il tuo obiettivo finale? Perché convertire tutto in C++ quando potresti continuare ad andare avanti in Matlab?
apatriarca
Moderatore
Moderatore
 
Messaggio: 4521 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Passare un elemento di una vettore ad una funzione

Messaggioda frnero » 06/02/2017, 13:05

Grazie per la risposta.
Alla fine ho deciso di continuare con Matlab, il C lo dovrei imparare da 0.
frnero
Junior Member
Junior Member
 
Messaggio: 157 di 332
Iscritto il: 11/06/2013, 21:28


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite