Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - ordinamento
Forum - C/C++ - ordinamento - Pagina 3

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 17:43
Martedė, 10/06/2008
Cioe' ... tu scrivi

int partition(char *list, int *length, int *size)

e questo significa, ad esempio, che size e' passato per indirizzo, ovvero hai il puntatore al valore di size (lo stesso per gli altri due parametri).

Quando sei all'interno della funzione, se scrivi

printf(" %d ",size);

vuol dire che stai visualizzando il puntatore al valore di size, e non il valore di size. Tenere conto del fatto che e' un puntatore significa che devi scrivere

printf(" %d ", *size);

per ottenere il valore della variabile puntata.
E cosi' anche quando utilizzi tali valori nella formula

x=rand()%((int)size-(int)length+1)+(int)length

Fra l'altro, utilizzi delle variabili i e j e non si capisce dove le vuoi usare in seguito.

Comincia a cambiare questa parte di codice e poi controlliamo il resto ...

P.S. Non mi dire che vuoi che te lo riscriva tutto io, perche' non ne avrei il tempo e poi non sarebbe utile per te ... e' utilissimo imparare a correggere i propri errori per capirlo ... se lo fanno gli altri, non serve proprio a nulla.

Ultima modifica effettuata da gantonio il 10/06/2008 alle 17:44
PM
Avatar
volley.sil (Normal User)
Rookie


Messaggi: 39
Iscritto: 19/05/2008

Segnala al moderatore
Postato alle 18:26
Martedė, 10/06/2008
ho provato a modificare la parte che dici te ora mi da un treno di errori ...te li posto cosė ci dai un'occhiata...

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

void exchange(char list, int i, int j)
{
    
    int tmp=list;
    
    list=list[j];
    printf("  ciao 9ter");
    list[j]=tmp;
}

int partition(char *list, int *length, int *size)
{

     int i,j;
     int x, pivot;
    
     i=*length;
     j=*size;
     printf(" %d ",size);
      printf("  %d  ",length);
    x=rand()%(*size-*length+1)+length;

    pivot=x;
    
    while(i<j)
    {
        while(j>*length && list[j]>pivot)
               j--;
        //while(i<size && list[*i]<=pivot)
              //i++;
         printf("ciao 9bis");
        if(i<j)
        {
                exchange(list,i,j);
                
        }
        
    }
    exchange(list,length,j);
    return j;
}

char quicksort(char *list, int *length, int *size) {
    int q;
    if(length<size)
    {
        (int)q=partition(list,length,size);
        
        quicksort((char*)list,(int*)length,(int*)(q)-1);
        quicksort((char*)list,(int*)(q)+1,(int*)size);
    }
    
    return *list;
}

void readsize(int *length, int *size) {
    FILE *in=fopen("input_list.txt","r");
    int i=0,j=0;
    char tmp;
printf("ciao2");
    while(fscanf(in,"%c",&tmp)!=EOF && tmp!='\n') j++;
    rewind(in);
    printf("ciao3");
    while(fscanf(in,"%*s\n")!=EOF) i++;
    printf("ciao4");
    length=(int*)i; size=(int*)j;
    printf("  %d ",length);
    printf("  %d ",size);
    printf("ciao5");
    fclose(in);
}

char *readline(FILE *in,int size) {
    char *line=(char *)malloc(size*sizeof(char)), tmp;
    int i=0;
printf("ciao9");
    while(i<size && fscanf(in,"%c",&line)!=EOF) i++;
    fscanf(in,"%c",&tmp);
    
    if(tmp!='\n')
    {
        printf("Error: malformed file\n");
        return NULL;
    }    

    return line;
}

char **loadlist(int *length, int *size) {
    int i;
    char **list;
    FILE *in=fopen("input_list.txt","r");

    readsize(length,size);
printf("ciao6");
    (char**)list=(char *)malloc(sizeof(*length));

    for(i=0; i<length; i++)
        printf(" %d",i);
        list=readline(in,(int)size);
            
    
                
    fclose(in);

    return list;
}
void printlist(char *list, int *length, int *size,int n)
{
    int i;
    FILE *fin=fopen("output_list.txt","a");
    printf("ciao10");
    for(i=0; i<n; i++)
    printf("ciao11");
        fprintf(fin,"%c ",&list);
        printf("ciao12");
    fprintf(fin,"\n");
    fclose(fin);
}

int main(int n)
{
    system("cls");
    char **list;    
    int length,size;
    time_t start, end;

    printf("ciao");
    
    list=loadlist((int*)length,(int*)size);
    printf("ciao1");
    start=clock();
    (char)**list=quicksort((char*)list,(int*)length,(int*)size);
    end=clock();
    printf("\nTempo impiegato: %.2f\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
    
    printlist((char*)list,(int*)length,(int*)size,(int)n);

    system("PAUSE");
    return 0;
      
}

Errori:

in function Exchange:
linea 8,10,12 - 8 subscripted value is neither array nor pointer;

in function partition
Linea 25 [Warning] assignment makes integer from pointer without a cast;
Linea 38 [Warning] passing arg 1 of `exchange' makes integer from pointer without a cast ;
Linea 43 [Warning] passing arg 1 of `exchange' makes integer from pointer without a cast (tesso mess per arg 2);

in function Loadlist:
Linea 100 [Warning] assignment from incompatible pointer type ;
Linea 102 [Warning] comparison between pointer and integer .

come li risolvo...
non ci riesco!!!
Grazie


PM
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 19:23
Martedė, 10/06/2008
Devi correggere gli errori che si presentano un po' alla volta, riflettendo su quello che vogliono dire ...

Ad esempio, prendi in considerazione solamente il primo gruppo di errori, e cioe'

Testo quotato

in function exchange:
linea 8,10,12 - 8 subscripted value is neither array nor pointer;



e guarda la funzione a cui si riferiscono gli errori

Codice sorgente - presumibilmente C++

  1. void exchange(char list, int i, int j)
  2. {
  3.    int tmp=list[i];
  4.    
  5.    list[i]=list[j];
  6.    printf("  ciao 9ter");
  7.    list[j]=tmp;
  8. }



Ti sta dicendo che list NON e' un array e NEANCHE un puntatore e quindi non si puo' ammettere una scrittura del tipo

list[ i ]

oppure

list[ j ]

Evidentemente e' sbagliato il tipo del primo parametro che hai usato in

void exchange(char list, int i, int j)

(infatti hai usato un semplice char ...)

Correggi e passa al prossimo errore.

Ultima modifica effettuata da gantonio il 10/06/2008 alle 19:24
PM
Avatar
volley.sil (Normal User)
Rookie


Messaggi: 39
Iscritto: 19/05/2008

Segnala al moderatore
Postato alle 19:48
Martedė, 10/06/2008
come posso fare a passare il valore char list nelle funzioni???

PM
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 19:57
Martedė, 10/06/2008
L'avevi gia' scritto qualche messaggio addietro

Codice sorgente - presumibilmente C/C++

  1. void exchange(char *list, int i, int j) {



poi hai cambiato diverse volte in modo quasi casuale ...

Scusa ma ho l'impressione che tu non abbia assolutamente nessuna idea di quello che stai scrivendo ...

In questo modo, non e' per scoraggiarti, ma non vai da nessuna parte ... per programmare in C e' fondamentale una OTTIMA preparazione di base (devi avere chiarissimi i concetti di variabile, array, puntatore ...) ...

Altrimenti farai solamente un copia-incolla ...

Ultima modifica effettuata da gantonio il 10/06/2008 alle 19:59
PM
Avatar
volley.sil (Normal User)
Rookie


Messaggi: 39
Iscritto: 19/05/2008

Segnala al moderatore
Postato alle 20:25
Martedė, 10/06/2008
ok ho risolto quell'errore seguendo il tuo consiglio...Ecco qua!!!
ora si blocca alla fine...
non da errorri ma solo warning:
in function partition:
linea 31 e 33 - [Warning] comparison between pointer and integer
in function quicksort:
linea 58 - 58 [Warning] return makes integer from pointer without a cast;
in function loadlist:
Linea 102 e 106 - 102 [Warning] assignment makes integer from pointer without a cast;
Linea 104 - [Warning] comparison between pointer and integer
linea 112 -[Warning] return from incompatible pointer type;
in function main:
Linea 138 - 138 [Warning] assignment makes integer from pointer without a cast .
guarda che nn sembra ma con i tuoi suggerimenti sto capendo un sacco di cose....
come risolvo questi warning????

ti posto il sorgente...

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

void exchange(char *list, int i, int j)
{
    
    int tmp=list;
    
    list=list[j];
    printf("  ciao 9ter");
    list[j]=tmp;
}

int partition(char *list, int *length, int *size)
{

     int i,j;
     int x, pivot;
    
     i=*length;
     j=*size;
     printf(" %d ",size);
      printf("  %d  ",length);
    x=rand()%(*size-*length+1)+*length;

    pivot=x;
    
    while(i<j)
    {
        while(j>length && list[j]>pivot)
               j--;
        while(i<size && list<=pivot)
              i++;
         printf("ciao 9bis");
        if(i<j)
        {
                exchange(list,i,j);
                
        }
        
    }
    exchange(list,length,j);
    return j;
}

char quicksort(char *list, int *length, int *size)
{
    int q;
    if(length<size)
    {
        (int)q=partition(list,length,size);
        
        quicksort((char*)list,(int*)length,(int*)(q)-1);
        quicksort((char*)list,(int*)(q)+1,(int*)size);
    }
    
    return list;
}

void readsize(int *length, int *size) {
    FILE *in=fopen("input_list.txt","r");
    int i=0,j=0;
    char tmp;
printf("ciao2");
    while(fscanf(in,"%c",&tmp)!=EOF && tmp!='\n') j++;
    rewind(in);
    printf("ciao3");
    while(fscanf(in,"%*s\n")!=EOF) i++;
    printf("ciao4");
    length=(int*)i; size=(int*)j;
    printf("  %d ",length);
    printf("  %d ",size);
    printf("ciao5");
    fclose(in);
}

char *readline(FILE *in,int size) {
    char *line=(char *)malloc(size*sizeof(char)), tmp;
    int i=0;
printf("ciao9");
    while(i<size && fscanf(in,"%c",&line)!=EOF) i++;
    fscanf(in,"%c",&tmp);
    
    if(tmp!='\n')
    {
        printf("Error: malformed file\n");
        return NULL;
    }    

    return line;
}

char **loadlist(int *length, int *size)
{
    int i;
    char list;
    FILE *in=fopen("input_list.txt","r");

    readsize(length,size);
printf("ciao6");
    list=(char *)malloc(sizeof(*length));

    for(i=0; i<length; i++)
        printf(" %d",i);
        list=readline(in,(int)size);
            
    
                
    fclose(in);

    return list;
}
void printlist(char *list, int *length, int *size,int n)
{
    int i;
    FILE *fin=fopen("output_list.txt","a");
    printf("ciao10");
    for(i=0; i<n; i++)
    printf("ciao11");
        fprintf(fin,"%c ",&list);
        printf("ciao12");
    fprintf(fin,"\n");
    fclose(fin);
}

int main(int n)
{
    system("cls");
    int i;
    char list;
        
    int length,size;
    time_t start, end;

    printf("ciao");
    
    list=loadlist((int*)length,(int*)size);
    printf("ciao1");
    start=clock();
    list=quicksort((char*)list,(int*)length,(int*)size);
    end=clock();
    printf("\nTempo impiegato: %.2f\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
    
    printlist((char*)list,(int*)length,(int*)size,(int)n);

    system("PAUSE");
    return 0;
      
}

PM
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 20:36
Martedė, 10/06/2008
Sono warning "gravi" ... se scrivi

while(j>length && list[j]>pivot)

oppure

while(i<size && list<=pivot)

come dice il messaggio, stai confrontando valori numerici interi e puntatori ... e questo portera', se ti va bene, ad un malfunzionamento oppure in un crash ...

Esamina TUTTI i warning, correggili e solo allora posta il codice ...

PM
Avatar
volley.sil (Normal User)
Rookie


Messaggi: 39
Iscritto: 19/05/2008

Segnala al moderatore
Postato alle 20:47
Martedė, 10/06/2008
mi conciene trasformare i e  j in puntatori o lenght e size in variabili???

PM
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo