Jump to content
Nokioteca Forum

[mshell] Le Matrici Impazzite


lento
 Share

Recommended Posts

Salve a tutti....nonostante la crisi economica del settore in cui opero oggi sono riuscito a rosicchiarmi una mezzoretta di spensieratezza...

Come molti sanno in mShell gli array possono diventare bidimensionali sfruttando la capacità del semplice array di incorporare altri array.

(E' la stessa cosa che fà Java per gestire gli array a più dimensioni.)

Ovvero:

Se dichiaro un array: primo=[0,1,2] e successivamente lo inglobo in un altro secondo=["ciao",primo]

il secondo è diventato un array quasi bidimensionale infatti posso scrivere: print secondo[1][1] e stamperà 1 che è il valore

contenuto in primo[1] .

Bene! ora date un occhiata a questo:

m=null
p=null
m=["ciao",p]
p=[0,1,m]
m[1]=p
print p[2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1] <-- potete allungarlo quanto volete!
Stamperà -> [0,1,[...<2>]]

Ma cosè una matrice a dimensione infinita? chi sa rispondere?..... :thumbs:

Si accettano anche cavolate, banalità ecc..L'importante è partecipare....

Modificato da lento
Link to comment
Condividi su altri siti

lo vuoi sapere perchè non lo sai o per metterci alla prova??

se non lo sai ti spiego che hai messo su una specie di matrice intrecciata andando a richiamare dall'inizio il 3o elemento, ovvero p[2] che corrisponde ad un'altra matrice. andando poi a richiamare [1] di p[2] che è uguale a m andrai a richiamare l'elemento 2, ovvero m[1], che è uguale nuovamente a p e così via fino all'infinito ...

se il tutto lo inserissi in un while infinito incepperesti in un ciclo di ridondanza che molto probabilmente verrebbe stoppato dal sistema stesso.

ps: che bel buon giorno che dai :thumbs:

Modificato da madhacker
Link to comment
Condividi su altri siti

su una qualunque macchina (che sia un pc o un cellulare non cambia niente :thumbs:) ricorda che la parola 'infinito' non esiste :D

come ha detto madhacker puoi fare una cosa del genere mettendo tutto in un ciclo ma dopo qualche secondo riceverai sicuramente l'errore OutOfMemory :D

Infatti in una macchina non esiste l'infinito...è ovvio che con la ram di un telefono hai voglia quante matrici crei...ma non saranno mai infinite

Però aspetta..magari trattandosi di un linguaggio flessibile, magari ...cioè aspetta mi collego ad una cosa.

In python esiste range e xrange. range crea proprio una lista di numeri da, a, per. Mentre xrange è una cosa virtuale, usata nei cicli for per ottimizzarli. Se si fa xrange(28328382283) non crea tutta una lista ma rimane una cosa virtuale...Forse quel array p è anch'esso gestito cosi.

FAKE: Va bene ho detto una cavolata e me ne rendo conto!! :D

Modificato da memoryn70
Link to comment
Condividi su altri siti

@memory: credo che l'esempio al primo post di lento sia più un richiamo ad un array che in quella posizione richiamata va a richiamare un altro array che a sua volta, nella posizione richiamata, va a richiamare il precedente array e così via; quindi credo che sia qualcosa di diverso rispetto a range e xrange.

Link to comment
Condividi su altri siti

se si allora lento ci offre un caffè fatto dal suo cell :thumbs: (tanto è infinito, sicuramente saprà fare il caffè :D)

Con molto piacere eccovi il caffè:

 
caffeallinfinito=true;

while caffeallinfinito do
 print "Ecco una tazza fumante di caffe' per xMetallicax.";
 print "Ecco una tazza fumante di caffe' per madhacker.";
 print "Altro caffe? Ok ora vi servo:";
end;

Bè non proprio all'infinito....Finchè vi regge la batteria del cell.!. :rolleyes:

Link to comment
Condividi su altri siti

ps: che bel buon giorno che dai :)

Prima di tutto grazie di aver risposto, Scusa! non era mia intenzione diffonndere pessimismo.

lo vuoi sapere perchè non lo sai o per metterci alla prova??

Non è mia intenzione Mettere alla prova nessuno, Per concepire una cosa del genere dovrei avere la presunzione di saperne di più!.

In verità Alter come al solito, se trova un modo per incasinarsi, o ingarbugliare le cose ci si butta a capo fitto!. poi spetta a mè capirci qualcosa! :thumbs: .

Personalmente mi sono fatto un idea su come funziona ste cosa, ma volevo sentire il parere di altri, senza annoiarli rendendo il tutto più stimolante e magari ci nasce qualche spunto utile a tutti :D .

se non lo sai ti spiego che hai messo su una specie di matrice intrecciata andando a richiamare dall'inizio il 3o elemento, ovvero p[2] che corrisponde ad un'altra matrice. andando poi a richiamare [1] di p[2] che è uguale a m andrai a richiamare l'elemento 2, ovvero m[1], che è uguale nuovamente a p e così via fino all'infinito ...

Concordo con tè su questa logica, ma quello che chiedevo è: Perchè permette di scrivere la matrice (in realtà a due dimensioni) come se fosse

una matrice a dimensioni (quasi!! :rolleyes: xMetallicax) infinite?.

se il tutto lo inserissi in un while infinito incepperesti in un ciclo di ridondanza che molto probabilmente verrebbe stoppato dal sistema stesso.

Questa non lò capita dove lo piazzi il ciclo while per incrementare la lunghezza delle parentesi quadre?

A presto...

Link to comment
Condividi su altri siti

su una qualunque macchina (che sia un pc o un cellulare non cambia niente :lol:) ricorda che la parola 'infinito' non esiste :)

come ha detto madhacker puoi fare una cosa del genere mettendo tutto in un ciclo ma dopo qualche secondo riceverai sicuramente l'errore OutOfMemory :D

Ciao xMetallicax' Grazie di aver risposto.

Come hò appena risposto a 'madhacker' Questa non lò capita dove lo piazzi il ciclo while per incrementare la lunghezza delle parentesi quadre?

Per via dell'infinito non ne sò molto....Diciamo che essendo legato al ragionamento, e non al mondo fisico...secondo mè ci può stare....o almeno rende bene

l'idea di una cosa che sia estensibile e non si vede la fine.

Già che ci sono ti bombardo! così impari... :lol:

p=null
m=["a",p]
m[0]=m
print m
[[...<2>],null]
->m[0]=0
print m
->[0,null]

Come mai nell'assegnare a m lo 0 la matrice m non è stata distrutta?

Risposta : La matrice non è stata distrutta perchè in m[0] si è copiata una matrice nuova? perciò lo 0 ha distrutto solo la copia?

Allora perchè in questo esempio non vale la stessa regola?

m=null
p=null
m=["ciao",p]
p=[0,1,m]
m[1]=p
print p[2][1]
->0,1,[...<2>]]
p[2][0]="a"
print p
->[0,1,[...<2>]]
print m
->[a,[...<3>]]  <----Perchè ha modificato la matrice m di origine?

Domande inquietanti!!!! :wacko:

Modificato da lento
Link to comment
Condividi su altri siti

Però aspetta..magari trattandosi di un linguaggio flessibile, magari ...cioè aspetta mi collego ad una cosa.

Se si fa xrange(28328382283) non crea tutta una lista ma rimane una cosa virtuale...Forse quel array p è anch'esso gestito cosi.

FAKE: Va bene ho detto una cavolata e me ne rendo conto!! :lol:

'memoryn70' Ben vengano cavolate come queste!, E' l'idea che mi son fatto anchio!

credo che mShell print p[2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1] legga il tutto ed elimini le parentesi quadre

ridondanti trasformando il tutto nella sua logica trascrizione print p[2][1]

O se sbaglio..... potremo spartirci la medaglia di cartone! :wacko: .

Link to comment
Condividi su altri siti

'memoryn70' Ben vengano cavolate come queste!, E' l'idea che mi son fatto anchio!

credo che mShell print p[2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1] legga il tutto ed elimini le parentesi quadre

ridondanti trasformando il tutto nella sua logica trascrizione print p[2][1]

O se sbaglio..... potremo spartirci la medaglia di cartone! :lol: .

esattamente... credo che mshell non stampi volta per volta tutti i valori nelle parentesi quadre, ma va a stampare solo l'ultimo, in quanto quelli di prima sono tutti "richiami" ad altre matrici. trovandosi di fronte all'ultima parentesi, lui si aspetterebbe di dover stampare un valore tipo numero o testo, ma invece si trova a dover stampare un oggetto che in realtà richiama ad un altro array.

Già che ci sono ti bombardo! così impari... laugh.gif

CODICE

p=null

m=["a",p]

m[0]=m

print m

[[...<2>],null]

->m[0]=0

print m

->[0,null]

Come mai nell'assegnare a m lo 0 la matrice m non è stata distrutta?

Risposta : La matrice non è stata distrutta perchè in m[0] si è copiata una matrice nuova? perciò lo 0 ha distrutto solo la copia?

perchè credo che vada distrutta così

m=0

e non

m[0]=0

che invece assegna il valore 0 al primo elemento dell'array

Modificato da madhacker
Link to comment
Condividi su altri siti

perchè credo che vada distrutta così

m=0

e non

m[0]=0

che invece assegna il valore 0 al primo elemento dell'array

Non mi sembra completa la tua spiegazione: Dato che non stiamo parlando di problemi spirituali dove Fede, e l'inspiegabile padroneggiano.

Si tratta di capire come l'interprete considera e risolve le istruzioni che gli passiamo,

Solo riuscendo a comprendere la logica matematica del'algoritmo potremo dire: Io con gli Array e le matrici di mShell ci faccio quello che voglio!. :thumbs:

Altrimenti siamo dei maghetti che buttano lì delle parole magiche, perché l'abbiamo visto fare ad altri e a volte fanno quello che ci si aspetta.

Allora ripartendo da questo esempio fatto a suo tempo, facciamo queste variazioni:

m=["a","b"]

m[0]=m

m[0]=0

print m

->[0,"b"]

Ripartiamo con modifiche....

m=["a","b"]

m[0]=1 questa istruzione sembra che la veda così:

La presenza delle parentesi quadre dopo il nome del'array e la seguente presenza del'Uguale

Indica a mShell la volontà di assegnare un valore ad un elemento del'array.

O meglio indica che le operazioni seguenti sono assegnazioni applicate agli elementi del'array

m[0]=1

Distruggi l'attuale valore e tipizzazione contenuto nella locazione m[0] e sostituiscilo con il valore e la tipizzazione presenti dopo il segno uguale

Distrugge "a" elimina tipizzazione carattere e pone 1 e lo tipizza a numerico

m[0]=m

In questo caso: distrugge 1 e la tipizzazione numerica nel voler assegnare il nuovo valore e tipo

si accorge che è un puntatore alla matrice m perciò assegna il valore numerico che punta a m e pone la tipizzazione a puntatore.

m[0]=0

In questo caso come detto sopra cé il nome del'array seguito dalle parentesi quadre e dal segno uguale

quindi lo interpreta come un azione di assegnazione da svolgere sul singolo elemento del'array.

Perciò: distrugge il puntatore e la tipizzazione esistente alla cella 0 e vi assegna il nuovo

valore 0 (Senza andare a vedere a cosa puntava detto puntatore! il che avrebbe portato a distruggere la matrice m).

print m

->[0,"b"]

In questa altra situazione:

p=null

m=["ciao",p]

p=[0,1,m]

m[1]=p

print p[2][1]

->0,1,[...<2>]]

p[2][0]="a"

print p

->[0,1,[...<2>]]

print m

->[a,[...<3>]] <----Perchè ha modificato la matrice m di origine?

p[2][0]="a"

Nome array seguito da parentesi quadra non indica a mshell di eseguire un assegnazione in un suo elemento

perché dopo la parentesi quadra di chiusura non cè il segno = ma un ulteriore parentesi quadra aperta!

che indica solo una cosa...alla locazione p[2] cè un puntatore ad un altro array!!

Perciò: preleva il puntatore va a vedere che matrice è (m) a la sostituisce nel'espressione diventando così:

p[2][0]="a" -> diventa m[0]="a" e qui esegue quanto esposto sopra assegnando la lettera "a".

Vi sembra logico il tutto? sono riuscito a capire l'algoritmo che mShell applica agli array? :sad:

che dite?

Ovviamente:

m=0 penso che non sia indispensabile spiegare cosa fà in mshell.

Se vi ho annoiato chiedo Venia. :(

Anche se ritengo fondamentale padroneggiare gli array in mShell essendo una delle parti più potenti di questo linguaggio.

Se non capisco i meccanismi sopra riportati, mi ci vedete a gestire una matrice multidimensionale che al suo interno contiene dati,funzioni,altri array che richiamano altre funzioni e dati????. ;)

In caso non foste d'accordo e mi chiamaste in giudizio come direbbe Perry Mezzon (Un Perry Mason poco sveglio!) Signor Giudice.....MI OPPONGO!..... :mumble:

Modificato da lento
Link to comment
Condividi su altri siti

  • 9 mesi dopo...

ragazzi, avrei bisogno di una mano con queste matrici che fanno impazzire me... :angel:

Vorrei creare una matrice quadrata di ordine n ed inserire i valori all'interno di essa per farle trovare il valore del determinante...

use array as a, ui

n=ui.query("di ordine:","matrice",0);

a=a.create(n,n,0);

 for i=0 to n*n do
  e=ui.query("a"+i,"ins",0);
  a=a.insert(a,i,e);
print a;
end;

Link to comment
Condividi su altri siti

  • 3 settimane dopo...

Please sign in to comment

You will be able to leave a comment after signing in



Accedi Ora
 Share

×
×
  • Crea Nuovo...

Informazione Importante

Questo sito utilizza i cookie per analisi, contenuti personalizzati e pubblicità. Continuando la navigazione, accetti l'utilizzo dei cookie da parte nostra | Privacy Policy