Erreur code?

Signaler
Messages postés
15
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
16 mai 2007
-
Messages postés
15
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
16 mai 2007
-
Bonjour,

j'ai copié-collé ce code sur le site microsoft :

// Début code :
int err;
      char buf[8192];
      char txt[8192];

      // Function registering table
      int nFuncs;

      // proc, type_text, function_text, arg, macro_type, category,
      // shortcut_text, help_topic, function_help
      static LPSTR func[][9] = {
      {" MyFunc", " JJJ", " MyFunc", " ", " 1", " MyCat", " ", " ", " "},
      {" MyMotd", " I", " MyMotd", " ", " 1", " MyCat", " ", " ", " "},
      {0,0,0,0, 0, 0, 0}
      };

      // Menu table
      int nMenuItems;

      static LPSTR menu[][5] = {
      {" &MyMenu", " ", " ", " Joe's Xll menu!!!", " "},
      {" M.O.T.D."," MyMotd", " ", " Message of the Day!", " "},
      {0, 0, 0, 0, 0}
      };

      // Initialization routine
      BOOL __stdcall xlAutoOpen(void) {
         AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

         // DEBUG output to indicate when called
         AfxMessageBox("xlAutoOpen() called!", MB_SETFOREGROUND);

         int i, j;

         // Get XLL file name
         static XLOPER xDll;
         Excel(xlGetName, &xDll, 0);

         // Prefix strengths with their length & count items
         // Note the framework's TempStr() function prefixes the
         // lengths anyway, but this is for other code that might
         // use the arrays
         for(nFuncs=0;     func[nFuncs][0];     nFuncs++) {
             for(i=0; i<9; i++) {
                 func[nFuncs][i][0]     = (BYTE) strlen(func[nFuncs][i]+1);
             }

         }

         for(nMenuItems=0; menu[nMenuItems][0]; nMenuItems++) {
             for(i=0; i<5; i++) {
             menu[nMenuItems][i][0] = (BYTE) strlen(menu[nMenuItems][i]+1);
             }
         }

         // Loop through the function list, and register the functions
         for(i=0; i<nFuncs; i++) {

            // Register a function
            err = Excel(xlfRegister, 0, 9, (LPXLOPER)&xDll,
               (LPXLOPER)TempStr(func[i][0]),
               (LPXLOPER)TempStr(func[i][1]),
               (LPXLOPER)TempStr(func[i][2]),
               (LPXLOPER)TempStr(func[i][3]),
               (LPXLOPER)TempStr(func[i][4]),
               (LPXLOPER)TempStr(func[i][5]),
               (LPXLOPER)TempStr(func[i][6]),
               (LPXLOPER)TempStr(func[i][7]),
               (LPXLOPER)TempStr(func[i][8])
               );

            if(err != xlretSuccess) {
             sprintf(buf, "xlfRegister for function %d, err = %d", i, err);
             AfxMessageBox(buf, MB_SETFOREGROUND);
            }
         }

         // Free XLL file name from the xlGetName call made earlier
         Excel(xlFree, 0, 1, (LPXLOPER)&xDll);

         // Menu support section
         static XLOPER xMenu;
         static XLOPER xMenuList[10*5];
         ASSERT(nMenuItems< 10);

         // Build menu
         xMenu.xltype            = xltypeMulti;
         xMenu.val.array.lparray = &xMenuList[0];
         xMenu.val.array.rows    = nMenuItems;
         xMenu.val.array.columns = 5;

         for(i=0; i<nMenuItems; i++) {
             for(j=0; j<5; j++) {
                 xMenuList[j+i*5].xltype  = xltypeStr;
                 xMenuList[j+i*5].val.str = menu[i][j];
             }
         }

         // Add menu
        Excel(xlfAddMenu,0,3,TempNum(1),(LPXLOPER)&xMenu,TempStr(" Help"));

         // Finished
         return 1;
      }

      // Cleanup routine
      BOOL __stdcall xlAutoClose(void) {
         ::MessageBox(NULL, "xlAutoClose()", "Debug", MB_SETFOREGROUND );

         // Delete menu
         Excel(xlfDeleteMenu, 0, 2, TempNum(1), TempStr(" MyMenu"));

         return 1;
      }

      // Support for descriptive information about the add-in(s)
      // You can add a new customized title for the user, but
      // unfortunately, only an add-in written in Microsoft Visual Basic
      // can add a description string.
      LPXLOPER _stdcall xlAddInManagerInfo(LPXLOPER xAction) {
         static XLOPER xInfo, xIntAction;

         // Find out what action must be taken
         Excel(xlCoerce, &xIntAction, 2, xAction, TempInt(xltypeInt));

         // DEBUG output to indicate when called
         sprintf(buf, "xlAddInManagerInfo(%ld)", (long)xIntAction.val.w);
         ::MessageBox(NULL, "xlAddInManagerInfo()", "Debug",
             MB_SETFOREGROUND );

         // Set title if asked
         if(xIntAction.val.w == 1) {
             xInfo.xltype = xltypeStr;
             xInfo.val.str = " My Add-in!!!!";
             xInfo.val.str[0] = (char)strlen(&xInfo.val.str[1]);
         }
         else {
             xInfo.xltype = xltypeErr;
             xInfo.val.err = xlerrValue;
         }

         return (LPXLOPER)&xInfo;
      }

        short __stdcall MyMotd(void) {
         char *name[] = {
            "Rebekah",
            "Brent",
            "John",
            "Joseph",
            "Robert",
            "Sara",
            0
         };
         char *quote[] = {
            "An apple a day, keeps the doctor away!",
            "Carpe Diem: Seize the Day!",
            "What you dare to dream, dare to do!",
            "I think, therefore I am.",
            "A place for everything, and everything in its place.",
            "Home is where the heart is.",

            0
         };

         int nNames, nQuotes;

         for(nNames=0; name[nNames]; nNames++);
         for(nQuotes=0; quote[nQuotes]; nQuotes++);

         sprintf(buf, "%s says '%s'", name[rand()%nNames],
            quote[rand()%nQuotes]);
         ::MessageBox(NULL, buf, "XLL MOTD", MB_SETFOREGROUND );

         return 0;
      }

      // Example function that returns the product of its two parameters
      long __stdcall MyFunc(long parm1, long parm2) {
       sprintf(buf, "You sent %ld and %ld to MyFunc()!", parm1, parm2);
       ::MessageBox(NULL, buf, "MyFunc() in Anewxll!!!", MB_SETFOREGROUND);

       return parm1 * parm2;
      }
 //Fin COde    

ce  progamme est utilsé par excel (add-in xll). En fait le problème vient du fait qu'Excel plante au moment où le programme rentre dans la première double boucle(cf code repéré en rouge ).
Deja que permet de faire (BYTE) ?
La condition de reblouclage est-elle écrite de manière correct?
Ensuite je triouve bizarre d'utiliser d'un coup un tableau à trois indices alors qu'il a été déclaré à deux indices un peu plus haut (cf code en vert)

Quelqu'un peut-il m'aider?
Merci d'avance

9 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
func[] est un tableau de pointeurs (de chaines), normal qu'on puisse indiquer l'offset d'élément de chaque chaine.

ciao...
BruNews, MVP VC++
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
pour ta question a propos de (BYTE), a priori il s'agit uniquement de caster le résultat du strlen() en byte, soit en 1 octet (8 bits).
tu peux donc avoir un retour compris entre 0 et 255.
En amont de ton égalité tu as un pointeur sur un élément d'une chaine de caractères LPSTR(cf ci-dessous). Ces chaines sont des suites de lettres codées chacune sur 1 octet (format ANSI) d'où le rapprochement avec les bytes. Pour être certain que ton code ASCII est bien mis correctement, tu peux caster (forcer le format) en BYTE. En admettant que le resultat de strlen() dépasses 255 le résultat serait faussé (soit 255, soit 0, soit error je sais plus trop)

pour la seconde question, je n'ai pas trop planché sur ton code, mais je dirais qu'il manque quelque chose à l'initialisation du for, et plus exactement à la deuxième partie, où tu précises jusqu'où tu incrémentes nFuncs... (*)

pour la troisième, BruNews t'as répondu (abruptement), et j'ai vaguement complété en répondant à la première. si tu as besoin de plus d'explications demande !

  for(nFuncs= 0;   (*)  func[nFuncs][0];     nFuncs++) {
             for(i =0; i<9; i++) {
                 func[nFuncs][i][0]     = (BYTE) strlen(func[nFuncs][i]+1);
             }     // [ligne][chaine][caractère]

         }

voila j'espère que ca t'a aidé.

Loki
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
il ne manque rien dans le for, quand func[nFuncs][0] vaudra 0 alors boucle stoppera, règle normale du déroulement d'un for.

ciao...
BruNews, MVP VC++
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
ah ok j'avais jamais utilisé ce système désolé. mais alors quoi de mieux qu'un while dans ce cas ?

Loki
Messages postés
15
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
16 mai 2007

Merci pour vos reponses.
Brunews qu'appels tu  "l'offset d'élément de chaque chaine."
si tu pouvais m'en dire un peu plus sur cette notation à trois indice
merci
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
for(A; B; C) {...}
Les 3 parties (A, B, et C) sont optionnelles.
A - Initialisation, 1 seule fois avant boucle.
B - Condition bouclage, vérif de NON 0 AVANT chaque tour de boucle.
C - Ce qu'on veut, effectué à chaque fin de boucle.
while() ne comporte que la condition d'arrêt qui est la partie B de for.

char chaine[12];
élem chaine[2] (le troisieme) est à offset = ADDRESSE(chaine) + 2 * sizeof(char).

char chaine[LEN][12];
élem chaine[pos][3] est à offset = ADDRESSE(chaine) + pos * LEN * sizeof(char)  + 3 * sizeof(char).

ciao...
BruNews, MVP VC++
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
c'est kif kif bourricot tout ça (for et while) parce que i= 0;while(i<10){i++;} c'est une boucle for. bref...

je me trompe surement mais j'aurais dis :

char chaine[LEN][ 12 ];
élem chaine[pos][3] est à offset = ADDRESSE(chaine) + pos * 12 * sizeof(char)  + 3 * sizeof(char).

au lieu de

char chaine[LEN][12];
élem chaine[pos][3] est à offset = ADDRESSE(chaine) + pos * LEN * sizeof(char)  + 3 * sizeof(char).

Loki
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Tout à fait, heureuse rectification.
Faut pas répondre au forum en bossant... j'y retourne.

ciao...
BruNews, MVP VC++
Messages postés
15
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
16 mai 2007

je suis ok avec ça! merci