Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
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


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
E-mail reset password di Instagram: la c...
La NASA ha discusso le problematiche del...
Il razzo spaziale NASA SLS e la capsula ...
Stazione Spaziale Internazionale: Crew-1...
Samsung Galaxy S26 Ultra: la ricarica de...
Apple ha un nuovo partner per la sua App...
Trenitalia introduce il prezzo dinamico ...
OnePlus non si ferma più: c'&egra...
DAZN sconta il piano Full per 6 mesi, se...
L'uso dell'IA nei giochi è cancer...
Meta punta sul nucleare USA per alimenta...
Le migliori offerte Amazon del weekend: ...
La crisi dell'hardware spinge i negozi g...
Apple Watch SE 3 scontato su Amazon: il ...
Robot aspirapolvere davvero scontati: si...
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: 23:18.


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