Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56

    C segmentation fault ...

    ...prima di cominciare !
    Non mi entra neanche nella readlines ( l' ho debuggata con l ' IDE) , veloce come un fulmine :
    Grazie per l ' aiuto.....



    codice:
     
    
    
                #include <stdio.h> 
                 #include <string.h>
                 #define  MAXLINES   1000
    
      char *lineptr[MAXLINES];  /* puntatore alle linee di testo  */
      int   readlines(char *lineptr[], int nlines);
      void  writelines(char  *lineptr[], int nlines); 
      void  qsort (char  *lineptr[], int left, int  right);
    
      void  swap (char *v[], int i, int j);
    
    
    
      /* ordina le linee di input */
    
         main()
           { 
    
             int nlines;
             if  ((nlines = readlines(lineptr, MAXLINES)) >= 0 )
                 
                 {
                    qsort(lineptr, 0, nlines -1);
                    writelines(lineptr, nlines);
                    return 0 ;
                  }
                 
                    else
                      { 
                         printf("errore: troppe linee di input da ordinare\n");
                          return 1 ;
                      }
    
             }            
    
    
    
    
    
            /* readlines legge le linee di inpuy  */ 
    
    
                    #define ALLOCSIZE  10000
                    #define MAXLEN 1000
                    int  getline(char  *, int);
    
                     
                        
                    int  readlines(char  *lineptr[], int maxlines )
    
                     {
    
                       int  len;
                       int  nlines;
                       char  *p; 
                       char line[MAXLEN];
                       nlines = 0;
    
                       while  ((len = getline(line,MAXLEN)) >  0 )
    
                          if   (nlines >= maxlines ||  (p = malloc(len)) == NULL)
                                       
                               return  -1 ;
                          else
    
                            {
                              line[len-1] = '\0';
                              strcpy(p, line);
                              lineptr[nlines++] = p;
                             }
    
                      }
    
    
    
    
       /* qsort : ordina v[left] ... v[right] in ordine crescente   */
    
    
               void   qsort( char *v[], int left, int right )
    
                    {
                      int i, last;
                      void  swap(char *v[], int i, int j);
    
                     if (left >= right) // se il vettore contiene meno di due
                        return;         // elementi non fa nulla
    
                     swap(v, left, (left + right) / 2 );
                     last = left;
    		 for (i= left+1; i <= right; i++)
                        if (v[i] < v[left])
                            
                            swap(v, ++last, i);
    
            /* ripristina l' elemento discriminante  */
    
                     swap(v, left, last);
                     qsort(v, left, last - 1);
                     qsort(v, last + 1, right);  
    
                  }
    
    
       /* swap : scambia v[i] con v[j]  */
    
               void  swap (char *v[], int i, int j)
    
    
                 {  char *temp;
    		
    		temp = v[i];
    		v[i] = v[j];
    		v[j] = temp;
    
                }
     
     
    
                       /* writelones scrive in output le linee  */
    
    
                 void  writelines(char  *lineptr[], int  nlines)
    
                        {
    
                            int  i;
    
                            for  (i = 0; i < nlines; i++ )
                                printf("%s\n", lineptr[i]);  
    
    
                        }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    codice:
      int nlines;
             if  ((nlines = readlines(lineptr, MAXLINES)) >= 0 )
    separa le varie cose, prova a vedere che succede,

    lineptr

    chi è? quanto vale?

    lo hai definito così

    char *lineptr[MAXLINES];

    ma hai, se non erro, un doppio puntatore, hai allocato l'array, non il contenuto dell'array (che punta a niente)
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    Originariamente inviato da valia
    codice:
      int nlines;
             if  ((nlines = readlines(lineptr, MAXLINES)) >= 0 )
    separa le varie cose, prova a vedere che succede,

    lineptr

    chi è? quanto vale?

    lo hai definito così

    char *lineptr[MAXLINES];

    ma hai, se non erro, un doppio puntatore, hai allocato l'array, non il contenuto dell'array (che punta a niente)

    lineptr è usato nella readlines con l 'indice nlines ...lineptr[nlines]...e va bene.
    Ho aggiunto la stdlib ...prima non l 'avevo messa per il conflitto che c'è fra il getline e qsort miei e
    quelli della libreria.Ora li ho chiamati Mgetline e Mqsort ...

    Nella fase build (sarebbe il link di windows )ho quest errori che non capisco ( sono sotto linux...)

    recqsort.c.text+0x191): undefined reference to `alloc'
    recqsort.c.text+0x1d1): undefined reference to `Mgetline'





    codice:
              #include <stdio.h> 
                 #include <string.h>
                #include <stdlib.h>
                 #define  MAXLINES   1000
    
      char *lineptr[MAXLINES];  /* puntatore alle linee di testo  */
      int   readlines(char *lineptr[], int nlines);
      void  writelines(char  *lineptr[], int nlines); 
      void  Mqsort (char  *lineptr[], int left, int  right);
    
      void  swap (char *v[], int i, int j);
    
      int Mgetline(char  *, int);
                     char *alloc(int);
    
    
    
    
    
      /* ordina le linee di input */
    
         main()
           { 
    
             int nlines;
             if  ((nlines = readlines(lineptr, MAXLINES)) >= 0 )
                 
                 {
                   Mqsort(lineptr, 0, nlines -1);
                    writelines(lineptr, nlines);
                    return 0 ;
                  }
                 
                    else
                      { 
                         printf("errore: troppe linee di input da ordinare\n");
                          return 1 ;
                      }
    
             }            
    
    
    
    
    
            /* readlines legge le linee di inpuy  */ 
    
    
                    #define ALLOCSIZE  10000
                    #define MAXLEN 1000
                    
                        
                    int  readlines(char  *lineptr[], int maxlines )
    
                     {
    
                       int  len;
                       int  nlines;
                       char  *p; 
                       char line[MAXLEN];
                       nlines = 0;
    
                       while  ((len = Mgetline(line,MAXLEN)) >  0 )
    
                          if   (nlines >= maxlines ||  (p =(char*) alloc(len)) == NULL)
                                       
                               return  -1 ;
                          else
    
                            {
                              line[len-1] = '\0';
                              strcpy(p, line);
                              lineptr[nlines++] = p;
                             }
    
                      }
    
    
    
    
       /* qsort : ordina v[left] ... v[right] in ordine crescente   */
    
    
               void   Mqsort( char *v[], int left, int right )
    
                    {
                      int i, last;
                      void  swap(char *v[], int i, int j);
    
                     if (left >= right) // se il vettore contiene meno di due
                        return;         // elementi non fa nulla
    
                     swap(v, left, (left + right) / 2 );
                     last = left;
    		 for (i= left+1; i <= right; i++)
                        if (v[i] < v[left])
                            
                            swap(v, ++last, i);
    
            /* ripristina l' elemento discriminante  */
    
                     swap(v, left, last);
                    Mqsort(v, left, last - 1);
                    Mqsort(v, last + 1, right);
    
                  }
    
    
       /* swap : scambia v[i] con v[j]  */
    
               void  swap (char *v[], int i, int j)
    
    
                 {  char *temp;
    		
    		temp = v[i];
    		v[i] = v[j];
    		v[j] = temp;
    
                }
     
     
    
                       /* writelones scrive in output le linee  */
    
    
                 void  writelines(char  *lineptr[], int  nlines)
    
                        {
    
                            int  i;
    
                            for  (i = 0; i < nlines; i++ )
                                printf("%s\n", lineptr[i]);  
    
    
                        }
    recqsort.c.text+0x191): undefined reference to `alloc'
    recqsort.c.text+0x1d1): undefined reference to `Mgetline'

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.