|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
[C] qsort di array di puntatori a strutture
Salve ragazzi questa cosa mi sta mandando fuori di testa.
Vi allego i codici Questo è il file : interval.h Codice:
typedef struct _interval{
int s;
int f;
int len;
}Interval;
Codice:
#include "interval.h"
Interval **readInterval(int n)
{
Interval **s = (Interval *) malloc(n*sizeof(Interval *));
int j;
for(j=0;j<n;j++)
{
Interval *i = (Interval *) malloc(sizeof(Interval));
scanf("%d %d",&i->s,&i->f);
i->len = i->f-i->s;
s[j]= i;
}
return s;
}
void writeInterval(Interval **s,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d %d %d \n",s[i]->s,s[i]->f,s[i]->len);
}
}
Codice:
#include "interval.h"
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *,const void *);
int main()
{
int n;
Interval **s;
scanf("%d",&n);
s = readInterval(n);
writeInterval(s,n);
qsort(s,n,sizeof(Interval *),cmp);
printf("******\n");
writeInterval(s,n);
}
int cmp(const void *a,const void *b)
{
const Interval *i = (const Interval *)a;
const Interval *j = (const Interval *)b;
return j->len - i->len;
}
Codice:
5 1 4 2 4 4 5 3 4 1 2 Codice:
1 4 3 2 4 2 4 5 1 3 4 1 1 2 1 ****** 3 4 1 4 5 1 2 4 2 1 4 3 1 2 1
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni Ultima modifica di qwerty86 : 28-08-2011 alle 12:44. Motivo: tag |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Non posso provare purtroppo , ma potrebbe essere che forse devi cambiare :
Codice:
qsort(s,n,sizeof(Interval *),cmp); Codice:
qsort(*s,n,sizeof(Interval),cmp);
__________________
GPU Compiler Engineer |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
Quote:
Codice:
int cmp(const void *a,const void *b)
{
const Interval *i = *(const Interval **)a;
const Interval *j = *(const Interval **)b;
return j->len - i->len;
}
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Inoltre non credo tu abbia veramente la necessità di utilizzare i doppi puntatori per fare quello che fai, è sufficiente un array normale di elementi (Interval)
__________________
GPU Compiler Engineer |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Beh si anche così va bene, in sostanza il problema è che ordinavi sulla cosa sbagliata visto che ti mancava un livello di dereferenziamento.
__________________
GPU Compiler Engineer |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:34.




















