Calcul de la norme d'un vecteur généré de façon aléatoire en langage C - C - Programmation
Marsh Posté le 25-04-2012 à 15:12:42
olgha a écrit : Bonjour à tous,
|
Sinon quand on dit qu'on arrive pas à compiler, la moindre des choses pour aider les autres c'est de copier coller les erreurs que te sort le compilateur.
Enfin pour t'aider tu devrais passer la dimension du vecteur dans les paramètres de tes fonctions:
void rempliVect(int *v, int dimension);
float norme(int *v, int dimension);
Marsh Posté le 25-04-2012 à 15:24:02
Voici le code corrigé ainsi que les erreurs affichés:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void RempliVect(int *V, int dim);
float norme(int V[], int dim1);
int main ()
{
float norm;
int dimension=4, vect1;
int vect[dimension];
RempliVect(vect1, int dimension);
norm=norme(vect1, int dimension);
}
void RempliVect(int *V, int dim) //remplit le vecteur de façon aléatoire
{
int j,dim;
srand(time(NULL));// initialisation de la fonction rand
for (j=0;j<dim;j++)
{
V[j] = rand();
printf("%d\t",V[j]);
printf("\n" );
}
}
float norme(int V[], int dim1)
{
int i;
float Norm;
float N=0;
for (i = 0 ; i < dim1 ; i++)
{
N = V[i] * V[i] + N;
}
Norm= sqrt(N);
printf("la norme au carré est: %f et la norme est :%f\n",N,Norm);
return Norm;
}
Erreur affiché:
fonction.c: In function 'main':
fonction.c:24:3: warning: passing argument 1 of 'norme' makes pointer from integer without a cast
fonction.c:10:7: note: expected 'int *' but argument is of type 'int'
Marsh Posté le 25-04-2012 à 15:33:29
Ben oui, vu que manifestement, c'est
int dimension=4;
int vect1[dimension];
ce que tu veux faire.
Bref quelque chose comme ceci (en modifiant vite fait ton code):
Code :
|
A+,
Marsh Posté le 25-04-2012 à 18:26:36
tiens, tant que j'y suis, la même chose en C++ moderne:
Code :
|
A+,
Marsh Posté le 29-04-2012 à 00:36:01
breizhbugs a écrit : |
Bonjour tout le monde
moi j'ai un problème avec c++. Au fait le truc c'est que je viens juste de commencer la programmation et je ne maitrise pas les boucles if, for, while,..
j'ai vraiment besoin d'aide et je compte sur tout le monde.
merci d'avance
Marsh Posté le 29-04-2012 à 02:35:14
if n'est pas une boucle, c'est une condition, par exemple :
Code :
|
Lors de l'exécution de ce code, on créé une variable 'a', qui aura pour valeur initiale 17.
Ensuite, on teste si a est égale à 17, dans ce cas on affiche "C'est 17!" sur la console, sinon on affiche "C'est pas 17!";
La boucle "while" permet d'exécuter des instructions en boucle tant qu'une condition est vraie :
Code :
|
Dans ce code, on créé une variable a qui est à 0, ensuite tant qu'elle n'est pas à 5, on affiche "Pas 5 : " suivit de la valeur de a, puis on l'incrémente de '1'.
en gros, ça va afficher ça sur ta console :
Pas 5 : 0
Pas 5 : 1
Pas 5 : 2
Pas 5 : 3
Pas 5 : 4
La boucle for est un peu plus complexe, le schéma est comme ça :
for ( initialisation ; vérification; truc à faire)
ça peut être vu comme ça en pseudo-code :
initialisation;
tant que (vérification est faux) faire
truc à faire
fin tant que
En général, tu vas t'en servir avec des int incrémentés/décrémentés :
Code :
|
ce qui affichera à l'écran les valeurs de i :
0
1
2
3
4
5
6
7
C'est équivalant à ça :
Code :
|
La boucle fort permet de parcourir des tableaux, le 'i' étant utilisé comme index, et plein d'autre trucs.
Marsh Posté le 30-04-2012 à 10:30:43
Salut à tous. J'ai écris une fonction qui transforme une matrice en vecteur ci-dessous. J'ai 0 erreur, 0 warning et pourtant j'ai aucun résultat. Quand je compile j'ai:
stagiaire@amaltee /mnt/manille/sdb2/stages/stagiaire $ gcc func1.c -o func1.out
stagiaire@amaltee /mnt/manille/sdb2/stages/stagiaire $ ./func1.out
Matrice ==> Vecteur
m_in[0][0] = 0
m_in[0][1] = 1
m_in[1][0] = 10
m_in[1][1] = 11
m_in[2][0] = 20
m_in[2][1] = 21
m_in[3][0] = 30
m_in[3][1] = 31
On fait les verifications : pour m_in : 0x602010
pour *m_in : 0x602040
pour v_out : 0x602040
OK pour les adresses
v_out[0] = 0
v_out[1] = 1
v_out[2] = 10
v_out[3] = 11
v_out[4] = 20
v_out[5] = 21
v_out[6] = 30
v_out[7] = 31
OK aussi pour les valeurs
Segmentation fault
"Le Code"
[/cpp]
#include <stdio.h>// pour les printf et puts
#include <stdlib.h>// pour les malloc et free
//#include <time.h>
//#include <math.h>
typedef double TYPE ;
typedef TYPE *VECTOR ;
typedef TYPE **MATRIX ;
// transformation d'une matrice en vecteur
double fmv(int dim1, int dim2);
int main()
{
int const dimens1 = 4 , dimens2= 2 ;// on définit les dimensions de la matrice.
int dimens= dimens1*dimens2;
MATRIX mat_in;// matrice de départ
VECTOR vect_out; //double *vect_out ;
int i, j;
//int i, j; // les indices des boucles.
*vect_out = fmv(dimens1, dimens2);// incompatible types when assigning to type 'double *' from type 'double'
return 0;
}
double fmv(int dim1, int dim2)
{
int i, j;
int dim = dim1*dim2;
VECTOR v_out;// vecteur à réccupérer
MATRIX m_in;// matrice de depart
puts ( " Matrice ==> Vecteur \n" ) ;
// on va créer une matrice et la remplir par des valeurs reconnaissables
m_in = (MATRIX) malloc( dim1 * sizeof(VECTOR) );
if ( NULL == m_in )
return EXIT_FAILURE ;
*m_in = (VECTOR) malloc(dim * sizeof(TYPE));
if ( NULL == *m_in )
return EXIT_FAILURE ;
/*indique que les autres pointeurs de lignes csorrespondent au début des autres lignes de la matrice*/
for ( i = 1 ; i < dim1 ; ++i )
m_in[i] = m_in[i-1] + dim2 ;
for ( i = 0 ; i < dim1 ; ++i)
{
for (j = 0 ; j < dim2 ; ++j)
m_in[i][j] = (TYPE)(10*i+j);
}
for ( i = 0 ; i < dim1 ; ++i)
{
for ( j = 0 ; j < dim2 ; ++j )
printf( " m_in[%d][%d] = %g \n" , i, j, (double)m_in[i][j] ) ;
}
printf(" " ) ;
v_out = *m_in ; // là le vecteur v_out est équivalent à la matrice m_in
//debut des verifications
printf( " On fait les verifications : " ) ;
printf( " pour m_in : %p \n", m_in ) ;
printf( " pour *m_in : %p \n", *m_in ) ;
printf( " pour v_out : %p \n", v_out ) ;
puts ( " OK pour les adresses \n" );
for ( i = 0 ; i < dim ; ++i )
printf( " v_out[%d] = %g \n" , i, (double)v_out[i] );
puts ( " OK aussi pour les valeurs \n" ) ;
// fin des verifications
free( *m_in ) ;
free( m_in ) ;
return 0;
}
[/cpp]
Je vous prie de bien vouloir m'aider à détecter mes erreurs,parce qu'il y a segmntation default qui revient à chaque fois. Cordialement,
Marsh Posté le 30-04-2012 à 11:38:29
gilou a écrit : tiens, tant que j'y suis, la même chose en C++ moderne:
|
Code :
|
J'accumule dans un double, j'aime pas les overflows qui sont souvent generes ici si j'accumule dans un int. On peut aussi utiliser
Code :
|
mais le format de sortie est different.
Marsh Posté le 30-04-2012 à 13:42:04
Merci, je suis toujours preneur de code qui m'en apprends plus sur le C++ moderne (langage que je n'utilise pas de manière fréquente).
A+,
Marsh Posté le 30-04-2012 à 13:47:55
gilou a écrit : Merci, je suis toujours preneur de code qui m'en apprends plus sur le C++ moderne (langage que je n'utilise pas de manière fréquente). |
Si je ne me goure pas, les seules choses de neuves sont l'utilisation d'auto et d'une fonction lambda dans l'appel a accumulate..
Marsh Posté le 30-04-2012 à 13:53:40
Citation : et d'une fonction lambda dans l'appel a accumulate |
Comme je ne programme qu'a l'occasion en C++, j'ai peu l'habitude de ce type de code en C++.
A+,
Marsh Posté le 25-04-2012 à 14:57:10
Bonjour à tous,
J'écris un petit programme qui doit générer un vecteur de façon aléatoire et renvoyer sa norme. J'arrive pas à le compiler. Pouvez-vous SVP y jeter un coup d'oeil et m'aider à la faire fonctionner?
Message édité par gilou le 25-04-2012 à 15:03:45