0

コードをより効率的にしようとしています。スクロール ボタンを押すと、関数 'SetName' はiName、メモリに格納されている 5 つの名前に対するインデックスである数値を整数に格納します。名前がメモリに設定されていない場合は、次にスキップします。

コードは機能しますが、多くのスペースを占有します。アドバイスをいただければ幸いです。コード:

    #include <string.h>
    int iName = 0;
    int iNewName = 0;

    BYTE GetName ()
    {
     return  iName;
    }


    void SetName (int iNewName)
    {

      while (iName != iNewName)
      {

      switch (byNewName)
       {
        case 1:
        if (strlen (memory.m_nameA) == 0)
         new_name++;
        else
         iName = iNewName;
        break;

        case 2:
        if (strlen (memory.m_nameB) == 0)
         new_name++;
        else
         iName = iNewName;
        break;

        case 3:
        if (strlen (memory.m_nameC) == 0)
         new_name++;
        else
         iName = iNewName;
        break;

        case 4:
        if (strlen (memory.m_nameD) == 0)
         new_name++;
        else
         iName = iNewName;
        break;

        case 5:
        if (strlen (memory.m_nameE) == 0)
         new_name++;
        else
         iName = iNewName;
        break;

        default:
        iNewName = 1;
        break;
       } // end of case

      } // end of loop

    } // end of SetName function


void main ()
 {
  while(1)
  {
  if (Button_pushed)
   SetName(GetName+1);
  } // end of infinite loop
} // end of main
4

3 に答える 3

0

new_name を静的にできますか?

#include <string.h>
static int iName = 0;
static int iNewName = 0;

BYTE GetName ()
{
 return  iName;
}

void shortCut(char[] m,int N) //may not work for other type of arrays because their pointers are diminished into a single pointer that cannot give "sizeof" value. But strlen function checks for a null element in string.
{
   if (strlen (m) == 0)
     new_name++;
   else
     iName = N;
}

void SetName (int iNewName)
{

  while (iName != iNewName)
  {   
    if(byNewName==1){shortCut(memory.m_nameA, iNewName);}
    else if(byNewName==2){shortCut(memory.m_nameB, iNewName);}
    else if(byNewName==3){shortCut(memory.m_nameC, iNewName);}
    else if(byNewName==4){shortCut(memory.m_nameD, iNewName);}
    else if(byNewName==5){shortCut(memory.m_nameE, iNewName);}
    else{iNewName = 1;}
  } // end of loop

} // end of SetName function

 void main ()
 {
    while(1)
    {
      if (Button_pushed)
      SetName(GetName+1);
    } // end of infinite loop
 } // end of main
于 2013-07-01T15:56:32.723 に答える
0

フォームのすべての行を置き換えます。

if (strlen (memory.m_nameA) == 0)

if( *memory.m_nameA == '\0' )

strlen()これにより、string.hへの依存が削除されます。空の文字列のテストは、文字列の長さを決定する必要がない特殊なケースです。他の場所で使用していない場合は、コードから完全に削除されます。

実際、インデックスで選択された不要な繰り返しコードがあります。代わりにルックアップ テーブルを使用します。

void SetName (int iNewName)
{
    static const char* lookup[] = { memory.m_nameA, 
                                    memory.m_nameB,
                                    memory.m_nameC,
                                    memory.m_nameD,
                                    memory.m_nameE } ;


  while (iName != iNewName)
  {

      iNewName = 1;
      if( byNewName < sizeof(lookup) / sizeof(*lookup) )
      {
          if( *lookup[byNewName] == '\0' )
          {
              new_name++;
          }
          else
          {
              iName = iNewName;
          }
      }
   } // end of loop
}

の名前がmemory​​す​​でに配列である場合、ルックアップ テーブルはまったく必要ありません。

于 2013-07-01T17:19:54.117 に答える