PDA

View Full Version : [C]Funzione che alloca dinamicamente una matrice


Ir0nM4id3n84
05-12-2004, 11:08
Ciao,
ho un problema...non mi ricordo più come ha fatto il proff a lezione per creare una funzione che mi alloca dinamicamente una matrice...

vi spiego...il programma chiede nel main il numero di righe ed il numero di colonne e li mette in 2 variabili....poi viene chiamata una funzione che mi crea una matrice con quel numero di righe e quel numero di colonne?

Qualcuno mi potrebbe dare una mano a ricostruire il tutto?

Grazie

RaouL_BennetH
05-12-2004, 11:34
Ciao, con la premessa che io il C lo sto studiando proprio da poco, quindi potrei anche dire una fesseria....

Per l'allocazione dinamica dovresti usare la funzione malloc() che ha questo prototipo:



void *malloc(size_t numero_di_byte);

Fenomeno85
05-12-2004, 11:48
avrà usato malloc + calloc

~§~ Sempre E Solo Lei ~§~ ;

AnonimoVeneziano
05-12-2004, 11:56
Forse intendi una roba tipo questa?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int **creamatrice(unsigned int, unsigned int);

unsigned int **creamatrice(unsigned int x, unsigned int y) {
unsigned int **matrix, count;

matrix = calloc(x, sizeof(unsigned int *));

for (count = 0; count < x; count++)

matrix[count] = calloc(y, sizeof(unsigned int));

return matrix;

}
int main(int argc, char *argv[]) {

unsigned int x, y, **matrice;

if (argc == 3) {

x = atoi(argv[1]);
y = atoi(argv[2]);

matrice = creamatrice(x, y);

}
else
return 1;

return 0;
}



Ciao

Fenomeno85
05-12-2004, 12:47
con solo malloc dovrebbe essere una cosa del genere se funzionasse


#include <stdio.h>
#include <stdlib.h>

/* elemento della matrice */
struct ProxElem{
int elem;
ProxElem *ProxElem;
};

/* elemento dell'array contentente gli indirizzi delle righe dell'array */
struct ProxRiga{
ProxElem *Riga;
ProxRiga *Prox;
};

void Allocazione_Colonne (ProxRiga *TestaRiga, int c){
ProxElem *TestaElem, *Prec, *App;
int i;
if (c>0){
TestaElem = malloc (sizeof(ProxElem));
TestaElem->ProxElem = NULL;
printf ("\nInserisci elemento:\t");
scanf ("%d", TestaElem->elem);
TestaRiga->Riga = TestaElem;
Prec = TestaRiga->Riga;
for (i=1;i<c;i++){
App = malloc (sizeof(ProxElem));
App->ProxElem = NULL;
printf ("\nInserisci elemento:\t");
scanf ("%d", App->elem);
Prec->ProxElem = App;
Prec = App;
}
}
}

void Allocazione_Righe (ProxRiga *Testa, int r, int c){
ProxRiga *App, *Precedente;
int i;
if (r>0){
Testa = malloc (sizeof(ProxRiga));
Testa->Prox = NULL;
Allocazione_Colonne (Testa, c);
Precedente = Testa;
for (i=1; i<r;i++){
App = malloc (sizeof(ProxRiga));
App->Prox = NULL;
Allocazione_Colonne (App, c);
Precedente->Prox = App;
Precedente = App;
}
}
}

/* visualizzazione delle matrice */
void Visualizza (ProxRiga *TestaRiga){
ProxElem *App;
printf ("\nMatrice\n");
if (TestaRiga != NULL){
printf ("\t%d",TestaRiga->Riga->elem);
App = TestaRiga->Riga->ProxElem;
while (App != NULL){
printf ("\t%d", App->elem);
App = App->ProxElem;
}
}
}

/* main */
int main (){
int Righe, Colon;
ProxRiga *TestaRiga = NULL;
ProxRiga *App;
Allocazione_Righe (TestaRiga,Righe,Colon);
App=TestaRiga;
while (App != NULL){
Visualizza (TestaRiga);
App = App->Prox;
}
return 1;
}



~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
05-12-2004, 13:11
Beh , con solo malloc dovrebbe funzionare anche così :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int **creamatrice(unsigned int, unsigned int);
void printmatrix(unsigned int **, int, int);

unsigned int **creamatrice(unsigned int x, unsigned int y) {
unsigned int **matrix, count;

matrix = malloc(x*sizeof(unsigned int *));

for (count = 0; count < x; count++)

matrix[count] = malloc(y*sizeof(unsigned int));

return matrix;

}

void printmatrix(unsigned int **matrix, int x, int y) {

int a,b;
for (b=0; b<y; b++) {
for (a=0; a<x; a++) {
printf("%4u ", matrix[a][b]);
if ( a == x-1 )
putchar('\n');
}
}

putchar('\n');
putchar('\n');
}


int main(int argc, char *argv[]) {

unsigned int x, y, **matrice;

if (argc == 3) {

x = atoi(argv[1]);
y = atoi(argv[2]);

matrice = creamatrice(x, y);

printmatrix(matrice, x, y);
}
else
return 1;

return 0;
}


Ci ho anche messo una funzione che printa i valori della matrice dopo averla creata.

Ciao

Fenomeno85
05-12-2004, 13:29
Anonimo che cavolo sbaglio nel program?

~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
05-12-2004, 13:38
Ero andato a magnare .

Perchè, il tuo prog non va? Non l'ho ancora provato , ma non crea la matrice o non si compila?

Ciao

Fenomeno85
05-12-2004, 13:41
non si compila :(

~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
05-12-2004, 13:44
Originariamente inviato da Fenomeno85
non si compila :(

~§~ Sempre E Solo Lei ~§~


Hai dimenticato "struct" davanti alla dichiarazione di tutte le strutture .

Se aspetti un attimo provo a correggertelo e poi te lo riposto

Ciao

AnonimoVeneziano
05-12-2004, 13:50
Ecco la versione corretta


#include <stdio.h>
#include <stdlib.h>

/* elemento della matrice */
struct ProxElem{
int elem;
struct ProxElem *ProxElem;
};

/* elemento dell'array contentente gli indirizzi delle righe dell'array */
struct ProxRiga{
struct ProxElem *Riga;
struct ProxRiga *Prox;
};

void Allocazione_Colonne (struct ProxRiga *TestaRiga, int c){
struct ProxElem *TestaElem, *Prec, *App;
int i;
if (c>0){
TestaElem = malloc (sizeof(struct ProxElem));
TestaElem->ProxElem = NULL;
printf ("\nInserisci elemento:\t");
scanf ("%d", TestaElem->elem);
TestaRiga->Riga = TestaElem;
Prec = TestaRiga->Riga;
for (i=1;i<c;i++){
App = malloc (sizeof(struct ProxElem));
App->ProxElem = NULL;
printf ("\nInserisci elemento:\t");
scanf ("%d", App->elem);
Prec->ProxElem = App;
Prec = App;
}
}
}

void Allocazione_Righe (struct ProxRiga *Testa, int r, int c){
struct ProxRiga *App, *Precedente;
int i;
if (r>0){
Testa = malloc (sizeof(struct ProxRiga));
Testa->Prox = NULL;
Allocazione_Colonne (Testa, c);
Precedente = Testa;
for (i=1; i<r;i++){
App = malloc (sizeof(struct ProxRiga));
App->Prox = NULL;
Allocazione_Colonne (App, c);
Precedente->Prox = App;
Precedente = App;
}
}
}

/* visualizzazione delle matrice */
void Visualizza (struct ProxRiga *TestaRiga){
struct ProxElem *App;
printf ("\nMatrice\n");
if (TestaRiga != NULL){
printf ("\t%d",TestaRiga->Riga->elem);
App = TestaRiga->Riga->ProxElem;
while (App != NULL){
printf ("\t%d", App->elem);
App = App->ProxElem;
}
}
}

/* main */
int main (){
int Righe, Colon;
struct ProxRiga *TestaRiga = NULL;
struct ProxRiga *App;
Allocazione_Righe (TestaRiga,Righe,Colon);
App=TestaRiga;
while (App != NULL){
Visualizza (TestaRiga);
App = App->Prox;
}
return 1;
}



Ti faccio solo una domanda: Come fai a prendere in input le righe e le colonne della matrice?

Non vedo nessuna parte del programma dedicata a quello

Ciao

Fenomeno85
05-12-2004, 14:01
Originariamente inviato da AnonimoVeneziano
Ecco la versione corretta


#include <stdio.h>
#include <stdlib.h>

/* elemento della matrice */
struct ProxElem{
int elem;
struct ProxElem *ProxElem;
};

/* elemento dell'array contentente gli indirizzi delle righe dell'array */
struct ProxRiga{
struct ProxElem *Riga;
struct ProxRiga *Prox;
};

void Allocazione_Colonne (struct ProxRiga *TestaRiga, int c){
struct ProxElem *TestaElem, *Prec, *App;
int i;
if (c>0){
TestaElem = malloc (sizeof(struct ProxElem));
TestaElem->ProxElem = NULL;
printf ("\nInserisci elemento:\t");
scanf ("%d", TestaElem->elem);
TestaRiga->Riga = TestaElem;
Prec = TestaRiga->Riga;
for (i=1;i<c;i++){
App = malloc (sizeof(struct ProxElem));
App->ProxElem = NULL;
printf ("\nInserisci elemento:\t");
scanf ("%d", App->elem);
Prec->ProxElem = App;
Prec = App;
}
}
}

void Allocazione_Righe (struct ProxRiga *Testa, int r, int c){
struct ProxRiga *App, *Precedente;
int i;
if (r>0){
Testa = malloc (sizeof(struct ProxRiga));
Testa->Prox = NULL;
Allocazione_Colonne (Testa, c);
Precedente = Testa;
for (i=1; i<r;i++){
App = malloc (sizeof(struct ProxRiga));
App->Prox = NULL;
Allocazione_Colonne (App, c);
Precedente->Prox = App;
Precedente = App;
}
}
}

/* visualizzazione delle matrice */
void Visualizza (struct ProxRiga *TestaRiga){
struct ProxElem *App;
printf ("\nMatrice\n");
if (TestaRiga != NULL){
printf ("\t%d",TestaRiga->Riga->elem);
App = TestaRiga->Riga->ProxElem;
while (App != NULL){
printf ("\t%d", App->elem);
App = App->ProxElem;
}
}
}

/* main */
int main (){
int Righe, Colon;
struct ProxRiga *TestaRiga = NULL;
struct ProxRiga *App;
Allocazione_Righe (TestaRiga,Righe,Colon);
App=TestaRiga;
while (App != NULL){
Visualizza (TestaRiga);
App = App->Prox;
}
return 1;
}



Ti faccio solo una domanda: Come fai a prendere in input le righe e le colonne della matrice?

Non vedo nessuna parte del programma dedicata a quello

Ciao

dimenticate :muro:

~§~ Sempre E Solo Lei ~§~

Fenomeno85
05-12-2004, 14:06
scusa ma a te te lo compila?

a me no :(

Compiling...
lista.cpp
lista.cpp: In function `void Allocazione_Colonne(ProxRiga*, int)':
lista.cpp:20: error: invalid conversion from `void*' to `ProxElem*'
lista.cpp:27: error: invalid conversion from `void*' to `ProxElem*'
lista.cpp: In function `void Allocazione_Righe(ProxRiga*, int, int)':
lista.cpp:41: error: invalid conversion from `void*' to `ProxRiga*'
lista.cpp:46: error: invalid conversion from `void*' to `ProxRiga*'

ma sono obbligatori ridifinire le struct io non le avevo mai messe almeno mi ricordo così

~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
05-12-2004, 14:16
melchior@melchior:~/Cprograms$ gcc -g fenom.c -o fenom
melchior@melchior:~/Cprograms$

Si a me lo compila .

In C devi sempre mettere "struct" davanti alle dichiarazione , non so in C++ , a meno di aver definito un tipo con TypeDef , a quel punto puoi usare il nome del tipo .

Comunque il tuo programma ha altri problemi oltre a quello , come ad esempio quello che la funzione "Allocazione_Righe" non fa ritornare alcun valore lasciando TestaRiga sempre NULL nella "main" , e non soddisfando mai la condizione "while ( App != NULL ) " . In questo modo perdi il puntatore alla struttura una volta uscito dalla funzione.


Inoltre mi sembra ci siano altri problemi, riguardatelo bene

Ciao

Fenomeno85
05-12-2004, 14:22
Originariamente inviato da AnonimoVeneziano
melchior@melchior:~/Cprograms$ gcc -g fenom.c -o fenom
melchior@melchior:~/Cprograms$

Si a me lo compila .

In C devi sempre mettere "struct" davanti alle dichiarazione , non so in C++ , a meno di aver definito un tipo con TypeDef , a quel punto puoi usare il nome del tipo .

Comunque il tuo programma ha altri problemi oltre a quello , come ad esempio quello che la funzione "Allocazione_Righe" non fa ritornare alcun valore lasciando TestaRiga sempre NULL nella "main" , e non soddisfando mai la condizione "while ( App != NULL ) " . In questo modo perdi il puntatore alla struttura una volta uscito dalla funzione.


Inoltre mi sembra ci siano altri problemi, riguardatelo bene

Ciao

io in Allocazione_Righe modifico la testa direttamente infatti è un passaggio per indirizzo quindi si modifica.
Mi piacerebbe riuscire a compilare ma MinGW non me lo compila.

~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
05-12-2004, 14:30
Originariamente inviato da Fenomeno85
io in Allocazione_Righe modifico la testa direttamente infatti è un passaggio per indirizzo quindi si modifica.
Mi piacerebbe riuscire a compilare ma MinGW non me lo compila.

~§~ Sempre E Solo Lei ~§~


Non passi alla funzione una struttura, ma un PUNTATORE a struttura che è esattamente identico ad una variabile qualsiasi, perciò anch'esso è passato per valore .

Quindi TestaRiga (che è una qualsiasi variabile) viene copiata e passata alla funzione che la modifica e poi all' uscita la cancella .

Inoltre anche le strutture vengono passate per definizione per valore e non per riferimento , quindi in ogni caso avresti comunque sbagliato :)

Ciao

PS= Non so perchè non ti si compili su MiniGW . Hai provato a compilare la mia correzione?

Fenomeno85
05-12-2004, 14:39
Originariamente inviato da AnonimoVeneziano
Non passi alla funzione una struttura, ma un PUNTATORE a struttura che è esattamente identico ad una variabile qualsiasi, perciò anch'esso è passato per valore .

Quindi TestaRiga (che è una qualsiasi variabile) viene copiata e passata alla funzione che la modifica e poi all' uscita la cancella .

Inoltre anche le strutture vengono passate per definizione per valore e non per riferimento , quindi in ogni caso avresti comunque sbagliato :)

Ciao

PS= Non so perchè non ti si compili su MiniGW . Hai provato a compilare la mia correzione?

bho aspe che sto installando visual studio ... cmq forse ho capito quello che dici ma cmq dovrei riuscirci a lavorare su quei dati dato che sono nella zona heap ... però mi sa che così ho qualche problemino.

~§~ Sempre E Solo Lei ~§~

Fenomeno85
06-12-2004, 12:16
caiser ... l'ho rifatto e cavolo perdo tutto, eppure io mi ricordavo che doveva funzionare, con le classi avevo sempre fatto così :wtf:

~§~ Sempre E Solo Lei ~§~

Fenomeno85
06-12-2004, 13:35
premesso che io a scuola avevo studiato le liste solo con le classi .. ho provato a vedere e infatti funziona con le classi :cry:

ma allora senza ste classi come faccio a non perdere i valori volendo utilizzare le funzioni?


/* lista con classe */

#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>

struct dati {
int valore;
};

struct nodo {
dati val;
nodo *succ;
};

class lista{
private:
nodo *testa;
public:
void visualizza();
void carica (dati valori);
lista();
~lista();
};

/* distruttore */
lista::~lista(){
nodo *supp;
supp = new(nodo);
if (testa == NULL){
printf ("\nLa lista e' vuota. Nessun elemento cancellato.\n\n\n");
}
else {
while (testa != NULL){
supp = testa;
testa = testa->succ;
delete(supp);
}
printf ("\nTutta la lista e' stata deallocata.\n\n");
}
system ("PAUSE");
}

/* inserimento sempre in testa */
void lista::carica(dati valori){
nodo *supp;
supp = new (nodo);
supp->val = valori;
supp->succ = testa;
testa = supp;
}

void lista::visualizza(){
nodo *supp;
supp = testa;
while (supp!=NULL){
printf ("%d", supp->val.valore);
supp= supp->succ;
}
}

/* costruttore */
lista::lista(){
testa = NULL;
}

int main (){
dati valori;
lista list;
printf ("\nInserisci il valore:\t");
scanf ("%d",&valori.valore);
list.carica(valori);
list.visualizza ();
return 1;
}


~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
06-12-2004, 13:52
Comunque si parlava di C , non di C++

Ciao

Fenomeno85
06-12-2004, 14:30
Originariamente inviato da AnonimoVeneziano
Comunque si parlava di C , non di C++

Ciao

si ma in c ci sono le funzioni quindi come se fa con le funzioni?

~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
06-12-2004, 17:42
Originariamente inviato da Fenomeno85
si ma in c ci sono le funzioni quindi come se fa con le funzioni?

~§~ Sempre E Solo Lei ~§~


Scusa, ma credo di non aver capito .

In che senso ci sono solo le funzioni? E in che senso come si fa con le funzioni?

Ciao

Fenomeno85
07-12-2004, 10:14
Originariamente inviato da AnonimoVeneziano
Scusa, ma credo di non aver capito .

In che senso ci sono solo le funzioni? E in che senso come si fa con le funzioni?

Ciao

inteso che se volessi usare le funzioni per caricare come se fa? con le classi non ci sono problemi ma senza si perde tutto.

~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
07-12-2004, 11:05
Originariamente inviato da Fenomeno85
inteso che se volessi usare le funzioni per caricare come se fa? con le classi non ci sono problemi ma senza si perde tutto.

~§~ Sempre E Solo Lei ~§~


Caricare cosa vuol dire ? Caricare i valori?

Tempo fa feci un programmino che lavorava sulle matrici così per provare , dimmi se qualcosa di questo programmino rispecchia quello che intendi

Ciao


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

unsigned int **buildmat(int, int);
int getvalues(unsigned int **,int , int);
int savematrix(unsigned int **, unsigned int **, int, int, int, int, const char *);
int loadmatrix(unsigned int **, unsigned int **, int, int, int, int, const char *);
unsigned int **multmatrix(unsigned int **, unsigned int **, int, int, int, int);
void printmatrix(unsigned int **, int, int);
void generate(unsigned int **, int, int);

unsigned int **buildmat(int x, int y) {

unsigned int **matrix = NULL;
int b;

matrix = malloc(x*sizeof(int *));

for (b=0; b<x; b++) {
matrix[b] = malloc(y*sizeof(int));
}
return matrix;
}

int getvalues(unsigned int **matrix, int x, int y) {

int p,l;

for (p=0; p<x; p++) {
for (l=0;l<y; l++) {
printf("matrix[%d][%d] = ", p, l);
scanf("%u", &(matrix[p][l]));
}
}

return 0;
}

int savematrix(unsigned int **matrixs1, unsigned int **matrixs2, int x1, int y1, int x2, int y2, const char *file) {
int a;
FILE *fp;

if ((fp=fopen(file, "wb")) != NULL) {

for (a=0; a<x1; a++)
fwrite(matrixs1[a], sizeof(unsigned int), y1, fp);
for (a=0; a<x2; a++)
fwrite(matrixs2[a], sizeof(unsigned int), y2, fp);

fclose(fp);
return 0;
}
else
printf("Can't open that file\n");
return 1;
}

int loadmatrix(unsigned int **matrixl1, unsigned int **matrixl2, int x1, int y1, int x2, int y2, const char *file) {

int a;
FILE *fp;

if ((fp=fopen(file, "rb")) != NULL) {

for (a=0; a<x1; a++)
fread(matrixl1[a], sizeof(unsigned int), y1, fp);
for (a=0; a<x2; a++)
fread(matrixl2[a], sizeof(unsigned int), y2, fp);

fclose(fp);
return 0;
}
else {
printf("Can't open that file\n");
return 1;
}
}

unsigned int **multmatrix(unsigned int **matrixm1, unsigned int **matrixm2, int x1, int y1, int x2, int y2) {

int a,b,c;
unsigned int **prodmat;

if ( y1==x2 ) {
prodmat = buildmat(x1,y2);

for (a=0; a<y2; a++) {
for (b=0; b<x1; b++) {
for (c=0; c<y1; c++) {
prodmat[b][a] += matrixm1[b][c] * matrixm2[c][a];
}
}
}
}
else {
printf("Cannot multiply two matrix that aren't NxM and MxP\n");
return NULL;
}
return prodmat;
}

void printmatrix(unsigned int **matrix, int x, int y) {

int a,b;
for (b=0; b<y; b++) {
for (a=0; a<x; a++) {
printf("%4u ", matrix[a][b]);
if ( a == x-1 )
putchar('\n');
}
}

putchar('\n');
putchar('\n');
}

void generate(unsigned int **matrix, int x, int y) {

int a, b;

srand(time(NULL));

for (a=0; a<y; a++) {
for (b=0; b<x; b++) {
matrix[b][a] = rand() % 1001;
}
}
}

int main(int argc, char *argv[]) {

unsigned int **matrix1 = NULL, **matrix2 = NULL, **matres = NULL;
int i=1,j=0,k=0,c=0,d=0,dim[4];
char str[4][10] = {'\0' }, choice = '\0', filename[100], wmat = '\0';

if (argc == 3) {

while(i<=2) {
j=0;
c=0;
while( argv[i][j] != '\0') {
if ( argv[i][j] != 'x' ){
str[k][c] = argv[i][j];
j++;
c++;
}
else {
dim[k] = atoi(str[k]);
c=0;
k++;
j++;
}
}
dim[k] = atoi(str[k]);
k++;
i++;
}

matrix1 = buildmat(dim[0], dim[1]);
matrix2 = buildmat(dim[2], dim[3]);

printf("What you want to do today?\n");
choice = fgetc(stdin);

while ( choice != 'q' ) {

switch(choice) {

case 'i':
getvalues(matrix1, dim[0], dim[1]);
getvalues(matrix2, dim[2], dim[3]);
break;
case 's':
printf("Specify the filename: ");
scanf("%s", filename);
savematrix(matrix1, matrix2, dim[0], dim[1], dim[2], dim[3], filename);
break;
case 'l':
printf("Specify the filename: ");
scanf("%s", filename);
loadmatrix(matrix1, matrix2, dim[0], dim[1], dim[2], dim[3], filename);
break;
case 'm':
matres = multmatrix(matrix1, matrix2, dim[0], dim[1], dim[2], dim[3]);
break;
case 'p':
if ( matrix1 != NULL )
printmatrix(matrix1, dim[0], dim[1]);
if ( matrix2 != NULL )
printmatrix(matrix2, dim[2], dim[3]);
if ( matres != NULL )
printmatrix(matres, dim[0], dim[3]);
break;
case 'g':
printf("What matrix should I automatically generate? 1 or 2?\n");
while (getchar() != '\n') {}
scanf("%c", &wmat);
if ( wmat == '1' ){
generate(matrix1, dim[0], dim[1]);
}
else {
if ( wmat == '2' )
generate(matrix2, dim[2], dim[3]);
else
printf("Doesn't exist matrix #%c.Only 1 or 2.\n", wmat);
}
break;
default:
break;
}


while (getchar() != '\n') {}
printf("What you want to do today?\n");
choice = fgetc(stdin);
}
}
return 0;

}

Fenomeno85
07-12-2004, 12:13
il mio problema è semplicemente come riscrivere questo senza classi ma che funzioni:


/* inserimento sempre in testa con classi*/
void lista::carica(dati valori){
nodo *supp;
supp = new (nodo);
supp->val = valori;
supp->succ = testa;
testa = supp;
}


praticamente quando l'utente vuole inserire alla lista un nuovo elemento questo passa i valori. Va be senza classi passerò la testa ma questo non funziona.

~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
07-12-2004, 12:25
Beh , se non ho capito male dovrebbe essere l'equivalente di questo :


int getvalues(unsigned int **matrix, int x, int y) {

int p,l;

for (p=0; p<x; p++) {
for (l=0;l<y; l++) {
printf("matrix[%d][%d] = ", p, l);
scanf("%u", &(matrix[p][l]));
}
}

return 0;
}

Fenomeno85
07-12-2004, 13:03
Originariamente inviato da AnonimoVeneziano
Beh , se non ho capito male dovrebbe essere l'equivalente di questo :


int getvalues(unsigned int **matrix, int x, int y) {

int p,l;

for (p=0; p<x; p++) {
for (l=0;l<y; l++) {
printf("matrix[%d][%d] = ", p, l);
scanf("%u", &(matrix[p][l]));
}
}

return 0;
}


si ma io non so la lunghezza dell'array (in questo caso) dato che in qualsiasi momento posso aggiungere un nodo. Cmq forse ho capito, io alloco lo spazio nel mai e passo alla funzione però non è che mi piaccia poi molto come soluzione dato che io volevo allocare il nodo proprio nella funzione.

~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
07-12-2004, 14:03
Originariamente inviato da Fenomeno85
si ma io non so la lunghezza dell'array (in questo caso) dato che in qualsiasi momento posso aggiungere un nodo. Cmq forse ho capito, io alloco lo spazio nel mai e passo alla funzione però non è che mi piaccia poi molto come soluzione dato che io volevo allocare il nodo proprio nella funzione.

~§~ Sempre E Solo Lei ~§~

Si, ma in quel caso non è una matrice , è una lista concatenata .

Volendo si potrebbe memorizzare i valori in una lista concatenata e poi spostare i valori in una matrice ,ma rimane sempre il problema delle dimensioni .

se un utente inserisce 6 elementi all' interno della matrice le combinazioni di matrici possibili sono 4 :

1 x 6

6 x 1

2 x 3

3 x 2

Quindi nelle matrici è necessario sempre prima saperne la dimensione per poterla allocare come l'utente vuole , perchè le dimensioni di una matrice sono importanti .

Se ad esempio poi volessimo moltiplicare la nostra matrice per un altra matrice dobbiamo essere sicuri che sia soddisfatta la condizione NxM MxP , ossia che le due matrici abbiano la dimensione comune M e non possiamo esserne sicuri se il programma decide la dimensione della matrice automaticamente.

Spero di aver parlato chiaro e non incasinato come al mio solito :)

Ciao

Fenomeno85
07-12-2004, 21:03
Originariamente inviato da AnonimoVeneziano
Si, ma in quel caso non è una matrice , è una lista concatenata .

Volendo si potrebbe memorizzare i valori in una lista concatenata e poi spostare i valori in una matrice ,ma rimane sempre il problema delle dimensioni .

se un utente inserisce 6 elementi all' interno della matrice le combinazioni di matrici possibili sono 4 :

1 x 6

6 x 1

2 x 3

3 x 2

Quindi nelle matrici è necessario sempre prima saperne la dimensione per poterla allocare come l'utente vuole , perchè le dimensioni di una matrice sono importanti .

Se ad esempio poi volessimo moltiplicare la nostra matrice per un altra matrice dobbiamo essere sicuri che sia soddisfatta la condizione NxM MxP , ossia che le due matrici abbiano la dimensione comune M e non possiamo esserne sicuri se il programma decide la dimensione della matrice automaticamente.

Spero di aver parlato chiaro e non incasinato come al mio solito :)

Ciao

si scusa io mi stavo riferendo appunto alla lista concatenata.

~§~ Sempre E Solo Lei ~§~