Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Prodotto tra matrici
Forum - Pascal - Prodotto tra matrici - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Suxdario88 (Normal User)
Newbie


Messaggi: 8
Iscritto: 10/05/2010

Segnala al moderatore
Postato alle 11:15
Sabato, 29/05/2010
ragazzi ho ripreso in mano il progetto ed ho visto, mandandolo in esecuzione, che le matrici me le compila a partire da 0;0 e non da 1;1 :S

ho provato a cambiare un pò di valori ma ora mi dà errori in esecuzione e mi chiude in automatico il programma :(

vi prego ragazzi aiutatemi!!

PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 13:14
Sabato, 29/05/2010

Che errore e in che parte del codice ??

PM Quote
Avatar
Suxdario88 (Normal User)
Newbie


Messaggi: 8
Iscritto: 10/05/2010

Segnala al moderatore
Postato alle 18:42
Domenica, 30/05/2010
il compilatore non mi dà problemi, solo che quando vado in esecuzione, appena inizio a mettere i valori nella matrice mi salta tutto...
mi dà runtime error 201 ...

che valori devo cambiare??? :(

Ultima modifica effettuata da Phi il 31/05/2010 alle 12:42
PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 12:47
Lunedì, 31/05/2010
L'errore 201 vuol dire che hai cercato di inserire o leggere un valore in un array con un indice che non esiste.
In sostanza, può essere un esempio questo:
ho a : array[0..5] of byte e provo a scrivere a[12323] := valore;.

prova a controllare se le dimensioni dell'array vanno aumentate, usa setlength.

Posta un codice che possiamo controllare.

PM Quote
Avatar
Suxdario88 (Normal User)
Newbie


Messaggi: 8
Iscritto: 10/05/2010

Segnala al moderatore
Postato alle 13:19
Lunedì, 31/05/2010
il codice è rimasto uguale da come lo avevo inserito qui nel forum e come vedi setlenght è rimasto invariato...
non capisco cosa c'è da cambiare... ho dichiarato le mie matrici come array of real, quindi dovrei considerare tutti i numeri...

cosa può dargli noia? ho cambiato solamente gli 1 con gli 0 e messo "R1,C1,R2,C2" invece che "R1-1,C1-1,R2-1,C2-1"

Codice sorgente - presumibilmente Delphi

  1. SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *)
  2.         SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *)
  3.      
  4.         Writeln('Inserisci la prima matrice');
  5.         for i:=0 to R1-1 do  
  6.                 begin  
  7.                 for j:=0 to C1-1 do  
  8.                 begin
  9.                           write('Inserisci: Matrice[',i,',',j,']=');
  10.                     Readln(myArray1[i*C1+j]);  
  11.                 end;
  12.             end;
  13.    
  14.         Writeln('Hai inserito questa matrice: ');
  15.         printMatrice(myArray1,R1,C1);    
  16.  
  17.         Writeln('Inserisci la seconda matrice');
  18.         for i:=0 to R2-1 do  
  19.                 begin  
  20.                 for j:=0 to C2-1 do  
  21.                 begin
  22.                           write('Inserisci: Matrice[',i,',',j,']=');
  23.                     Readln(myArray2[i*C2+j]);  
  24.                 end;
  25.             end;
  26.  
  27.           Writeln('Hai inserito questa matrice: ');
  28.         printMatrice(myArray2,R2,C2);


Ultima modifica effettuata da Phi il 31/05/2010 alle 13:24
PM Quote
Avatar
Suxdario88 (Normal User)
Newbie


Messaggi: 8
Iscritto: 10/05/2010

Segnala al moderatore
Postato alle 14:16
Lunedì, 31/05/2010
questo è quanto ho fatto...
ho tolto gli "1" dal conteggio dei cicli for, e infatti in questo modo la mia matrice parte da [1,1] e non + da [0,0]... solo che poi mi dà problemi quando deve cambiare riga di inserimento dati...

secondo voi cosa può esserci di sbagliato?

Codice sorgente - presumibilmente Delphi

  1. Program ProdottoMatriciale(output);
  2.  
  3. Type  
  4.   mioTipo = Array of Real; (* La matrice Ë di numeri reali *)
  5.  
  6. var R1,R2,C1,C2: Integer; (* Dimensioni delle matrici *)
  7.  
  8. Var  
  9.   myArray1 : mioTipo;   (* Matrice vera e propria *)
  10.   myArray2 : mioTipo;  
  11.  
  12. (* Stampa la schermata iniziale *)
  13. procedure printWS();
  14. begin
  15.   Writeln('***********************');
  16.   Writeln('*     Prodotto tra    *');
  17.   Writeln('*        Matrici      *');
  18.   Writeln('***********************');
  19.   Writeln(); (*Stampa una riga vuota*)
  20. end;
  21.  
  22.  
  23. (* Stampa la matrice con 2 cicli FOR *)
  24.  
  25. procedure printMatrice(mat: mioTipo; R: Integer; C: Integer);
  26. var i,j: Integer;
  27. begin
  28.         For i:=1 to R do  
  29.         begin  
  30.             For j:=1 to C do  
  31.                 begin
  32.                         Write(mat[i*C+j]);  
  33.                 end;
  34.             Writeln;
  35.         end;
  36. end;
  37.  
  38.  
  39. (* Fa il prodotto tra matrici: ris(i,j) = m1(i,k)*m2(k,j) Per k = 1..R1 *)
  40.  
  41. procedure product(m1,m2: mioTipo; R1,C1,R2,C2: Integer);
  42. var i,j,k: Integer;
  43. var attuale: Real;
  44. begin
  45.         attuale :=0;    (* Il singolo elemento. Viene azzerato ogni volta dopo che l'ho stampato *)
  46.         For i:=1 to R1 do begin
  47.                 For j:=1 to C2 do begin
  48.                         For k:=1 to R1 do begin
  49.                                 attuale := attuale + m1[i*C1+k]*m2[k*C2+j]
  50.                         end;
  51.                         Write(attuale);
  52.                         attuale :=0
  53.                 end;
  54.                 Writeln()
  55.         end
  56.                
  57. end;
  58.        
  59.  
  60. (* Questo e' il main *)
  61. var i,j: Integer;
  62. begin
  63.         printWS();
  64.  
  65.         (* Dati di input *)
  66.         Write('Inserisci il numero di righe della prima matrice:');
  67.         Readln(R1);
  68.         Write('Inserisci il numero di colonne della prima matrice:');
  69.         Readln(C1);
  70.  
  71.         Write('Inserisci il numero di righe della seconda matrice:');
  72.         Readln(R2);
  73.         Write('Inserisci il numero di colonne della seconda matrice:');
  74.         Readln(C2);
  75.  
  76.         (* Controllo se il prodotto di puÚ fare ( C1 = R2) *)
  77.         if C1 = R2 then begin
  78.  
  79.                 SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *)
  80.                 SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *)
  81.        
  82.                 Writeln('Inserisci la prima matrice');
  83.                 For i:=1 to R1 do  
  84.                         begin  
  85.                             For j:=1 to C1 do  
  86.                                 begin
  87.                                         Write('Inserisci: Matrice[',i,',',j,']=');
  88.                                         Readln(myArray1[i*C1+j]);  
  89.                                 end;
  90.                         end;
  91.  
  92.                 Writeln('Hai inserito questa matrice: ');
  93.                 printMatrice(myArray1,R1,C1);  
  94.  
  95.                 Writeln('Inserisci la seconda matrice');
  96.                 For i:=1 to R2 do  
  97.                         begin  
  98.                             For j:=1 to C2 do  
  99.                                 begin
  100.                                         Write('Inserisci: Matrice[',i,',',j,']=');
  101.                                         Readln(myArray2[i*C2+j]);  
  102.                                 end;
  103.                         end;
  104.  
  105.                 Writeln('Hai inserito questa matrice: ');
  106.                 printMatrice(myArray2,R2,C2);  
  107.  
  108.                 Writeln('Verr‡ ora eseguito il prodotto. Premi INVIO per continuare');
  109.                 Readln();
  110.  
  111.                 product(myArray1,myArray2,R1,C1,R2,C2);
  112.  
  113.                
  114.                 end
  115.         else
  116.                 Writeln('Operazione non permessa: C1!=R2')
  117. end.




PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 21:32
Lunedì, 31/05/2010
Visto che non parti più da 0 ma da 1 devi anche ingrandire l'array.

Scrivi:
Codice sorgente - presumibilmente Plain Text

  1. SetLength(myArray1,R1*(C1+1)+1); (* Alloco memoria per la matrice *)
  2. SetLength(myArray2,R2*(C2+1)+1); (* Alloco memoria per la matrice *)



Ma ricordati sempre il readln finale

Ultima modifica effettuata da Phi il 31/05/2010 alle 21:38
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo