Usando funcoes de usuario no Scilab atraves de interfaces: Ex.: c = soma (a, b); 1- Escrever programa de interface: #include "/home/elaine/scilab-4.1.2/routines/stack-c.h" #include #include /* Interface para : --> C = soma (A,B) */ void soma __PARAMS((int *a, int *b, int *c)); int intsoma(char *fname){ static int pos1, m1, n1, pos2, m2, n2, pos3; FILE *log = fopen("log.txt","w"); fprintf(log,"Antes das verificacoes da interface\n"); fflush(log); /* verifica numero de entradas de C = soma (A,B)*/ static int minlhs = 1, maxlhs = 1, minrhs = 2, maxrhs = 2; CheckRhs(minrhs, maxrhs); // lado direto da funcao CheckLhs(minlhs, maxlhs); // lado esquerdo da funcao fprintf(log,"lhs min: %d, lhs max: %d, rhs min: %d, rhs max %d\n",minlhs,maxlhs, minrhs, maxrhs); fflush(log); /* coloca argumentos na pilha */ /* argumento 1; tipo inteiro; coloca dimensoes em m1 e n1; pos1 e um ponteiro para a estrutura*/ GetRhsVar(1, "i", &m1, &n1, &pos1); GetRhsVar(2, "i", &m2, &n2, &pos2); fprintf(log,"dimensoes do primeiro arg: %d, %d. Dimensoes do segundo arg: %d, %d\n",m1,n1, m2, n2); fflush(log); /* confere se os argumentos de entrada tem mesmo tamanho */ if (n1 != n2 || m1 != m2){ cerro("Argumentos de entrada devem ter o mesmo tamanho\n"); return 0; } /* Cria uma variavel para saida e coloca na pilha */ fprintf(log,"Antes de criar variavel de saida na pilha\n"); fflush(log); CreateVar(3, "i", &m1, &n1, &pos3); fprintf(log,"Depois de criar variavel de saida\n"); fflush(log); fprintf(log,"Chama funcao\n"); fflush(log); /*Chama funcao de usuario com os valores da pilha (istk = integer stack) */ soma(istk(pos1), istk(pos2), istk(pos3)); /*primeiro argumento de saida, C, assume o valor da var na terceira posi cao da pilha */ LhsVar(1) = 3; return 0; } void soma(int *a, int *b, int *c){ printf("Dentro da funcao\n"); // fflush(log); *c = *a +*b; } 2 - Executar o builder para adicionar o nome do arquivo de interface e o nome da funcao do Scilab a biblioteca compartilhada: ilib_name = 'libsoma'; files = ['intsoma.o']; libs = []; table = ['soma', 'intsoma']; ilib_build(ilib_name, table, files, libs) **Este passo pode ser executado editando um Makefile. Checar exemplo em /SCIDIR/examples/interface-tutorial 3 - No Scilab, chamar o loader: -->exec('loader.sce') **************************************************** Testes: -->c=soma(1,3) c = 4. -->c=soma(133,3) c = 136. -->c = soma() !--error 77 soma: wrong number of rhs arguments --> c = soma(1,2,3) !--error 77 soma: wrong number of rhs arguments -->c = soma ([1,2], 0) !--error 9999 Argumentos de entrada devem ter o mesmo tamanho -->c=soma([133,3],[1,6]) c = 134. 18. <- resultado errado!!! ******************************************************** Quanto ao resultado errado: Criticar argumentos de entrada diferentes de m=n=1 ou criar abstracao na funcao soma que permita soma de matrizes.