Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-09-2005, 08:54   #1
progC__
Member
 
Iscritto dal: Sep 2005
Messaggi: 39
Scambi virtuali in c....

...qualcuno può aiutarmi a chiarire questa funzione....? allora devo scambiare posto all'elemento di un array mediante uno scambio virtuale...la funzione che ho scritto vale come scambio virtuale o comunque effettua uno scambio fisico?


void scambia_ele_array (int *v,int i,int j)
{
int temp;
temp = *(v+i);
*(v+i)= *(v+j);
*(v+j)= temp;
}
progC__ è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2005, 19:38   #2
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
cosa intendi per scambio virtuale e fisico?
la tua funzione comunque scambia proprio "fisicamente" i valori all'interno dell'array, cioè dopo l'uscita dalla funzione nell'array ci saranno i valori invertiti rispetto a prima dell'esecuzione della funzione.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2005, 22:29   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da progC__
...qualcuno può aiutarmi a chiarire questa funzione....? allora devo scambiare posto all'elemento di un array mediante uno scambio virtuale...la funzione che ho scritto vale come scambio virtuale o comunque effettua uno scambio fisico?
Non so cosa intendi di preciso, ma se ho capito parli di quello che succede con le liste... In una lista puoi scambiare due elementi modificando la posizione all'interno delal lista dell'intera struttura (scambio fisico) o del solo valore contenuto nelal struttura (a questo punto direi scambio virtuale)... Sinceramente queste definizioni sono un po' assurde...
Comunque non si può applicare ad un array...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 07:47   #4
progC__
Member
 
Iscritto dal: Sep 2005
Messaggi: 39
...non si tratta di liste...ma di array...per scambio virtuale intendo uno scambio di posizione tra elementi in un array effettuato tramite puntatori...praticamente al posto di spostare gli elementi fisicamente devo spostare i puntatori che puntano agli elementi per non effettuare lo scambio fisico...come dovrei fare?...
progC__ è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 07:56   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da progC__
...non si tratta di liste...ma di array...per scambio virtuale intendo uno scambio di posizione tra elementi in un array effettuato tramite puntatori...praticamente al posto di spostare gli elementi fisicamente devo spostare i puntatori che puntano agli elementi per non effettuare lo scambio fisico...come dovrei fare?...
Guarda...in un vettore anche se usi i puntatori fai sempre lo scambio fisico... L'unico scambio, se si può chiamare così, virtuale è quello che si fa sulle liste...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:05   #6
progC__
Member
 
Iscritto dal: Sep 2005
Messaggi: 39
Quote:
Originariamente inviato da cionci
Guarda...in un vettore anche se usi i puntatori fai sempre lo scambio fisico... L'unico scambio, se si può chiamare così, virtuale è quello che si fa sulle liste...
...e allora la prof che intende per scambio virtuale su un array di struct?... come devo risolvere...e se creo un puntatore esterno all'array, anzi due puntatori per scambiare i due elementi...che dici? si potrebbe fare?
progC__ è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:10   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Al massimo intederà non scambiare l'intera struct, ma solo l'informazione che ti interessa... Mi fai vedere com'è la struct ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:11   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da progC__
e se creo un puntatore esterno all'array, anzi due puntatori per scambiare i due elementi...che dici? si potrebbe fare?
Lo puoi fare, ma stai sempre scambiando fisicamente le due strutture...
Fammi vedere anche cosa intende per scambio fisico sempre con le stesse strutture... Queste definizioni sono molto aleatorie...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:12   #9
progC__
Member
 
Iscritto dal: Sep 2005
Messaggi: 39
Quote:
Originariamente inviato da cionci
Al massimo intederà non scambiare l'intera struct, ma solo l'informazione che ti interessa... Mi fai vedere com'è la struct ?
//ARRAY STRUTTURA
struct array_struct{
int *a;
int indice;
};
progC__ è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:12   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
In *a che ci metti ? Perchè è presente anche indice all'intenro della struct ? E' quella che imposta l'ordine reale ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:14   #11
progC__
Member
 
Iscritto dal: Sep 2005
Messaggi: 39
Quote:
Originariamente inviato da cionci
In *a che ci metti ? Perchè è presente anche indice all'intenro della struct ? E' quella che imposta l'ordine reale ?
ti faccio vedere tutto il programma così ti è più chiaro...

/*selection sort iterativo*/

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

//ARRAY STRUTTURA
struct array_struct{
int *a;
int indice; //chiave dell'array
};

typedef struct array_struct ARRAY;
void iniarray (ARRAY *ar, int len);
void ord_selezione (ARRAY *a,int n);
void main ()
{
ARRAY v;
int size;
srand((unsigned) time(NULL));
printf ("Inserisci il numero di elementi dell'array: \n");
scanf ("%d",&size);
iniarray (&v,size);
v.a = malloc(size);
if (v.a == NULL){
puts ("ERRORE ALLOCAZIONE MEMORIA");
exit(1);
}
printf ("L'array generato in modo rand e': \n");
for (v.indice = 0; v.indice < size; v.indice++){
v.a[v.indice] = rand() % 50;
printf (" %d\n",v.a[v.indice]);
}
//chiamata funzione per ordinare l'array creato
ord_selezione (&v,size);
printf ("L'array ordinato e': \n");
for (v.indice = 0; v.indice<size; v.indice++)
printf (" %d\n",v.a[v.indice]);
}


//funzione selection sort (minimo)
void scambia_ele_array (int v[],int i,int j);
void ord_selezione (ARRAY *a,int n)
{
int indice_min,k; /*indice_min è il minimo valore di tutto l'array*/
for (a->indice = 0; a->indice<n-1;a->indice++)
{
indice_min = a->indice; /*inizializzazione del'indice minimo*/
for (k=a->indice+1;k<n;k++) /*analizza gli elementi dopo il primo indice per trovare il minimo*/
{
if (a->a[indice_min] > a->a[k]) /*se l'indice minimo è maggiore di tutti gli altri elementi dell'array*/
indice_min = k; /*il valore minimo è k rispetto tutta la porzione dell'array*/
}
scambia_ele_array (a->a,a->indice,indice_min); /*una volta stabilito il minimo bisogna scambiare i posti dei*/
} /*due indici per mettere all'inizio il valore più piccolo e via via ad ogni passo riordinare*/
} /*l'array*/


//funzione scambia posto virtualemnte elementi array
void scambia_ele_array (int *v,int i,int j)
{
int temp;
temp = *(v+i);
*(v+i)= *(v+j);
*(v+j)= temp;
}

//inizializza array struct
void iniarray (ARRAY *ar, int len)
{
ar->a = malloc(len);
if (ar == NULL){ puts ("ERRORE ALLOCAZIONE MEMORIA");
exit(1);
}
ar->indice = -1;
}
progC__ è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:26   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Intanto questo è un errore grave: v.a = malloc(size);

v.a = malloc(size * sizeof(int));

Stesso errore anche qui: ar->a = malloc(len);

Comunque l'allocazione dell'array viene già fatta da iniarray, non importa farla anche nel main...anzi è un errore grave farla due volte, perchè hai un memory leak...

Allora...questo non è un array di struct, ma una struttura singola (nota che c'è una sola istanza della struttura ARRAY in tutto il programma)... La variabile ordine non serve praticamente a niente, visto che può essere tranquillamente sostituita da una variabile locale a ord_selezione...

Per lo scambio...ritorno alla considerazione di prima...non esiste scambio virtuale...ache se usi i puntatori (come è stato fatto) è sempre uno scambio fisico...

Ma questo è un programma che ti ha dato la prof o l'hai fatto tu ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:33   #13
progC__
Member
 
Iscritto dal: Sep 2005
Messaggi: 39
Quote:
Originariamente inviato da cionci
Intanto questo è un errore grave: v.a = malloc(size);

v.a = malloc(size * sizeof(int));

Stesso errore anche qui: ar->a = malloc(len);

Comunque l'allocazione dell'array viene già fatta da iniarray, non importa farla anche nel main...anzi è un errore grave farla due volte, perchè hai un memory leak...

Allora...questo non è un array di struct, ma una struttura singola (nota che c'è una sola istanza della struttura ARRAY in tutto il programma)... La variabile ordine non serve praticamente a niente, visto che può essere tranquillamente sostituita da una variabile locale a ord_selezione...

Per lo scambio...ritorno alla considerazione di prima...non esiste scambio virtuale...ache se usi i puntatori (come è stato fatto) è sempre uno scambio fisico...

Ma questo è un programma che ti ha dato la prof o l'hai fatto tu ?
...il programma l'ho fatto io...la traccia è della prof. L'allocazione nel main lo so che è sbagliata e non l'ho cancellata per dimenticanza....ma perchè si fa size * sizeof(int).... per il tipo di elementi che contiene l'array?
progC__ è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:41   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Mi dai la traccia della prof ?

Perchè il parametro di malloc è il numero di byte da allocare... Quindi se vuoi allocare 5 elementi di un certo tipo devi fare sizeof(tipo) * 5, visto che sizeof ritorna il numero di byte occupati da quel dato tipo...

Tra l'altro si fa un cast esplicito (visto che malloc ritorna un void *):

int *a = (int *) malloc(sizeof(int)*n);

Ultima modifica di cionci : 18-09-2005 alle 08:43.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:48   #15
progC__
Member
 
Iscritto dal: Sep 2005
Messaggi: 39
Quote:
Originariamente inviato da cionci
Mi dai la traccia della prof ?

Perchè il parametro di malloc è il numero di byte da allocare... Quindi se vuoi allocare 5 elementi di un certo tipo devi fare sizeof(tipo) * 5, visto che sizeof ritorna il numero di byte occupati da quel dato tipo...

Tra l'altro si fa un cast esplicito (visto che malloc ritorna un void *):

int *a = (int *) malloc(sizeof(int)*n);
IMPLEMENTARE IN C:
L'ALGORITMO SELECTION SORT SU UN ARRAY DI STRUTTURA:
IN VERSIONE ITERATIVA E RICORSIVA;
MEDIANTE SCAMBI REALI E SCAMBI VIRTUALI.
progC__ è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:57   #16
progC__
Member
 
Iscritto dal: Sep 2005
Messaggi: 39
...non c'è proprio nessun modo per fare sto scambio virtuale...(insisto perchè tengo l'esame...aiuto)...cmq grazie per le correzioni e spiegazioni cionci
progC__ è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 08:59   #17
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quello tuo non è un array di strutture... Comunque ha poco senso anche il testo della prof... A che serve fare un array di strutture se l'informazione da ordinare è una sola ?

Avrebbe senso se fosse una lista...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 13:56   #18
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Se non chiarisci cosa intende con scambio virtuale e scambio fisico, e' difficile risponderti. D'altra parte, di sicuro noi a lezione non c'eravamo...
Una possibile interpretazione:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct struttura {
	char stringa[31];
	int len;
} elemento;

void inizializza_array(elemento **e, int len)
{
	int i;

	for (i = 0; i < len; ++i) {
		int l = 1 + rand()%30;
		e[i] = malloc(sizeof(elemento));
		e[i]->len = l;
		memset(e[i]->stringa, 'A', l);
		e[i]->stringa[l] = '\0';
	}	
}

void scambio_virtuale (elemento **e, int i, int j)
{
	elemento *tmp = e[i];
	e[i] = e[j];
	e[j] = tmp;
}

void scambio_fisico (elemento **e, int i, int j)
{
	elemento tmp = *(e[i]);
	*(e[i]) = *(e[j]);
	*(e[j]) = tmp;
}

void ordina(elemento **e, int len)
{
	int i, j;

	for (i = 0; i < len-1; ++i) {
		int min = i;
		for (j = i+1; j < len; ++j)
			if (e[j]->len < e[min]->len)
				min = j;
		scambio_virtuale(e, min, i);
		/* scambio_fisico(e, min, i); */
	}
}

void elimina_array(elemento **e, int len)
{
	int i;

	for (i = 0; i < len; ++i)
		free(e[i]);
}

#define DIM 10

int main(void)
{
	int i;
	elemento *array[DIM];

	srand(time(NULL));
	inizializza_array(array, DIM);
	puts("Prima della cura:");
	for (i = 0; i < DIM; ++i)
		puts(array[i]->stringa);
	ordina(array, DIM);
	puts("\nDopo la cura:");
	for (i = 0; i < DIM; ++i)
		puts(array[i]->stringa);
	elimina_array(array, DIM);
	return 0;
}
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 14:53   #19
progC__
Member
 
Iscritto dal: Sep 2005
Messaggi: 39
Quote:
Originariamente inviato da Qu@ker
Se non chiarisci cosa intende con scambio virtuale e scambio fisico, e' difficile risponderti. D'altra parte, di sicuro noi a lezione non c'eravamo...
Una possibile interpretazione:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct struttura {
	char stringa[31];
	int len;
} elemento;

void inizializza_array(elemento **e, int len)
{
	int i;

	for (i = 0; i < len; ++i) {
		int l = 1 + rand()%30;
		e[i] = malloc(sizeof(elemento));
		e[i]->len = l;
		memset(e[i]->stringa, 'A', l);
		e[i]->stringa[l] = '\0';
	}	
}

void scambio_virtuale (elemento **e, int i, int j)
{
	elemento *tmp = e[i];
	e[i] = e[j];
	e[j] = tmp;
}

void scambio_fisico (elemento **e, int i, int j)
{
	elemento tmp = *(e[i]);
	*(e[i]) = *(e[j]);
	*(e[j]) = tmp;
}

void ordina(elemento **e, int len)
{
	int i, j;

	for (i = 0; i < len-1; ++i) {
		int min = i;
		for (j = i+1; j < len; ++j)
			if (e[j]->len < e[min]->len)
				min = j;
		scambio_virtuale(e, min, i);
		/* scambio_fisico(e, min, i); */
	}
}

void elimina_array(elemento **e, int len)
{
	int i;

	for (i = 0; i < len; ++i)
		free(e[i]);
}

#define DIM 10

int main(void)
{
	int i;
	elemento *array[DIM];

	srand(time(NULL));
	inizializza_array(array, DIM);
	puts("Prima della cura:");
	for (i = 0; i < DIM; ++i)
		puts(array[i]->stringa);
	ordina(array, DIM);
	puts("\nDopo la cura:");
	for (i = 0; i < DIM; ++i)
		puts(array[i]->stringa);
	elimina_array(array, DIM);
	return 0;
}
Allora: per scambio fisico intendo che gli elementi dell'array vengono spostati realmente cioè viene preso l'elemento e spostato in un altra posizione nell'array, per lo scambio virtuale ciò non dovrebbe avvenire, praticamente gli elementi non cambiano posto, rimangono dove sono, ma ciò che cambia sono i puntatori che permettono tale scambio...
progC__ è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 15:28   #20
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da progC__
per lo scambio virtuale ciò non dovrebbe avvenire, praticamente gli elementi non cambiano posto, rimangono dove sono, ma ciò che cambia sono i puntatori che permettono tale scambio...
In un vettore allora non lo puoi fare, sempre che tu intenda ordinare gli elementi secondo le posizioni all'interno dell'array... Questo perchè in un array la posizione di ordine i-esima corrisponde alla i-esima unità di allocazione...quindi per spostare un elemento dalla posizione di ordine j alla posizione di ordine i devi spostarne il contenuto fisicamente dall'unità di allocazione j-esima all'unità di allocazione i-esima...
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
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: 17:14.


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