begin process at 2012 05 28 20:39:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

déréférencer de pointeur


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

déréférencer de pointeur

mercredi 23 mars 2011 à 13:06:34 | déréférencer de pointeur

sdrh

Bonjour à tous et merci d'avance pour vos réponses.

Je suis actuellement entrain de transposer un code Matlab en c++.
Pour cela j'utilise une petite classe matrice assez élémentaire que j'ai codé, en utilisant des pointeurs de pointeurs (pas de classe template ni de valarray ou vector, seulement des double** et ça marche très bien ^^)

Le problème qui se pose pour moi c'est qu'en mathlab le 1er éléments d'une matrice est (1,1) et le dernier (n,m) alors que bien entendu l’arithmétique des pointeurs en c++ impose de débuter à (0,0) et finir à (n-1,m-1).

Est-il possible pour des raisons de gain de tps de modifier cette contrainte pour ne pas avoir à déréférencer à chaque fois mes boucles, ce qui me ferrait gagner pas mal de tps ...
en gros avoir des pointeurs dont le 1er termes et [1][1] ... [n][m]


Merci d'avance pour vos suggestions.

mercredi 23 mars 2011 à 14:00:21 | Re : déréférencer de pointeur

CptPingu

Administrateur CodeS-SourceS
Non, ce n'est pas possible :)
Un tableau en C, est une adresse. Donc faire tab[0] équivaut à l'adresse du pointeur tab (décalage de 0), alors que tab[2] correspond à l'adresse de tab décalé de deux éléments (décalage de "type * 2"). C'est la raison pour laquelle on commence à 0. C'est une base très importante du langage, et ce n'est pas bien entendu pas modifiable.

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mercredi 23 mars 2011 à 16:44:00 | Re : déréférencer de pointeur

sdrh

Sauf erreur de ma part. une grande partie Mathlab n'est elle pas codé en C ?
Dans ce cas comment ce fait il que ce soit le cas sous mathlab ?

Je te remercie CptPingu pour ta réponse.

En fait ce que j’espérais n'est pas tant de modifié le langage C en soit mais une technique ou astuce pour palier ce problème .

J'avais par exple pensé d'initialiser ma première ligne et ma première colonne à zéro et d'augmenter de +1 ligne, +1colonne la dimension de ma matrice pour ensuite pouvoir travaillé sur la sous matrice. (idée certes stupides ... vu qu'on consomme de la mémoire pour rien) quoi qu'il en soit c'est une optimisation ou astuce dans ce sens que je cherchais !

En Espérant avoir été plus clair.

mercredi 23 mars 2011 à 17:00:15 | Re : déréférencer de pointeur

CptPingu

Administrateur CodeS-SourceS
Matlab, a peut être été codé en C, mais son implémentation est différente. Si je code mon propre langage en C, je peux faire commencer les tableaux à la valeur que je veux (pourquoi pas 36 :p).
Le C a été conçu pour que les tableaux commencent à 0, et ça ne peut être changé.

J'ai du mal à cerner en quoi c'est un problème gênant. Si tu as tab[1], tu mets à la place tab[0] et c'est reglé.
Si tu as l'habitude de faire:
for (int i = 1; i <= size; ++i)
tu remplaces par:
for (int i = 0; i < size; ++i)

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mercredi 23 mars 2011 à 17:02:28 | Re : déréférencer de pointeur

CptPingu

Administrateur CodeS-SourceS
J'oubliais, rien ne t'empêche de faire une fonction à la place.
Ex:
Au lieu de tab[0][0], tu peux faire un get(tab, 1, 1).

Avec get:
Code C/C++ :
int get(int** tab, int x, int y)
{
  return tab[x - 1][y - 1];
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mercredi 23 mars 2011 à 17:44:29 | Re : déréférencer de pointeur

sdrh

Oui certes mais ceci est simple qd les cases auxquelles tu veux accéder sont linéaire.

Je m'explique :

prenons un vecteur - je souhaite accéder au composante de la forme 3*i-2, sous mathlab.
ca donne simplement

for i=1:N
T(3*i-2);

en c++ :

for (i=0 ; i<N ; i++) // on décale la boucle jusque là ok !
T[3*i]; // il faut aussi décaler l'indice des Tab

ceci est un exple tout bête, qui devient vite compliqué qd tu travailles sur des matrices et que tu récupères des valeurs d'autre matrice ds tes boucles...
C'est pas infaisable ça fait juste perdre un peu de tps de décaler tes indices,
ça permet surtout de comparer plus facilement les deux codes.

D'où ma question ^^
mercredi 23 mars 2011 à 17:58:23 | Re : déréférencer de pointeur

CptPingu

Administrateur CodeS-SourceS


for i=1:N
T(3*i-2);



En C++:

Code C/C++ :
template <typename T>
T get(T* tab, int x)
{
  return tab[x - 1];
}
template <typename T>
T get(T** tab, int x, int y)
{
  return tab[x - 1][y - 1];
}
template <typename T>
T get(T*** tab, int x, int y, int z)
{
  return tab[x - 1][y - 1][z - 1];
}


Ensuite, tu peux faire:

Code C/C++ :
for (int i = 1 ; i <= N ; ++i)
  get(T, 3 * i - 2);//T[3 * i - 2];

for (int i = 1 ; i <= N ; ++i)
  for (int j = 1 ; j <= N ; ++j)
    get(T, 3 * i - 2, 3 * j - 2);//T[3 * i - 2][3 * j - 2];


Fonctionne avec n'importe quel type de tableau, de 1 à 3 dimensions.

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mercredi 23 mars 2011 à 18:50:24 | Re : déréférencer de pointeur

sdrh

en effet en effet ... ton idée m'a bien inspiré :

j'ai modifié ma class Matrice comme ceci :

Code C/C++ :
double & Matrice::operator()(unsigned int i, unsigned int j)
{
  if( i>= nbre_lignes || j >=nbre_colonnes)
  {
  throw std::string("Hors plage de valeurs");
  }
  return lignes[i-1][j-1]; // j'avais mis [i][j]
}


Comme j'ai fait cette classe il y as un petit moment déjà ça ne m'est même pas venu à l'idée ^^

En tout cas Merci !!!!!!


Cette discussion est classée dans : classe, pointeurs, pointeur, avance, déréférencer


Répondre à ce message

Sujets en rapport avec ce message

Problème de pointeur [ par ngryman ] Salut à vs, g un gros pb inexplicable pr moi, alors si qqn trouvait la solution ce serait un dieu.Voilà je m'explik, j'ai une classe X qui possède un Pointeurs [ par Nykkoo ] Salut,Etant debutant dans la programmation en C, j'arrive aux chapitres des pointeurs (sniff) et je me trouve confonté aux problemes suivants :double pointeurs [ par djkill55 ] bonjour,j aimerai savoir cmt on fait un scanf sur une suite de pointeur, je m explike, je dois faire ca ms sans utiliser les [] , cad les tableux, ms Pointeur vers une fonction dans une classe ... [ par MoDDiB ] Supposons que j'ai la fonctionvoid Fonction(int test,int t);appartenant a la classe Cclass.Quelle est la syntaxe pour creer un pointeur vers cette fon pourkoi pointeur vers classe ? [ par Arkko ] Quelquun peut m'expliquer pourquoi ce code cree un pointeur NULL vers un classe et apres quil declare un variable de type cMyD3dApplication et met une pointeur sur CDialog a partir de CView [ par stremblay77 ] Bonjour Comment faire pour obtenir un pointeur sur une classe dérivée de CDialog à partir d'une classe dérivée de CView ou de CRichEditView... SVP bes Classe C++ et pointeurs [ par cybermax62 ] je veux utiliser des pointeurs sur des classes. j'écris mon code comme celui-ci :typedef class widget * pwidget;class widget{public:; char * name_s; (__cdecl *) => kesako? [ par Oeil_de_taupe ] Bonjour tout le monde, J'ai créé deux classes qui représentent un protocole pour envoyer des données entre deux PC. Lors de l'appele de leur construc pb pointeurs [ par Arnaud16022 ] bonsoirj'ai un peu de mal avec les pointeurs et ma fonction marche pas trop.Le but est de passer une variable en parametre a une fonction, qui va stoc Pointeurs de pointeurs [ par miximog ] Bonjour a tous enfin bonsoir ;) Enfaîte j'ai lu 2 tuto sur les pointeurs donc je commence a bien comprendre la notion de pointeurs, mais il y a une n


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

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 : 0,593 sec (4)

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