#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
void multiplier_matrice_vecteur (char * v0, char * A, int N)
{
int i,j,k;
char somme;
for (i = 0; i < N; i++) //On fait N calculs car c'est une matrice 1xN
{
//On fait N additions + multiplications
somme = 0;
for (j = 0; j < N; j++)
{
somme += v0[i] * A[i * N + j];
}
v0[i] = somme;
}
}
int main(void)
{
bool premiereLignefaite = false;
//Lire le fichier
FILE * graphe = fopen("graphe.txt", "r");
//Fichier de sortie
FILE * resultat = fopen("resultat.txt", "w");
int nbr1, nbr2;
int N;
char *matrice; //pointeur vers la matrice d'adjacence
//Ligne lue
static char ligne[50];
while (fgets(ligne, 50, graphe) != NULL) //retourne 0 quand on a end-of-file
{
//La premiere ligne est différente
if (premiereLignefaite == false) {
//Initialiser une matrice d'adjacence NxN
sscanf(ligne, "%d %d", &nbr1, &nbr2);
N = nbr1;
matrice = new char(nbr1 * nbr1); //Memoire dynamique pour la matrice dadjacence n x n
memset(matrice, 0, nbr1*nbr1);
premiereLignefaite = true;
continue;
}
//On construit notre matrice d'adjacence
sscanf(ligne, "%d %d", &nbr1, &nbr2);
matrice[nbr1 * N + nbr2 ] = 1;
}
printf("Matrice d'adjacence %dx%d : \n", N, N);
//Affichage de la matrice d'adjacence
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%c ", matrice[i * N + j] + '0');
}
printf("\n");
}
//Application de l'algo étapes par étapes
double tolerance = 0.00001; //Niveau de tolérance de la méthode
char * v0; //vecteur propre taille N
char * v; //vecteur tampon
int valeur; //valeur propre
int valeur_tamp; //valeur propre tampon
//Initialiser v0
v0 = new char(N);
memset(v0, 1, N);
//Initialiser A (déja fait)
//Initialiser tolérance (deja fait)
valeur = 0;
while (1)
{
valeur_tamp = valeur;
//Multiplication du vecteur par la matrice
multiplier_matrice_vecteur(v0, matrice, N);
}
//Désallocation de la mémoire
delete matrice;
//Fermeture des fichiers etc
fclose(graphe);
fclose(resultat);
return 0;
}
Donc, c'est le programme que j'ai codé depuis 2PM sur mon ordinateur portable. J'utilise Visual Studio 2008 et Windows 7 64 bits. Je code, tout va bien. Lorsque j'essaie de tester mon programme, la ligne:Pointeur NULL renvoyé par new et malloc, pourquoi?
v0 = new char(N);
Me donne une exception. J'essaie de retrouver ma mémoire avec malloc et calloc et qu'est-ce que je reçois? Un pointeur nul !! J'ai 4 concerts de ram sur ma machine et il n'y a aucun moyen que je ne peux pas obtenir 9 octets de mémoire ici. Je ne comprends pas ça du tout.
Pour ceux qui ont Visual Studio 2008 et que vous souhaitez tester dans le même environnement, vous aurez besoin du fichier graphe.txt, voici ce fichier:
9 20
0 1
0 2
1 0
1 2
1 3
1 5
2 0
2 1
2 3
3 1
3 2
3 4
4 3
5 1
5 6
5 7
6 5
6 8
7 5
8 6
Je pensais que cela était un problème de machine, Je rentre à la maison, j'essaye le programme sur mon ordinateur de bureau et c'est le même problème ...
Je devrais essayer sur GCC mais puisque j'utilise toujours Visual C++ je veux résoudre le problème sur ceci environnement ...
EDIT: Le code suivant fonctionne maintenant. Pour une raison quelconque, si vous utilisez des parenthèses dans la première nouvelle, cela fonctionnera, mais la prochaine fois que vous utiliserez de nouvelles, cela ne fonctionnera pas !! Si je mets les deux nouvelles allocations avec la syntaxe [], cela fonctionne. Si je mets la première nouvelle allocation avec [] et la seconde avec(), cela fonctionne aussi. BIZARRE. De toute façon, je vais utiliser [] à partir de maintenant ... Merci à tous.
Quelle est la valeur si 'N 'lorsque le contrôle atteint cette ligne avec l'exception? – Kos
Etes-vous sûr que l'exception n'est pas ici? 'memset (v0, 1, N);' – Cam
Non, cela arrive avant d'essayer de faire le memset ici. – toto