2009-12-07 5 views
0

peuvent i savoir quel est le problème en utilisant les ci-dessous x-macro CodeEn ce qui concerne les macros

#define FILL_BUFF_1 (int *)(0x01, 0x02) 
#define FILL_BUFF_2 (int *)(0x03, 0x04) 

#define X(a,b) 

#define LOOK_UP \ 
    X(0x13, FILL_BUFF_1), \ 
    X(0x14, FILL_BUFF_2) 

#undef X 

#define X(a,b) a 
int pid_table[2] = {LOOK_UP}; 
#undef X 

#define X(a,b) b 

int *pid_buff_ptr[2] = {LOOK_UP}; 

void main(int argc, _TCHAR* argv[]) 
{ 
    printf("%d ", (pid_buff_ptr+0)); // displays 0x02 

    printf("%d ", (pid_buff_ptr+1)); // displays 0x04 

    printf("%d " ,*(pid_buff_ptr[0] + 1)); // doesnt work 
} 

Comment puis-je faire le code ci-dessus pour accéder à d'autres éléments dans la mémoire tampon?

+1

cela doit être des devoirs. Personne ne voudrait sérieusement écrire du code aussi compliqué que ça ... –

+1

J'ai vu pire dans le monde des affaires ... – espais

+0

Peut-être pourriez-vous expliquer ce que vous essayez de faire? –

Répondre

0

Je ne sais pas ce que vous essayez de faire exactement, mais si j'avez bien deviné, vous voulez avoir la variable pid_buff_ptr contiennent un tableau de valeurs int, pas un tableau de valeurs int *.

Si tel est le cas, vous devez changer

#define FILL_BUFF_1 (int *)(0x01, 0x02) 
#define FILL_BUFF_2 (int *)(0x03, 0x04) 

à

#define FILL_BUFF_1 {0x01, 0x02} 
#define FILL_BUFF_2 {0x03, 0x04} 

Modifier les éléments suivants:

int *pid_buff_ptr[2] = {LOOK_UP}; 

à

int pid_buff_ptr[][2] = {LOOK_UP}; 

Pour imprimer, utilisez quelque chose comme:

printf("%d ", pid_buff_ptr[0][1]); 

Bien sûr, je peux me tromper.

Maintenant, d'autres commentaires:

  • Vous devez #include <stdio.h> avant d'utiliser printf().
  • main() renvoie int.
  • Depuis main() renvoie int, vous devez renvoyer un int à partir de celui-ci. Traditionnellement, 0 signifie le succès.
  • Je ne sais pas ce que _TCHAR est, mais si ce n'est pas un alias ou #define pour char, vous pourriez avoir des ennuis.

Même avec les changements ci-dessus, je ne comprends pas la nécessité de faire la supercherie avec le pré-processeur. Qu'est-ce que vous essayez de faire exactement?

+0

Hey merci beaucoup Alok !! J'ai essayé votre code et ça fonctionne .. btw, quand j'essaye d'avoir une déclaration comme "int pid_buff_ptr [] [] = {LOOK_UP}", je ne suis pas capable de le faire .. quelle est ma compréhension, vous n'avez pas besoin mentionnez l'indice de colonne d'un tableau 2D, quand vous essayez de l'initialiser dans la déclaration elle-même .. ai-je raison ... J'ai besoin de ce qui précède car FILL_BUFF_N peut être dynamique et ne pas contenir seulement 2 éléments – inquisitive

+0

Vous ne pouvez avoir qu'une seule dimension "libre". Si vous avez besoin de plus de deux macros FILL_BUFF_ *, vous pouvez facilement le faire en changeant int pid_table [2] = {LOOK_UP}; à int pid_table [] = {LOOK_UP} ;, ajout des macros FILL_BUFF_ * requises et modification de la macro LOOK_UP. Mais je ne sais toujours pas ce que vous essayez de faire. Il y a presque certainement un moyen plus facile de le faire. –

+0

@Alok: Eh bien, c'est en fait pour économiser de l'espace RAM et éviter d'avoir des variables const. – inquisitive

1

(. Prendre un coup de poignard sauvage à ce juste parce qu'il est assis ici un certain temps sans réponse)

Dans la dernière ligne, vous semblez être déréférencement la 0x03 valeur en tant que pointeur - Je suppose que vous obtenez un SIGSEGV?

pid_buff_ptr[0] == 0x02 

si

(pid_buff_ptr[0] + 1) == 0x03 

si

*(pid_buff_ptr[0] + 1) 

est déréférencement 0x03 comme un pointeur.

+0

@william: Oui, c'est vrai .. ma question actuelle est, comment puis-je dé-référence pour obtenir la valeur 0x03 .. je ne comprends pas pourquoi (pid_buff_ptr [0] + 1) est déréférencement 0x03, au lieu de l'emplacement de mémoire contenant 0x03 .. ma compréhension est, pid_buff_ptr [0] est le premier élément dans le tableau, qui est un pointeur vers le tampon (0x01, 0x03) – inquisitive