Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15

    [C] Definire più array in uno stesso ciclo e segmentation fault?

    Salve a tutti! Mi avvicino oggi per la prima volta al linguaggio C, e volevo chiedervi: è possibile inizializzare contemporaneamente due (o più) array usando uno stesso ciclo for?
    Ci ho provato, ma quando li faccio stampare uno dei due (sempre lo stesso, indipendentemente dall'ordine con cui li scrivo nel ciclo) appare sballato nei primi componenti... non riesco proprio a capire cosa accada, anche perché durante il ciclo viene stampato correttamente, mentre è sballato soltanto quando lo stampo poi fuori dal ciclo di inizializzazione...
    Inoltre, se uso un n abbastanza grande (esempio =99) mi restituisce un errore di "segmentation fault", che non capisco a cosa sia dovuto dato che con n più piccoli non compare...
    (il programma doveva essere un crivello di eratostene ma a causa di questi errori ho cancellato tutto il resto e lasciato la sola definizione degli array..)

    Ecco il codice:

    codice:
    /* Programma che scriva tutti i numeri primi da 1 a n (n variabile fissato dall’utente) 
    CRIVELLO DI ERATOSTENE */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main(void)
    {
    int i,j,c,n=0;
    int primi[n];
    int setaccio[n];
    printf("\n\nFino a che numero estendi la ricerca?\t");
    scanf("%d",&n);
    printf("\n");
    for (i=0;i<=(n);i++)	
    {
      setaccio[i]=i+2;
      primi[i]=i+2;
      printf("%d, ",setaccio[i]);
    }
    printf("\n");
    printf("primi: ");
    for (i=0;i<=(n);i++)
    {
      printf("%d, ",primi[i]);
    }
    printf("\n");
    printf("setaccio: ");
    for (i=0;i<=(n);i++)
    {
      printf("%d, ",setaccio[i]);
    }
    printf("\n\n");
    return 0;
    }

  2. #2
    Al volo vedo "i<=(n)", che è sbagliato, i deve essere strettamente minore di n, dato che se crei un array come primi[n] l'indice può variare da 0 a n-1 (ovvero, n elementi).

    Peraltro, n=0, per cui quegli array saranno di dimensione nulla.

    Infine, se le dimensioni di un array non sono note al momento della compilazione in genere è meglio usare l'allocazione dinamica piuttosto che dichiarare dei VLA (variable length array) come hai fatto tu.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    segmentation fault è indice che stai accendendo ad un'area di memoria che non ti è permessa.
    Ti faccio notare che gli array così definiti

    codice:
    int array[10];
    hanno dimensione 10 (contengono 10 elementi), ma ai suoi elementi accedi contando da 0 a 9, quindi la condizione del for

    codice:
    for (i = 0; i <= n; i++)
    è errata e deve diventare

    codice:
    for (i = 0; i < n; i++)
    RTFM Read That F*** Manual!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15
    Grazie per la tempestività
    Sì, scusate l'uguale è rimasto da prima (avevo impostato tutto diversamente, infatti prima era <=(n-2) .. per quello appare anche la parentesi..)
    In ogni caso, anche togliendo l'uguale continua a darmi il segmentation fault e anche a sballarmi uno dei vettori..

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    vedi quello che dice Mitaly
    RTFM Read That F*** Manual!!!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Gnugnu
    In ogni caso, anche togliendo l'uguale continua a darmi il segmentation fault e anche a sballarmi uno dei vettori..
    Ma si ti è stato detto che

    codice:
    int i,j,c,n=0;
    int primi[n];
    int setaccio[n];
    è sbagliato, dovresti quanto meno correggere prima di riprovare ed avere lo stesso errore ... no?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15
    Infine, se le dimensioni di un array non sono note al momento della compilazione in genere è meglio usare l'allocazione dinamica piuttosto che dichiarare dei VLA (variable length array) come hai fatto tu.
    Non l'ho inteso come "quello che hai fatto è sbagliato", ma piuttosto come "avresti potuto farlo diversamente". Ma forse sono io che non capisco l'italiano.
    In ogni caso sto provando con l'allocazione dinamica (sempre se è quello il problema), ma grazie mille per la tua puntualizzazione.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15
    (sempre se ti riferivi a quello... altrimenti non ho proprio capito cosa hai scritto!)

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Gnugnu
    Non l'ho inteso come "quello che hai fatto è sbagliato", ma piuttosto come "avresti potuto farlo diversamente"
    Scusa ma

    "Peraltro, n=0, per cui quegli array saranno di dimensione nulla."

    significa che il tuo array non esiste e se non esiste, trattarlo dopo non ti può dare che errori.

    La frase seguente

    "Infine, se ..."

    inizia un altro discorso che ti fornisce più strade per rimediare all'errore di cui sopra.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    guarda prova a mettere prima n=10 e poi passa all'allocazione dinamica
    RTFM Read That F*** Manual!!!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.