Hello Embedded Wizard,
I am using EW 13.02.
I Have a function that tries to combine a error message string. It uses an array of active message id's, finds the corresponding string and either returns an empty string, a string with one message, or a string like "1/3: mess 1 2/3: mess 2 3/2: mess 3"
In this function I use a do ... while (false) construction with a strange result (again)
string GetMessageString()
var string sXOfYSeparator = "/";
var string sNrMessageSeparator = ": ";
var string sMessageSeparator = " ";
array string asShownMessages[3];
var int32 iShownCount = 0;
var int32 iMessageIndex;
var int32 iShownIndex;
var string sShownMessage;
do
{
if (false == MessagesChanged) // class property (boolean)
{
break;
}
CurrentMessage = ""; // class property (string)
MessagesChanged = false;
// 1st: Get max < asShownMessages.size> unique messages
for(iMessageIndex = 0; iMessageIndex < NrOfMessages; iMessageIndex++)
{
var bool bFound = false;
sShownMessage = Application::TheSettings.GetFaultText(Messages[iMessageIndex]); // convert id to string from string table
for(iShownIndex = 0; iShownIndex < iShownCount; iShownIndex++)
{
if (asShownMessages[iShownIndex] == sShownMessage)
{
bFound = true;
}
}
if (false == bFound)
{
asShownMessages[iShownCount] = sShownMessage;
iShownCount++;
}
if(iShownCount == asShownMessages.size)
{
break;
}
}
// 2nd: Create Message string
switch(iShownCount)
{
case 0: CurrentMessage = "";
case 1: CurrentMessage = asShownMessages[0];
default:
{
sShownMessage = "";
for(iShownIndex = 0; iShownIndex < iShownCount; iShownIndex++)
{
if (iShownIndex != 0) sShownMessage = sShownMessage + sMessageSeparator;
sShownMessage = sShownMessage + string(iShownIndex + 1) + sXOfYSeparator + string(iShownCount) + sNrMessageSeparator + asShownMessages[iShownIndex];
}
CurrentMessage = sShownMessage;
}
}
} while(false);
return CurrentMessage;
====================== End of code
Generated code
/* 'C' function for method : 'Application::MessageCollection.GetMessageString()' */
XString ApplicationMessageCollection_GetMessageString( ApplicationMessageCollection _this )
{
XString asShownMessages[ 3 ] = {0};
XInt32 iShownCount = 0;
XInt32 iMessageIndex;
XInt32 iShownIndex;
XString sShownMessage;
for (;;)
{
if ( 0 == _this->MessagesChanged )
break;
ApplicationMessageCollection_OnSetCurrentMessage( _this, 0 );
ApplicationMessageCollection_OnSetMessagesChanged( _this, 0 );
// 1st: Get max < asShownMessages.size> unique messages
for ( iMessageIndex = 0; iMessageIndex < _this->NrOfMessages; iMessageIndex++ )
{
XBool bFound = 0;
sShownMessage = ApplicationSettings_GetFaultText( EwGetAutoObject( &ApplicationTheSettings,
ApplicationSettings ), _this->Messages[ EwCheckIndex( iMessageIndex, 10 )]);
for ( iShownIndex = 0; iShownIndex < iShownCount; iShownIndex++ )
if ( !EwCompString( asShownMessages[ EwCheckIndex( iShownIndex, 3 )], sShownMessage ))
bFound = 1;
if ( 0 == bFound )
{
asShownMessages[ EwCheckIndex( iShownCount, 3 )] = sShownMessage;
iShownCount++;
}
if ( iShownCount == 3 )
break;
}
// 2nd: Create Message string
_EXIT_LOOP_2: // << THIS LABEL SHOULD NOT BE GENERATED
switch ( iShownCount )
{
case 0 :
ApplicationMessageCollection_OnSetCurrentMessage( _this, 0 );
break;
case 1 :
ApplicationMessageCollection_OnSetCurrentMessage( _this, asShownMessages[
0 ]);
break;
default :
{
sShownMessage = 0;
for ( iShownIndex = 0; iShownIndex < iShownCount; iShownIndex++ )
{
if ( iShownIndex != 0 )
sShownMessage = EwConcatString( sShownMessage, EwLoadString( &_Const00D9 ));
sShownMessage = EwConcatString( EwConcatString( EwConcatString( EwConcatString(
EwConcatString( sShownMessage, EwNewStringInt( iShownIndex + 1, 0, 10 )),
EwLoadString( &_Const00DA )), EwNewStringInt( iShownCount, 0, 10 )), EwLoadString(
&_Const00DB )), asShownMessages[ EwCheckIndex( iShownIndex, 3 )]);
}
ApplicationMessageCollection_OnSetCurrentMessage( _this, sShownMessage );
}
}
goto _EXIT_LOOP_2; // << THIS LABEL SHOULD NOT BE CALLED
}
return _this->CurrentMessage;
}