Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]Segmentation fault, buffer di linux

    Salve a tutti,su suggerimento di YuYevon:
    Ti suggerisco come interessante esercizio l'allocazione dinamica della memoria per una matrice tridimensionale gestita come puntatore triplo
    Il che è molto bello, lascerei la ragazza per questo
    Ho detto,proviamo a farlo.
    C'è un segmentation fault, nella stessa riga in cui dichiaro:
    codice:
    puts(stringmatrix[j][i]);
    Il che dimostra che il flusso di istruzioni va avanti senza considerare che sto tentando di pulire il buffer a modo mio,ma la getchar viene totalmente ignorata.
    Questo è il codice integrale,con 0 errori e 0 avvisi usando GCC su code::blocks (linux) ma il segmentation fault:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <time.h>
    #include <stdbool.h>
    #include <string.h>
    
    
    
    
    int main(int argc,char **argv)
    {
        char ***stringmatrix;
        int i,j,size,taker;
        stringmatrix=(char***)calloc(5,sizeof(char**));
        if(stringmatrix==NULL)
        {
            printf("Errore, scappa !!!\n");
            exit(0);
        }
        for(j=0;j<5;j++)
        {
            stringmatrix[j]=(char**)malloc(sizeof(char*));
            if(stringmatrix[j]==NULL)
            {
                printf("Errore, scappa !!!\n");
                exit(0);
            }
            for(i=5;i<5;i++)
            {
                taker=getchar();
                getchar();
                while(taker!=10)
                    ;
                size=1;
                taker=0;
                while(taker!=10)
                {
                    fseek(stdin,-1,SEEK_CUR);
                    size++;
                }
                stringmatrix[j][i]=(char*)calloc(size,sizeof(char));
                if(stringmatrix[i][j]==NULL)
                {
                    printf("Errore, scappa !!!\n");
                    exit(0);
                }
                fgets(stringmatrix[j][i],size,stdin);
            }
        }
        for(j=0;j<5;j++)
            for(i=0;i<5;i++)
                puts(stringmatrix[j][i]);
        return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ho usato puts, non fputs.
    Comunque si,ma è la gets che non funziona.O meglio, non riesco a pulire il buffer quindi salta la fgets.
    Prima uso la getchar, poi conto i caratteri con size e li tiro su con fgets sapendo la dimensione ma c'è qualcosa che non quadra,il buffer non riesco a pulirlo perchè non mi chiede nemmeno un carattere in ingresso.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: [C]Segmentation fault, buffer di linux

    Originariamente inviato da ramy89
    codice:
            for(i=5;i<5;i++)
    Qui ho avuto paura.

    Originariamente inviato da ramy89
    codice:
                taker=getchar();
                getchar();
                while(taker!=10)
                    ;
                size=1;
                taker=0;
                while(taker!=10)
                {
                    fseek(stdin,-1,SEEK_CUR);
                    size++;
                }
    Qui di più. Cos'è, supercazzola in C?
    every day above ground is a good one

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C]Segmentation fault, buffer di linux

    fscanf() : scanf() = fputs() : puts()
    In altre parole anche se ho messo il riferimento sbagliato, il succo non cambia.

    Tra l'altro mi era anche sfuggito il for balengo ( e vabbé capita).

    Però ti lamentavi di questo, no?
    Originariamente inviato da ramy89
    C'è un segmentation fault, nella stessa riga in cui dichiaro:
    codice:
    puts(stringmatrix[j][i]);
    Messo a posto il for, con questa linea:
    codice:
    stringmatrix[j][i]=(char*)calloc(size,sizeof(char));
    crei un singolo puntatore a char e con la fgets ci infili un solo char.
    La puts però si aspetta una ASCIIZ string, non un singolo puntatore a carattere.
    http://www.cplusplus.com/reference/c...y/cstdio/puts/
    (stavolta è giusto )
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Aggiungo inoltre che dal for interno con indice i (una volta sistemato con i = 0, i < 5) deduco che tu voglia creare un array di 5 matrici bidimensionali (cioè di fatto un array tridimensionale di "profondità" 5) e che ogni matrice debba avere 5 righe (ciascuna a sua volta di dimensioni variabili). Se è così (come sembra) devi anche sistemare questa

    codice:
    stringmatrix[j]=(char**)malloc(sizeof(char*));
    con

    codice:
    stringmatrix[j]=(char**)malloc(5*sizeof(char*));
    every day above ground is a good one

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ho provato, ma il problema è che mi crasha ancora quando chiamo la calloc.
    Stavolta mi sono fatto una funzione per l' input,ecco il codice:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <time.h>
    #include <stdbool.h>
    #include <string.h>
    
    
    char *input(void);
    
    
    int main(int argc,char **argv)
    {
        char ***stringmatrix;
        int i,j;
        stringmatrix=(char***)calloc(5,sizeof(char**));
        if(stringmatrix==NULL)
        {
            printf("Errore, scappa !!!\n");
            exit(0);
        }
        for(j=0;j<5;j++)
        {
            stringmatrix[j]=(char**)malloc(sizeof(char*));
            for(i=0;i<5;i++)
            {
                stringmatrix[j][i]=input();
            }
        }
        for(j=0;j<5;j++)
            for(i=0;i<5;i++)
                puts(stringmatrix[j][i]);
        return 0;
    }
    
    
    char *input(void)
    {
        char *buffer,*pointer;
        buffer=(char*)calloc(100,sizeof(char));                       /*************** qua ****************/
        if(buffer==NULL)
        {
            printf("Errore, scappa !!!\n");
            exit(0);
        }
        fgets(buffer,100,stdin);
        pointer=(char*)calloc(strlen(buffer)+1,sizeof(char));
        strcpy(pointer,buffer);
        free(buffer);
        return pointer;
    }
    Mi sto proprio dimenticando, da segmentation fault, sul GCC du linux nella riga contrassegnata mi segna:
    codice:
    Program received signal SIGABRT,aborted.
    Eppure mi pareva di aver fatto tutto correttamente.

  8. #8
    Originariamente inviato da ramy89
    codice:
        for(j=0;j<5;j++)
        {
            stringmatrix[j]=(char**)malloc(sizeof(char*));
            for(i=0;i<5;i++)
            {
                stringmatrix[j][i]=input();
            }
        }
        for(j=0;j<5;j++)
            for(i=0;i<5;i++)
    ...
    allochi una sola "cosa" ma poi pretendi averne cinque.

    poi:
    • nella malloc incriminata oltre ad allocare una sola cosa quando te ne servono cinque, non controlli il puntatore restituito;
    • nella "input" ti porti in giro un "\n" da fgets in genere inutile;
    • usa le macro
      codice:
      #define NUM_ROW 2
      #define NUM_COL 3
      usando 5 e 5 cablato nel codice, non riesci più a distinguere le righe dalle colonne;
    • nei programmi di test, usa assert anziché if.. abort (0);
    • usa i per le righe e j per le colonne (meglio ancora un qualcosa del tipo: aIterRow, aIterColumn).
    • usa SEMPRE le graffe anche laddove non necessario altrimenti prima o poi commetterai l'errore del tipo:
      codice:
          for(j=0;j<5;j++)
              for(i=0;i<5;i++)
              	Log (i, j);
              	puts (stringmatrix[j][i]);

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Alla fine ho fatto a modo mio
    Ho semplicemente sostituito la newline col terminatore nella funzione input e poi ho usa printf invece di puts.
    Per farla più breve ho fatto una matrice 3x3 invece che 5x5,tanto la pappa è la stessa.
    Ecco il codice:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <time.h>
    #include <stdbool.h>
    #include <string.h>
    
    
    char *input(void);
    
    
    int main(int argc,char **argv)
    {
        char ***stringmatrix;
        int i,j;
        stringmatrix=(char***)calloc(3,sizeof(char**));
        if(stringmatrix==NULL)
        {
            printf("Errore, scappa !!!\n");
            exit(0);
        }
        for(j=0;j<3;j++)
        {
            stringmatrix[j]=(char**)calloc(3,sizeof(char*));
            for(i=0;i<3;i++)
            {
                stringmatrix[j][i]=input();
            }
        }
        for(j=0;j<3;j++)
            for(i=0;i<3;i++)
                printf("%s",stringmatrix[j][i]);
        return 0;
    }
    
    
    char *input(void)
    {
        char *buffer,*pointer;
        buffer=(char*)calloc(100,sizeof(char));
        if(buffer==NULL)
        {
            printf("Errore, scappa !!!\n");
            exit(0);
        }
        fgets(buffer,100,stdin);
        pointer=(char*)calloc(strlen(buffer)+1,sizeof(char));
        strcpy(pointer,buffer);
        pointer[strlen(buffer)-1]='\0';
        free(buffer);
        return pointer;
    }
    Anche se poi non ci ho dormito la notte,bella questa proposta Yu

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da ramy89
    Anche se poi non ci ho dormito la notte,bella questa proposta Yu
    Bravo, non pensavo che raccogliessi subito la proposta. E' pur vero che deallocare un po' di spazio alla fine non sarebbe male: non è strettamente necessario dato che il programma termina, ma pensa che (come dissi già un'altra volta) sono anche queste cose che hanno prodotto java
    Se vuoi divertirti ulteriormente, prova a fare l'allocazione della memoria in una void function. Specifico "void", il puntatore non va restituito ma deve essere un parametro di input/output. E visto che già di suo è un puntatore triplo, nella funzione sarà un puntatore quadruplo. La stampa poi la fai in main(). Non so te, ma io mi diverto a leggere tutti quegli asterischi
    every day above ground is a good one

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.