Oppure

Loading
11/05/10 14:05
Phi
Strano che ti dia quel messaggio.
L'errore che ti segnala non è un errore.

Comunque posso dirti altre 2 cose:
1) E' sbagliato la fine del programma, hai dimenticato ; dopo l'ultimo writeln. Scrivi :
  end
 else  Writeln('Operazione non permessa: C1!=R2');
 readln;
end.


2) Secondo me ti conviene scaricare la nuova versione del compilatore(l'ultima versione è la 2.4.0). Vai a freepascal.org/…
Ultima modifica effettuata da Phi 11/05/10 14:08
aaa
29/05/10 9:15
Suxdario88
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!!
aaa
29/05/10 11:14
Phi

Che errore e in che parte del codice ??
aaa
30/05/10 16:42
Suxdario88
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 31/05/10 10:42
aaa
31/05/10 10:47
Phi
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.
aaa
31/05/10 11:19
Suxdario88
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"

 SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *) 
        SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *) 
     
        Writeln('Inserisci la prima matrice'); 
        for i:=0 to R1-1 do   
                begin   
                for j:=0 to C1-1 do   
                begin 
                          write('Inserisci: Matrice[',i,',',j,']='); 
                    Readln(myArray1[i*C1+j]);   
                end; 
            end; 
   
        Writeln('Hai inserito questa matrice: '); 
        printMatrice(myArray1,R1,C1);     

        Writeln('Inserisci la seconda matrice'); 
        for i:=0 to R2-1 do   
                begin   
                for j:=0 to C2-1 do   
                begin 
                          write('Inserisci: Matrice[',i,',',j,']='); 
                    Readln(myArray2[i*C2+j]);   
                end; 
            end; 

          Writeln('Hai inserito questa matrice: '); 
        printMatrice(myArray2,R2,C2);     
Ultima modifica effettuata da Phi 31/05/10 11:24
aaa
31/05/10 12:16
Suxdario88
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?


Program ProdottoMatriciale(output);

Type  
  mioTipo = Array of Real; (* La matrice Ë di numeri reali *)

var R1,R2,C1,C2: Integer; (* Dimensioni delle matrici *)

Var  
  myArray1 : mioTipo;	(* Matrice vera e propria *)
  myArray2 : mioTipo;   
  
(* Stampa la schermata iniziale *)
procedure printWS();
begin
  Writeln('***********************');
  Writeln('*     Prodotto tra    *');
  Writeln('*        Matrici      *');
  Writeln('***********************');
  Writeln(); (*Stampa una riga vuota*)
end;


(* Stampa la matrice con 2 cicli FOR *)

procedure printMatrice(mat: mioTipo; R: Integer; C: Integer);
var i,j: Integer;
begin
	For i:=1 to R do  
    	begin  
	    For j:=1 to C do  
		begin
			Write(mat[i*C+j]);  
		end;
	    Writeln;
	end;
end;


(* Fa il prodotto tra matrici: ris(i,j) = m1(i,k)*m2(k,j) Per k = 1..R1 *)

procedure product(m1,m2: mioTipo; R1,C1,R2,C2: Integer);
var i,j,k: Integer;
var attuale: Real;
begin
	attuale :=0;	(* Il singolo elemento. Viene azzerato ogni volta dopo che l'ho stampato *)
	For i:=1 to R1 do begin
		For j:=1 to C2 do begin
			For k:=1 to R1 do begin
				attuale := attuale + m1[i*C1+k]*m2[k*C2+j]
			end;
			Write(attuale);
			attuale :=0
		end;
		Writeln()
	end
		
end;
  	

(* Questo e' il main *)
var i,j: Integer;
begin
	printWS();

	(* Dati di input *)
	Write('Inserisci il numero di righe della prima matrice:');
	Readln(R1);
	Write('Inserisci il numero di colonne della prima matrice:');
	Readln(C1);

	Write('Inserisci il numero di righe della seconda matrice:');
	Readln(R2);
	Write('Inserisci il numero di colonne della seconda matrice:');
	Readln(C2);

	(* Controllo se il prodotto di puÚ fare ( C1 = R2) *)
	if C1 = R2 then begin

		SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *)
		SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *)
	
		Writeln('Inserisci la prima matrice');
		For i:=1 to R1 do  
    			begin  
			    For j:=1 to C1 do  
				begin
	      				Write('Inserisci: Matrice[',i,',',j,']=');
					Readln(myArray1[i*C1+j]);  
				end;
			end;
  
		Writeln('Hai inserito questa matrice: ');
		printMatrice(myArray1,R1,C1);	

		Writeln('Inserisci la seconda matrice');
		For i:=1 to R2 do  
    			begin  
			    For j:=1 to C2 do  
				begin
	      				Write('Inserisci: Matrice[',i,',',j,']=');
					Readln(myArray2[i*C2+j]);  
				end;
			end;

  		Writeln('Hai inserito questa matrice: ');
		printMatrice(myArray2,R2,C2);	

		Writeln('Verr‡ ora eseguito il prodotto. Premi INVIO per continuare');
		Readln();

		product(myArray1,myArray2,R1,C1,R2,C2);

		
		end
	else 
		Writeln('Operazione non permessa: C1!=R2')
end.


aaa
31/05/10 19:32
Phi
Visto che non parti più da 0 ma da 1 devi anche ingrandire l'array.

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


Ma ricordati sempre il readln finale
Ultima modifica effettuata da Phi 31/05/10 19:38
aaa