La mémoire...

Signaler
Messages postés
19
Date d'inscription
dimanche 27 février 2005
Statut
Membre
Dernière intervention
22 avril 2010
-
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
-
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

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
19
Date d'inscription
dimanche 27 février 2005
Statut
Membre
Dernière intervention
22 avril 2010

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.
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
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.
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
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).