begin process at 2012 05 30 04:15:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

System

 > 

La mémoire...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

La mémoire...

jeudi 25 février 2010 à 20:03:14 | La mémoire...

rivarol89

Bonjour,

prérequis :
Code C/C++ :

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 :

Code C/C++ :
mat->tab = &k


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

Code C/C++ :
mat->tab+5 = &k


Pourquoi ?

serai-ce parce qu'une adresse mémoire est constante ?
jeudi 25 février 2010 à 21:13:30 | Re : La mémoire...

BruNews

Administrateur CodeS-SourceS
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++
jeudi 25 février 2010 à 21:58:52 | Re : La mémoire...

rivarol89

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 :

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


Code C/C++ :
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.
vendredi 26 février 2010 à 09:05:08 | Re : La mémoire...

Pistol_Pete

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.
vendredi 26 février 2010 à 14:21:46 | Re : La mémoire...

TychoBrahe

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).


Cette discussion est classée dans : code, tab, mémoire, cpp, matrix


Répondre à ce message

Sujets en rapport avec ce message

HELP !!! Après plantage fichiers cpp transformés en binaire : code perdu !!!!! [ par ngryman ] J'y crois pas ! J'ai lancé mon progrmme, il a planté, une erreur windows s'est produite et j'ai redémarré mon pc, et après le fichier cpp principal de Gestion de la mémoire ! [ par ZogStriP ] Je voudrais savoir si il existe un programme ou une fonction (qui marche sous windows XP) qui me permettrais de savoir exactement combien d'espace pre allocaiton dynamique: expliquez moi :) [ par warenbe ] bon je souhaite comprendre l'allocation dynamique en C et je bute dessus depuis une bonne heure deja alors que je suis sur que c'est super simpledonc problème de variables [ par Adeon ] salut! regardez ces lignesdans principal.cpp :#include #include "sous_partie.cpp"void enregistre_variable();void main(){< Code QBasic à convertir Cpp [ par SneakGuy ] Salut, j'ai besoin d'aide pour convertir ce code QBasic en Cpp...*Désoler, tous les signes"plus" sont remplacés par la lettre p. Merci.CLSFOR x = 1 INI :: AIDEZ MOI SVP !! [ par bdkiller ] Bonjour,Je suis newbie dans le Cpp. J'utilise Borland Cpp Builder.J'ai un petit problème avec les fichiers ini. Et vu que je n'arrive pas à le résoudr Alt+TAB [ par bdkiller ] Bonjour,Je travaille sous Borland C++ Builder, et actuellement je me prends la tête à bloquer les combinaisons de touches ALT+F4, ALT+TAB et Ctrl+Alt+ Mémoire Pleine OU non Mémoire Pleine, telle est la question [ par oliversleep ] Salut tout le monde, voilà je suis sur un bout de code sous builder, je crée dynamiquement un ensemble de class qui sont en fait une dizaine d'objets. GetAsyncKeyState [ par sebleboss2002 ] Bon, c'est encore moi, ce coup-ci, j'ai trouvé (plus ou moins) comment faire ce que je voulais :#include #include <br prog dans alt tab [ par leprov ] salut a tous.bon j'ai un bug avec mon prog, il apparait dans alt tab alors qu'il n'est pas dans la taskbar, donc je capte pas....si quelqu'un a du tem


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,841 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales