Renvoyer l'adresse d'un tableau en C

Renvoyer l'adresse d'un tableau en C - C - Programmation

Marsh Posté le 09-05-2012 à 17:53:45    

Salut à tous,
 
Après plusieurs essais et de recherche sur le net, je fais appel à vous...
 
Je suis en train de coder un programme ayant plusieurs modules. A un moment donné, j'ai besoin d'utiliser un tableau d'unsigned char de taille fixe déclarer dans le main.c dans un autre module. Les solutions non-élégantes sont de déclarer ce tableau en tant qu'extern ou alors d'envoyer le tableau complet en argument... ce que je ne souhaite pas faire si possible.
 
Du coup, j'aimerais faire une fonction permettant de me renvoyer l'adresse d'un élément du tableau mais je n'y arrive pas... pouvez-vous m'aider dans la syntaxe SVP? J'ai essayé pas mal de choses, mais toujours des erreurs.
 
Je suis conscient que ce que je dis là n'est pas très clair, alors pour essayer de clarifier tout ceci, voici à quoi ceci devrait ressembler :
 
unsigned char maFonction(unsigned char elementDuTableauAPointer)
{
     return &tableau[elementDuTableauAPointer]
}
 
tableau étant un tableau d'unsigned char défini en tant que variable globale dans le module. J'ai fait plusieurs essais avec des astérix et autre mais jamais concluant. Quelqu'un pourrait-il m'aider ou alors je vous explique mal mon problème? Merci d'avance!


---------------
Intel Core i7 2600K / Corsair H60 / Asus P8P67 Deluxe / Asus GTX 580 DirectCUII / Corsair Vengeance 1866 MHz 2x4 Go CAS9 / NZXT Phantom rouge et blanc / Seasonic X-850 / Corsair Force Series GT 240 Go / Western Digital Caviar Blue 1 To SATA III / Lite-On
Reply

Marsh Posté le 09-05-2012 à 17:53:45   

Reply

Marsh Posté le 09-05-2012 à 18:47:00    

Bah, euh, ce n'est vraiment pas compliqué. Un truc du genre devrait faire l'affaire :
 

Code :
  1. unsigned char * maFonction(unsigned char elementDuTableauAPointer)
  2. {
  3.     /* unsigned char en indice = casse gueule */
  4.     return &tableau[elementDuTableauAPointer];
  5. }


 
Ou plus simplement :

Code :
  1. unsigned char * maFonction(int elementDuTableauAPointer)
  2. {
  3.     return tableau + elementDuTableauAPointer;
  4. }


 

Maxwell1664 a écrit :

J'ai fait plusieurs essais avec des astérix et autre mais jamais concluant.


Euh, ne le prends pas mal, mais un language de programmation, surtout le C, ce n'est pas un truc ou tu jettes le code à l'écran en espérant que ça tombe en marche tout seul. Tu devrais quand même étudier un minimum les bases là...

Reply

Marsh Posté le 09-05-2012 à 20:40:06    

Ca sert à quoi de faire une fonction pour ça?
Il ne faut pas plutôt chercher 'elementDuTableauAPointer' dans le tableau et pointer à son indice?
genre:

Code :
  1. unsigned char *maFonction(unsigned char *tableau, unsigned int taille, unsigned char elementDuTableauAPointer)
  2. {
  3.     unsigned char *res = NULL;
  4.     unsigned int indice = 0;
  5.     while(indice < taille && tableau[indice] != elementDuTableauAPointer)
  6.            indice++;
  7.     if(tableau[indice] == elementDuTableauAPointer)
  8.            res = &tableau[indice];
  9.     return res;
  10. }


?

Message cité 2 fois
Message édité par breizhbugs le 09-05-2012 à 20:41:39

---------------
Seul Google le sait...
Reply

Marsh Posté le 09-05-2012 à 20:41:55    

Salut! Merci pour ta réponse! Je testerai tout ça demain au boulot!
 
Pas de souci, je ne le prends pas mal du tout! Juste que j'ai fait des essais de manière cohérente au début et après j'ai essayé diverses possibilité histoire de voir les différents messages d'erreur! J'ai fait tout ceci en fin d'après-midi, du coup j'étais fatigué! Merci bien en tout cas! Il me semble que j'ai testé ce que tu me proposes sans succès, mais je me trompe peut-être! Je test tout ça demain matin et je te redis! Merci du coup de main en tout cas!


---------------
Intel Core i7 2600K / Corsair H60 / Asus P8P67 Deluxe / Asus GTX 580 DirectCUII / Corsair Vengeance 1866 MHz 2x4 Go CAS9 / NZXT Phantom rouge et blanc / Seasonic X-850 / Corsair Force Series GT 240 Go / Western Digital Caviar Blue 1 To SATA III / Lite-On
Reply

Marsh Posté le 09-05-2012 à 20:44:57    

breizhbugs a écrit :

Ca sert à quoi de faire une fonction pour ça?
Il ne faut pas plutôt chercher 'elementDuTableauAPointer' dans le tableau et pointer à son indice?
genre:

Code :
  1. unsigned char *maFonction(unsigned char *tableau, unsigned int taille, unsigned char elementDuTableauAPointer)
  2. {
  3.     unsigned char *res = NULL;
  4.     unsigned int indice = 0;
  5.     while(indice < taille && tableau[indice] != elementDuTableauAPointer)
  6.            indice++;
  7.     if(tableau[indice] == elementDuTableauAPointer)
  8.            res = &tableau[indice];
  9.     return res;
  10. }


?


 
C'est histoire de pouvoir communiquer les valeurs entre différents modules sans envoyer tout le tableau ou sans déclarer le tableau en tant qu'"extern". Je regarderai demain ce que me propose tpierron et ensuite je regarderai aussi ton histoire, un peu fatigué ce soir pour voir ce que tu me proposes! Après avoir fait du C pendant 8h et que ça fait des semaines que ça dure :D ! Je regarde tout ça demain, merci bien en tout cas!


---------------
Intel Core i7 2600K / Corsair H60 / Asus P8P67 Deluxe / Asus GTX 580 DirectCUII / Corsair Vengeance 1866 MHz 2x4 Go CAS9 / NZXT Phantom rouge et blanc / Seasonic X-850 / Corsair Force Series GT 240 Go / Western Digital Caviar Blue 1 To SATA III / Lite-On
Reply

Marsh Posté le 09-05-2012 à 22:31:11    

breizhbugs a écrit :

Ca sert à quoi de faire une fonction pour ça?


Accessoirement, ça permettrait de (légèrement) changer la représentation du type (genre une liste chainée de table fixe pour gérer le retaillage dynamique, sans réallocation complète du bloc). Cela dit avec un indice en "unsigned char", c'est mal barré... et de toute façon, faudra faire gaffe au chevauchement de bloc mémoire, mais ça reste une technique intéressante (peut-être pas sur des blocs aussi petit cela dit).

Reply

Marsh Posté le 10-05-2012 à 09:06:31    

Mais pourquoi ce n'est pas bien d'avoir un indice en unsigned char?

 

EDIT : Je viens d'essayer ce que tu me propose tpierron et en fait c'est bien ce que j'avais faire hier et j'ai une erreur genre :

 

#161 declaration is incompatible with previous "maFonction" -> à la ligne "unsigned char * maFonction(unsigned char elementDuTableauAPointer)"
#515 a value of type "int" cannot be assigned to an entity of type "unsigned char *"

 

Donc voilà, c'est pour ceci que je vous demande de l'aide... je vais voir ce que me propose breizhbugs là...

 

EDIT2 : Arf! Désolé, je viens de voir que dans mon code de test, j'avais oublié d'inclure le fichier .h ... du coup il n'était pas content... ça m'apprendre à jouer à Skyrim jusqu'à 1h du mat'! Merci beaucoup à vous deux! Maintenant que ça fonctionne dans mon code d'essai, je vais voir si ça joue dans mon projet et je vous tiens au courant! Bon là j'ai mis des int partout au lieu d'unsigned char, mais mon tableau est de type unsigned char en fait donc voilà! Et de taille 15 sauf erreur et également de taille fixe!


Message édité par Maxwell1664 le 10-05-2012 à 09:23:28

---------------
Intel Core i7 2600K / Corsair H60 / Asus P8P67 Deluxe / Asus GTX 580 DirectCUII / Corsair Vengeance 1866 MHz 2x4 Go CAS9 / NZXT Phantom rouge et blanc / Seasonic X-850 / Corsair Force Series GT 240 Go / Western Digital Caviar Blue 1 To SATA III / Lite-On
Reply

Marsh Posté le 10-05-2012 à 11:01:38    

Merci pour les explications.


---------------
Seul Google le sait...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed