Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
In occasione del proprio Snapdragon Summit Qualcomm annuncia i due nuovi chip per dispositivi mobile di fascia alta che entreranno nel mercato nel corso del 2027: tanta potenza a disposizione per elaborazioni di intelligenza artificiale sempre più complesse
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-10-2008, 18:33   #1
andreapav
Member
 
Iscritto dal: Oct 2008
Messaggi: 70
[C] ordinamento

ciao! ho un programma di ordinamento (mergesort iterativo o non-ricorsivo, che dir si voglia...) e ho bisogno che ordini grandi quantità di dati...
il problema è che con ad esempio 100000 si pianta...con problemi di memoria ma non ben chiari sinceramente...

ho pensato che sia che ho gli indici del vettore in int e che magari vada in overflow ma però mi scrive i numeri correttamente (1000000 ad esempio) e quindi non so...

ho pensato anche che possa essere un problema che alloco troppa memoria e allora ho aggiunto un free ma non cambia una cippa...

vi posto il codice... se qualcuno ha qualche idea... io intanto provo a usare long come indici ma...non son convinto sia quello...

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

#define SIZE 100000

/*vettore contenente i dati*/
long *vector;

void getData2()
{
	int i;
	vector = (long*)malloc(SIZE*sizeof(long));
	for (i=0; i < SIZE; i++)
	{
		vector[i] = (long)rand(); 
	}
	printf("creati %d dati...\n",i);
}

/*funzione che verifica il corretto ordinamento*/
int ordinati(long v[], int numero)
{
	long a = v[0];
	long b;
	int i;
	for (i = 1; i < numero; i++)
	{
		b = v[i];
		if (b < a) return i;
		a = b;
	}
	return i;
}

void merge(long a[], int start, int center, int end, int size) {
        int i, j, k; 
        long *app;
	app = (long*)malloc(size*sizeof(long));
        i = start;
        j = center+1;
        k = 0;
 
        while ( (i <= center) && (j <= end) ) 
        {
             if (a[i] <= a[j]) 
  	  {
                        app[k++] = a[i++];
               }
	else 
	 {
                        app[k++] = a[j++];
              }
        }
 
        while ( i <= center ) 
                app[k++] = a[i++]; 
 
        while ( j <= end ) 
                app[k++] = a[j++]; 
 
        for (k = start; k <= end; k++)
                a[k] = app[k-start];
        
        free(app);     //QUESTO è IL FREE CHE SECONDO ME NON SERVE...
}

/*funzione che fa il mergesort non ricorsivo/iterativo*/ 
void mergesortI(long a[],int size) {
        int sizetomerge = size-1;
        int i;
        int n=2;

        size-- ;
 
        while ( n < sizetomerge*2 ) 
        {
             for (i = 0; (i+n-1) <= sizetomerge; i += n ) 
	{
                     merge(a,i,(i+i+n-1)/2,i+(n-1),sizetomerge); 
             }
             i--;
            if ( (sizetomerge + 1)%n != 0 ) 
	{
                   if (size > sizetomerge)
                                merge (a,sizetomerge -((sizetomerge)%n),sizetomerge,size,size);
                   sizetomerge=sizetomerge-((sizetomerge+1)%n);
  	}
            n = n*2;
        }

        if (size > sizetomerge) 
                merge (a,0,size-(size-sizetomerge),size,size);
}


/*main*/
int main(int argc, char** argv[])
{
	double numero = SIZE;    /*numero di dati da ordinare*/

	srand((int)time(NULL));
	getData2();

	/*sorting:*/
	printf("sorting...");
	mergesortI(vector,(int)numero);
	printf("completato.\n");

	/*controllo:*/
	creati = ordinati(vector,(int)numero);
	if (creati == (int)numero) 
		printf("Ordinamento effettuato correttamente. \n");
	else 
		printf("Ordinamento errato a: %d .\n",creati);

	return 0;
}
andreapav è offline   Rispondi citando il messaggio o parte di esso
Old 04-10-2008, 20:38   #2
andreapav
Member
 
Iscritto dal: Oct 2008
Messaggi: 70
sul mio computer va fino a 23108...

il problema credo sia che usa un'enormità di memoria (guardando con il task manager arriva fino a 2.8GB...) però è un metodo che non dovrebbe usare cosi tanta memoria...

free(..) deve essere sbagliata perchè mi pianta tutto anche con piccoli numeri

grazie in anticipo a chi mi da un suggerimento...
andreapav è offline   Rispondi citando il messaggio o parte di esso
Old 04-10-2008, 21:23   #3
goldorak
Senior Member
 
Iscritto dal: Apr 2003
Messaggi: 16462
Perche' non controlli il valore di ritorno della malloc ?
Il free non serve a niente se malloc non riesce ad allocarti la memoria necessaria.
__________________
MICROSOFT : Violating your privacy is our priority
goldorak è offline   Rispondi citando il messaggio o parte di esso
Old 04-10-2008, 22:24   #4
andreapav
Member
 
Iscritto dal: Oct 2008
Messaggi: 70
alòr... trovato l'inghippo...

il free forse, se scritto giusto potrebbe essere una soluzione, infatti succedeva che a ogni chiamata a merge allocava TOT spazio per usarlo solo a quella chiamata di merge.

SOLUZIONE: avere un long *app esterno a main e a ogni metodo comune a tutti insomma, la memoria allocata 1 volta sola, alla chiamata di mergesortI, in modo poi che in merge venga usato sempre lo stesso spazio di memoria e non ne allochi di nuova ogni volta.
andreapav è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
Dash cam 4K con doppia telecamera, GPS, ...
Qwen 4: Alibaba conferma l'addestramento...
Super El Niño, allarme globale: 451.000 ...
Toyota, 400.000 robot in fabbrica senza ...
Hanno bucato l'FBI e ora dettano le cond...
Standard sì, licenze no: la linea di Ope...
Guida all'acquisto: quale smartphone HON...
PS6 e nuova XBOX, i SoC avrebbero supera...
Alcuni frigoriferi smart di Samsung si a...
Italiani e IA, l'entusiasmo cala: avanti...
Robin Williams resuscitato dall'IA per p...
Acquista una RTX 5090 usata per risparmi...
CLOSEDQUORUM, il malware che usa quattro...
Microsoft: Calendar, People e Files vann...
Due missili su una scuola elementare ira...
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: 15:54.


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