Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-06-2011, 17:57   #1
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
[C] vettore dinamico passato ad una funzione

Ciao a tutti ho il seguente problema: una volta creato un vettore dinamico in una funzione non riesco a stamparlo nel main mentre nella funzione stessa si.
Codice:
void copia(int matrice[max][max],int dim, int *vm)
{
 int i,j,k;
 vm=(int*)malloc(sizeof(int)*dim*dim);
 
 k=0;
 for(i=0; i<dim; i++)
   for(j=0; j<dim; j++)
     {
       vm[k]=matrice[i][j];
       k=k+1;
     }
 /*printf("vettore uguale a : \n");    
 for (i=0; i<dim*dim; i++)
   printf("%d ",vm[i]);
 printf("\n");*/
           
} 
int main()
{
  int mat[max][max],*vet;
  int n,i,maggiore;
  copia(mat,n,vet);/*copiamo matrice nel vettore */
  for (i=0; i<n*n; i++)
   printf("%d ",vet[i]);
   printf("\n");   
  system("PAUSE");
}
dove copia è una funzione in cui copio una matrice nXn in un vettore nxn.
il vettore lo dichiaro nel main come puntatore ad un intero e lo creo nella funzione con una malloc.
Il problema e che se lo faccio stampare nella funzione copia me lo stampa correttamente, invece se lo stampo come nell esempio nel main mi da valori sballati.
Spero mi aiutate grazie in anticipo.
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2011, 19:44   #2
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13054
Il vm della funzione è una copia del puntatore che passi (che tra l'altro non è inizializzato).

Il problema è che eseguendo:
Codice:
vm = malloc(...)
stai modificando la copia interna alla funzione.

Per cui vet non viene mai modificato.

Le soluzioni possibili sono 3:

1) fai ritornare vm direttamente alla funzione, senza necessità di passare il parametro dall'esterno

2) inizializzi vet fuori dalla funzione

3) usi un puntatore doppio

In particolare nel caso 3:

Codice:
main()
{
    int* vet = NULL;

    copia (..., &vet); // passi l'indirizzo della variabile vet
}

copia(..., int** vm)
{
    *vm = malloc(..); // cambio il valore di vet dall'interno della funzione
     ...
     // ciclo su *vm
}
Salvo casi particolari io userei uno dei primi due metodi che ti ho elencato.

Ricorda però che poi dovresti liberare la memoria, quindi devi decidere di chi è la responsabilità.

Ultima modifica di WarDuck : 01-06-2011 alle 19:47.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2011, 09:07   #3
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
allora ho fatto come mi dicevi tu ma va in loop quando deve stampare. sapresti dirmi dov è che sbaglio ancora???
Codice:
void copia(int matrice[max][max],int dim, int **vm)
{
 int i,j,k;
 *vm=(int*)malloc(sizeof(int)*dim*dim);
 
 
 k=0;
 for(i=0; i<dim; i++)
   for(j=0; j<dim; j++)
     {
       *vm[k]=matrice[i][j];
       k=k+1;
     }
}
int main()
{
  int mat[max][max];
  int n,i,maggiore;
  int *vet=NULL;
  copia(mat,n,&vet);
  for (i=0; i<n*n; i++)
   printf("%d ",vet[i]);
  printf("\n");   
  system("PAUSE");
}
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2011, 10:10   #4
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13054
mat ed n dov'è che sono inizializzati?

max quanto vale?
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2011, 10:48   #5
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
mat ed n dov'è che sono inizializzati?

max quanto vale?
max è una costante. invece la matrice mat con la dimensione n è creata in una void riempi.

Codice:
#define max 10
int main()
{
  int mat[max][max];
  int n,i,maggiore;
  int *vet=NULL;
  riempi(mat,&n);
  stampa(mat,n);
  
  
  copia(mat,n,&vet);/*copiamo matrice nel vettore */
  for (i=0; i<n*n; i++)
   printf("%d ",vet[i]);
  printf("\n");   
  
  printf("valore di n e' %d \n",n);
  system("PAUSE");
}
spero di essere stato piu chiaro
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2011, 11:25   #6
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13054
Sarebbe utile vedere il codice della funzione riempi, perché da quanto vedo dal codice n per me non viene inizializzato, forse lo inizializzi in riempi, ma con i forse in informatica non si va da nessuna parte .
WarDuck è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
Nikon 120-300mm f/2.8: moltiplicatore in...
Targhe personalizzate per auto e moto: c...
Redmi K100 ufficiale, con batteria da 10...
GTA 6, nuovo gameplay in South Park: Jas...
I guru dell'IA sono totalmente slegati d...
Diesel: scatta il taglio delle accise, m...
La pubblicità nell'AI Mode delle ricerch...
Mac Studio M5 Ultra al massimo: 512GB di...
Cyberpunk: il sequel potrebbe introdurre...
WhatsApp prepara una nuova sezione Pagam...
Google lancia Connected Apps Platform pe...
FWA, quanto costa e quali sono le presta...
Sony annuncia la PS5 Prism Collection: n...
Infineon investe 1,1 miliardi di euro in...
Microsoft: ricavi record a 92,3 miliardi...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:26.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v