Passare un elemento di una vettore ad una funzione
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, 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
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, 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
#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; } }
Risposte
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.
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.
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.
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
funzione.cpp:
primo.cpp
secondo.cpp
funzione.h:
Quando lo compilo mi restituisce errore dicendo che non trova il file funzione.h. Ho prestato attenzione a mettere tutto nelle cartelle giuste....
Grazie
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
#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:
int funzione(int x, int y) { return secondo(int x) + primo(int y); }
primo.cpp
#include <iostream> using namespace std; int primo(int x) { return x; }
secondo.cpp
int secondo(int y) { return y; }
funzione.h:
#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
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:
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?):
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?
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:
#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?):
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?
Grazie per la risposta.
Alla fine ho deciso di continuare con Matlab, il C lo dovrei imparare da 0.
Alla fine ho deciso di continuare con Matlab, il C lo dovrei imparare da 0.