Hi!
Ich möchte aus einem AddIn auf eine Matrix oder eine Liste zugreifen. Ist das irgendwie möglich?
Danke, Paul
Willst Du trotzdem Beispielcode? Ist nichts Wildes.
SYSCALL 0376, _MCS_SearchDirectoryItem
SYSCALL 0500, _BCDtoInternal
// Die zugehörigen Interfaces verfügbar machen:
int MCS_SearchDirectoryItem( unsigned char*dir, unsigned char*item, char*flags_0, void*item_ptr, int*data_ptr, int*data_length );
int BCDtoInternal( void*p1, void*p2 );
// zwei Strukturen zum inneren Aufbau der BCD-Werte, mit denen der fx-9860 arbeitet
typedef struct{
unsigned char hnibble:4;
unsigned char lnibble:4;
} TBCDbyte;
typedef struct{
unsigned short exponent:12;
unsigned short mantissa0:4;
TBCDbyte mantissa[7];
char flags[3];
} TBCDvalue;
// Anders ausgedrückt: eine BCD-Dezimalzahl im fx-9860 besteht aus 3 nibbles Exponent und 15 nibbles Mantisse.
// Basisstruktur einer Liste oder Matrix im fx-9860
typedef struct{
char Name[8];
short rows;
short cols;
int reserved;
TBCDvalue value[ 0x8000 ];
} TFX9860ListMat;
// Hinweis: mit TFX9860ListMat darf man keine Variablen, sondern nur Zeiger auf TFX9860ListMat deklarieren!
// Um das in eine C-Variable von Typ double umzuwandeln benötigt man zunächst die folgende Struktur:
// diese Struktur wird nur intern in BCDtoDouble verwendet.
// Sie hat ansonsten keine Bedeutung, also ggf. sofort vergessen und in einer Headerdatei vergraben.
typedef struct{
int exponent;
int sign;
int reserve;
char mantissa[15];
} TBCDInternal;
// und die Funktion
//
double BCDtoDouble( TBCDvalue*pvalue ){
double result=0;
int i;
double factor = 1;
TBCDInternal work;
BCDtoInternal( &work, pvalue );
result = work.mantissa[0];
for (i=1;i<15;i++){
factor /= 10;
if (work.mantissa[i]){ result += factor * work.mantissa[i]; };
};
while ( work.exponent++ < 0 ){ result /= 10;};
while ( --work.exponent > 0 ){ result *= 10;};
result *= work.sign;
return result;
};
// Das Hauptprogramm:
//
int AddIn_main(int isAppli, unsigned short OptionNum)
{
int result;
double dw;
char flags_0;
int item_ptr;
int data_length;
TFX9860ListMat*data_ptr;
// holt den Zeiger auf Mat A
result = MCS_SearchDirectoryItem( (unsigned char*)"main", (unsigned char*)"MAT_A", &flags_0, &item_ptr, (int*)&data_ptr, &data_length );
if (!result){
// jetzt kann über den pointer data_ptr auf die Matrix zugegriffen werden
dw = BCDtoDouble( &(*data_ptr).value[3] ); // holt den letzten Wert eine 2x2 Matrix
/*
WICHTIG! (*data_ptr).rows und (*data_ptr).cols geben die Dimensionen der Matrix wieder.
Der Index in (*data_ptr).value[ index ] darf ( (*data_ptr).rows * (*data_ptr).cols - 1 ) nie überschreiten.
Wenn man in den durch data_ptr definierten Datenbereich unkontrolliert hineinschreibt,
dann kann der Inhalt des MainMemory's Schaden nehmen!
*/
}
// holt den Zeiger auf List1
result = MCS_SearchDirectoryItem( (unsigned char*)"main", (unsigned char*)"1LIST1", &flags_0, &item_ptr, (int*)&data_ptr, &data_length );
if (!result){
// jetzt kann (wie oben) über den pointer data_ptr auf die Liste zugegriffen werden
}
return 1;
}
Zurück zu fx-9860G SDK (Alle fx-9860G Modelle)
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast