|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Nov 2004
Messaggi: 124
|
[C]Funzione che alloca dinamicamente una matrice
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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
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: Codice:
void *malloc(size_t numero_di_byte);
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
avrà usato malloc + calloc
~§~ Sempre E Solo Lei ~§~ ;
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Forse intendi una roba tipo questa?
Codice:
#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;
}
__________________
GPU Compiler Engineer |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
con solo malloc dovrebbe essere una cosa del genere se funzionasse
Codice:
#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;
}
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Beh , con solo malloc dovrebbe funzionare anche così :
Codice:
#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;
}
Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Anonimo che cavolo sbaglio nel program?
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
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
__________________
GPU Compiler Engineer |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
non si compila
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Hai dimenticato "struct" davanti alla dichiarazione di tutte le strutture . Se aspetti un attimo provo a correggertelo e poi te lo riposto Ciao
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 05-12-2004 alle 13:51. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Ecco la versione corretta
Codice:
#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;
}
Non vedo nessuna parte del programma dedicata a quello Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
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 ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
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
__________________
GPU Compiler Engineer |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
Mi piacerebbe riuscire a compilare ma MinGW non me lo compila. ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
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?
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
caiser ... l'ho rifatto e cavolo perdo tutto, eppure io mi ricordavo che doveva funzionare, con le classi avevo sempre fatto così
![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
premesso che io a scuola avevo studiato le liste solo con le classi .. ho provato a vedere e infatti funziona con le classi
ma allora senza ste classi come faccio a non perdere i valori volendo utilizzare le funzioni? Codice:
/* 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;
}
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Comunque si parlava di C , non di C++
Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:06.




















