Newsgroup: it.comp.lang.c
Titolo: prodotto matriceXmatrice (lunghetto)

qualcuno potrebbe per favore capire che cosa c'è che non va nel seguente
algoritmo?!?!?
è un algoritmo per il prodotto di 2 matrici, probabilmente ci sarà qualche
errore stupidissimo, cmq quando lo vado ad eseguire arriva fino
all'inserimento degli elementi della prima riga, poi s'imballa (continua a
inserire elementi all'infinito!!)
e compare la scritta
"scanf : floating point formats not linked"
ecco l'algoritmo
/********************************************/
#include<stdlib.h>
#include<stdio.h>
void prod_mat_mat(float **A,float **B,float **C,int m,int n,int s)
{
int i,j,k;
for(i=0;i<m;i++)
{   for(j=0;j<n;j++)
    { C[i][j]=0;
        for(k=0;k<s;k++)
        { C[i][j]=C[i][j]+(A[i][k]*B[k][j]);
}}}}
main()
{
float **A,**B,**C;
int m,n,s,i,j;
printf("\t PRODOTTO MATRICExMATRICE");
printf("\n\n\t A[m][s]xB[s][n]=C[m][n]\n");
printf(" inserire valore di m\n==>");
scanf("%d",&m);
printf("\n inserire valore s\n==>");
scanf("%d",&s);
printf("\n inserire valore n\n==>");
scanf("%d",&n);
A=(float**)malloc(m*sizeof(float*));
for(i=0;i<m;i++)
{ A[i]=(float*)malloc(s*sizeof(float));}
B=(float**)malloc(s*sizeof(float*));
for(i=0;i<s;i++)
{ A[i]=(float*)malloc(n*sizeof(float));}
C=(float**)malloc(m*sizeof(float*));
for(i=0;i<m;i++)
{ A[i]=(float*)malloc(n*sizeof(float));}
printf("\n inserire gli elementi della matrice A");
for(i=0;i<m;i++)
{ printf("\n inserire i %d elementi riga %d",s,i+1);
  for(j=0;j<s;j++)
  { scanf("%f",&A[i][j]);}}
printf("\n inserire gli elementi della matrice B");
for(i=0;i<s;i++)
{ printf("\n inserire i %d elementi riga %d",n,i+1);
  for(j=0;j<n;j++)
  { scanf("%f",&A[i][j]);}}
prod_mat_mat(A,B,C,m,n,s);
printf("\n la matrice risultato C è così composta\n");
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
  { printf("\|%.0f",&A[i][j]);}
    printf("\n");}
system("pause");
}
/******************************************/
grazie a chiunque gli darà un'occhiata!
ciao

Direttamente dal mio programmino Matrix 4 School (della serie "non
facciamoci pubblicità" ^_^).
Dome
typedef struct{
 char name[20];
 uint rows,cols;
 float elem[NMAX][NMAX];
} matrix;
typedef unsigned int uint;
uint MulMatrix(matrix m1, matrix m2, matrix *result)
{
 uint i,j,n;
 /*Controlla se il prodotto è definito*/
 if(m1.cols!=m2.rows) return -1;
 result->rows = m1.rows;
 result->cols = m2.cols;
 /*Inizializza la matrice risultato*/
 for(i=0;i<m1.rows;i++)
  for(j=0;j<m2.cols;j++)
   result->elem[i][j] = 0.0;
 /*Ogni entrata della matrice risultato è il prodotto della i-esima riga di
m1*/
 /*per la j-esima colonna di m2 (CREDO...non mi ricordo la definizione ;P */
 for(i=0;i<m1.rows;i++)
  for(j=0;j<m2.cols;j++)
   for(n=0;n<m1.cols;n++)
    result->elem[i][j] += m1.elem[i][n] * m2.elem[n][j];
 return 0;
}

 facciamoci pubblicità" ^_^).
ti ringrazio, ma io vorrei sapere cosa c'è di sbagliato nel mio di
algoritmo!!

Mi dici solo se il tuo errore è nella funzione che moltiplica le due matrici
o nel resto del programma?
Dome

 A=(float**)malloc(m*sizeof(float*));
con
if (!(A=(float**)malloc(m*sizeof(float*)))
{
    printf("L'allocazione di A non è andata a buon fine.\n\n");
    exit(0);
}
o qualcosa di simile. E così per tutte le allocazioni. Ti ripeto che non
garantisco che sia qui il problema, però da qualche parte bisogna pur
cominciare, no?
Riz


secondo me č nella main che richiama la function!
e poi quel messaggio d'errore sul floating point, sai che significa?
ciao

Okkio, ke ti da uno strano errore nel linking delle librerie per il floating
point... quando fa cosi vuol dire che manca una lib mi sembra! Prova a
vedere qualche vecchio post!
A vedere cosi il programma l'unica mancanza è il controllo
sull'allocazione.... ah... giusto per provare... leva quel "| %.0f" dalla
parte che stampa la matrice finale, e metti un "| %.3f".
Dome

 }
ti ringrazio per il consiglio, ho provato a farlo,  ma quando vado ad
eseguire l'algoritmo compilato (tra l'altro senza warning nè errori) mi da
sempre lo stesso problema
ciao

 point... quando fa cosi vuol dire che manca una lib mi sembra!
mah, non credo che si tratti di librerie mancanti.... <stdlib.h> supporta
malloc, cmq ho provato ad inserire anche <malloc.h> ma nulla da fare, il
punto č che l'esecuzione si blocca prima dell'inserimento degli elementi
della prima matrice, quindi č sensato pensare ad un errore nell'allocazione
dinamica...
cmq ora basta cosě, sono troppo stanca per perderci ancora tempo, lo
esaminerň meglio domani, cmq grazie mille, se vi viene qualcos'altro in
mente fatemi sapere
ciao

No no no! Non header! Librerie! .lib!
Dome

"scanf : floating point formats not linked"
Dalla Community Borland :
Article #15204: "Floating point formats not linked" messages. 
Technical Information Database
TI204C.txt   "Floating point formats not linked" messages.     
Category   : General
Platform   : All
Product    : Borland C++  ALL    
Description:
  This document explains why you might be getting the error
  FLOATING POINT FORMATS NOT LINKED : ABNORMAL PROGRAM TERMINATION
  and tells you how to resolve it.  The problems and solutions
  below apply to ALL versions of Turbo C, Turbo C++, and Borland
  C++, except where noted.
  What are floating point formats?
  Floating point formats are a collection of formatting information
  used to manipulate floating point numbers in certain runtime
  library functions such as scanf() and atof().
  When will this be fixed?
  There are no current plans to fix this because it is not a bug.
  The intent is to avoid linking the floating point formats (about
  1K of overhead) when they are not required.  The tradeoff of this
  feature is that the programmer must explicitly request that the
  floating point formats to be linked in for some programs which
  manipulate floats in a limited and specific fashion.
  How do I resolve the error message?
  Since you can get the error in a number of different ways, check
  the following list of potential causes to find out how to resolve
  the error.  These are listed in order of most common to least
  common causes.
  1.  CAUSE:  Floating point set to .  Your have your
      floating point option set to None when it should be set to
      either Emulation or 80x87.
      FIX:  Set Floating Point to  or <80x87>.  In the
      Integrated Development Environment (IDE), this is either
      under Options | Compiler | Advanced Code Generation or
      Options | Compiler | Code Generation | More, depending upon
      which compiler you have.  With the command line compiler, use
      the appropriate -f switch.
  2.  CAUSE:  Misordered libraries when executing TLINK
      (Cx.LIB listed before EMU.LIB will cause the error.)
      FIX:  This possibility usually occurs only when you are using
      the command line compiler and are explicitly calling TLINK
      separately from BCC or TCC.  When executing TLINK, change the
      order of the libraries to
           [user libs] [GRAPHICS.LIB] EMU.LIB MATHx.LIB Cx.LIB
                  (libraries in brackets are optional)
      Note:  There is a misprint in the Borland C++ Tools &
      Utilities Guide on page 58 that displays the wrong order for
      libraries on the TLINK command line.  The ordering shown in
      the manual is exactly what will cause floating point formats
      not linked.
  3.  CAUSE:  Either the compiler is overoptimizing, or the
      floating point formats really do need to be linked in because
      your program manipulates floats in a limited and specific
      fashion.  Under certain obscure conditions, the compiler will
      ignore floating point usage in scanf().  (e.g., trying to
      read into a float variable that is part of an array contained
      in a structure.)
      FIX:  If you have Borland C++ 3.0 or later, read Part A.  If
      you have Borland C++ 2.0 or any Turbo C or Turbo C++
      compiler, read Part B.  This fix is the only fix that will
      solve a "PRINTF : Floating point formats not linked" error
      message occurring with inline assembly.
      Part A (BC++ 3.0 or later):
          Add the following to one source module:
              extern _floatconvert;
              #pragma extref _floatconvert
          The README and HELPME!.DOC files that shipped with
          Borland C++ 3.0 incorrectly say that only
              #pragma extref _floatconvert
          is required in order to resolve the FPFNL error.  If you
          do not include the "extern _floatconvert;" line you will
          get the error "Undefined symbol _floatconvert."  You will
          also get the same undefined symbol if the "extern
          _floatconvert" comes after the #pragma line instead of
          before.  Note that the #pragma line does not have a
          semicolon at the end of the line.  If you put a semicolon
          there, you will get the error "Bad pragma directive
          syntax."
          The README that shipped with Borland C++ 3.1 says that
              extern void _floatconvert();
              #pragma extref _floatconvert
          This should work, as well.  It doesn't really matter
          whether _floatconvert is a variable or a function; it
          only matters that it is some symbol that the linker will
          recognize.
          The HELPME!.DOC for BC++ 3.1 has the correct two lines to
          add.
      Part B (BC++ 2.0 or TC or TC++):
          Add the following force_fpf() function to one source
          module.  It is not necessary to call this function; just
          include it in one of your modules.
          static void force_fpf()
          {
              float x, *y; /* Just declares two variables */
              y = &x;      /* Forces linkage of FP formats */
              x = *y;      /* Suppress warning message about x */
          }
  4.  CAUSE:  Forgetting to put the address operator & on the scanf
      variable expression.  For example,
          float foo;
          scanf("%f", foo);
      FIX:  Change the code so that the & operator is used where it
      is needed.  For example, the above code should be
          float foo;
          scanf("%f", &foo);
  5.  CAUSE:  A bug in Turbo C 2.0 when using scanf()
      FIX:  Obtain and apply the patches in TC2PAT.ARC.  This file
      can be downloaded from the Languages / C++ / Patches section
      on DLBBS 
(408-439-9096
).
  6.  CAUSE:  A bug in Turbo C 2.01 when using atof() or strtod()
      FIX:  Obtain and apply the patches in TC21PT.ARC.  This file
      can be downloaded from the Languages / C++ / Patches section
      on DLBBS 
(408-439-9096
).
  7.  CAUSE:  You are trying to create a Phar Lap DOS Extender
      application with the Integrated Development Environment
      (IDE).
      FIX:  Phar Lap includes an executable called BCC286.EXE with
      their DOS Extender.  This program calls Borland's command-
      line compiler (BCC) and command-line linker (TLINK).  Since
      the linker in the IDE is different than the linker at the
      command line, you cannot create Phar Lap DOS Extender
      applications in the IDE and expect them to run properly.  If
      you try to do so, you might get a floating point formats not
      linked error message.  The fix is to use the command line
      tools, BCC and TLINK, instead of the IDE.
  Keywords:  FPFNL , APT
  DISCLAIMER: You have the right to use this technical information
  subject to the terms of the No-Nonsense License Statement that
  you received with the Borland product to which this information
  pertains.

}
Hmmm... il main e' finito; ma noi non abbiamo restituito
nessun valore di ritorno. main e' dichiarato essere
una funzione che torna un int... se tutto e' andato
bene dovresti restituire 0 per informare della cosa il
sistema operativo.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 Whoops... nel copia-incolla ti sei dimenticato ....
mi sento una deficiente....................
grazie mille, ora l'algoritmo funziona, giuro che non mi scoccierò mai + di
riscrivere l'allocazione dinamica delle matrici a mano una per una!!!
^__^
ciao