Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-09-2005, 09: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, 20: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, 23: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, 08: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, 08: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, 09: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, 09: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, 09: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, 09: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, 09: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, 09: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, 09: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, 09: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, 09: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 09:43.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2005, 09: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, 09: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, 09: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, 14: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, 15: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, 16: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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
iPhone Fold: scorte limitate al lancio m...
OpenAI porterà la pubblicità in ChatGPT ...
TSMC aumenterà ancora i prezzi: nel 2026...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
La famiglia Xiaomi 17 sta per registrare...
Nuove auto elettriche che vedremo sul me...
E-bike illegali, a Verona il più ...
Quali sono i giochi più venduti su Steam...
HONOR sta per lanciare un nuovo smartpho...
Jared Isaacman sarà alla guida de...
Il Tesla Cybertruck non arriverà ...
Xiaomi Watch 5 è ufficiale: architettura...
CD Projekt vende GOG: il co-fondatore Mi...
Il meglio di Amazon in 26 prodotti, aggi...
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: 21:32.


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