La mémoire...

rivarol89 Messages postés 19 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 22 avril 2010 - 25 févr. 2010 à 20:03
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 - 26 févr. 2010 à 14:21
Bonjour,

prérequis :

typedef struct {
    int n, m;
    double* tab;
} matrix;

double k = 12345;
matrix mat* = newMatrix(5, 5) //alloue et initialise un objet matrix 5x5



Pourquoi ?


Cette ligne fonctionne sans problème :

mat->tab = &k


Mais celle ci retourne l'erreur (du compilateur) : "error: non-lvalue in assignment"

mat->tab+5 = &k


Pourquoi ?

serai-ce parce qu'une adresse mémoire est constante ?

4 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
25 févr. 2010 à 21:13
Sérieux, je serais à la place du compilo, je demanderais aussi ce que tu veux exactement.

mat = newMatrix(5, 5); // SUPPOSONS QUE VA BON

Disons par exemple que mat est à adresse 1000.

mat->tab est donc adresse: 1000 + 8
Serait donc à l'adresse 1013 que tu voudrais qu'on écrive adresse de ton double (&k) ??? assurément pas ce que tu espères.

mat->tab[5] = &k;
serait possible mais fais gaffe que ce soit bien ce que tu veux.

ou alors autre possibilité:
mat[5].tab = &k;

Dans tous les cas, gaffe à ne pas écrire hors tableau alloué.

ciao...
BruNews, MVP VC++
0
rivarol89 Messages postés 19 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 22 avril 2010
25 févr. 2010 à 21:58
Merci pour ta réponse, mais je pense que le propylène n'est pas la.
J'ai tout de même essayé ta solution sans succès.

Ce sera plus simple comme ca :

Voici ma fonction qui me permet de charger un mémoire une matrice NxM, et ce,
à partir d'un fichier texte formaté de la manière suivante :

N                          ENTIER
M                          ENTIER
a11 a12 ....a1M            les aIJ sont des doubles
a21 a22 ....a2M
.
.
aN1 aN2 ....aNM


matrix* readm(FILE* f) {
    int m,n;
    fread(&n, sizeof(int), 1, f);    //lire le premier entier
    fseek(f, sizeof(char), SEEK_CUR);//passer le caractère '\n'
    fread(&m, sizeof(int), 1, f);    //lire le deuxième entier
    fseek(f, sizeof(char), SEEK_CUR);//passer le caractère '\n'
    printf("n = %d\n", n);           //retourne à l'écran une valeur incohérente
    printf("m = %d\n", m);           //retourne à l'écran une valeur incohérente
    matrix* mat = newMatrix(n, m);   //allocation mémoire d'une nouvelle matrice
    int i = 0;
    int j = 0;
    while (i<n) { // n et m ne sont des valeur insignifiantes, ca ne risque pas de marcher... 
        j = 0;
        while (j<m) {
            fread(mat->tab+i*mat->m+j, sizeof(double), 1, f);
            if (j<m-1 && i<n-1) fseek(f, sizeof(char), SEEK_CUR); //On stoppe le fseek avant la fin
            j++;
        }
        i++;
    }
    return mat;
}


Le problème est que je ne reçois aucune erreur de la part du compilateur... je ne vois
pas par où s'échappent mes petits octets...

Toute aide acceptée.
0
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
26 févr. 2010 à 09:05
Salut
Au vu de ta structure je pense que tu a oublié une étape primordiale:
L'allocation dynamique de tab!!!
Pour l'instant tab n'est qu'un pointeur sur un double!
mat.tab = new double[mat.m*mat.n]

A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 11
26 févr. 2010 à 14:21
Salut,

Si tu essaye de lire le fichier texte comme si c'était un binaire c'est pas gagné. Ce n'est pas un scanf que tu as mais un fread, ce dernier ne transforme pas automatiquement la représentation ascii d'un entier/double en un entier/double, d'où tes valeurs incohérentes. Bref, à toi d'utiliser un scanf ou de transformer manuellement la chaîne lue en un entier ou un double en fonction des cas (cf atoi, atof, etc).
0
Rejoignez-nous