Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175

    [caccia all'errore] Core dumped

    Ho un file, questo sotto che si compila senza errori ma quando metto tutti i parametri alla fine mi dà un core dumped. Dov'è l'errore???
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    /* PROTOTIPO FUNZIONE */
    void bin_search(float *A, int n, int chiave, int *ris);
    
    /* PROGRAMMA CHIAMANTE*/
    main()
    {
    	/* DICHIARAZIONE VARIABILI */
    	float *A;
    	int i, c;
    	int n, chiave, logical;
    
    	/* LETTURA ELEMENTI ARRAY */
    	printf("Inserire il numero di elementi formanti l'array: ");
    	scanf("%d",&n);
    
    	/* ALLOCAZIONE DINAMICA DELLA MEMORIA */
    	if(!(A = (float *)malloc(n*sizeof(float))))
    	abort();
    
    	/* LETTURA ELEMENTI ARRAY */
    	printf("\n");
    	for (i=0; i<=n-1; i++){
    	printf("Inserire il valore dell'elemento %d: ", c=i+1);
    	scanf("%f", &A[i]);
    	}
    
    	/* NUMERO DA RICERCARE */
    	printf("\nInserire il numero che si desidera individuare: ");
    	scanf("%d", chiave);
    
    	bin_search(A, n, chiave, &logical);
    	printf("%d", logical);
    
    	free(A);
    }
    
    /****************** SPECIFICHE FUNZIONE *************************/
    void bin_search(float *A, int n, int chiave, int *ris)
    {
    int i, ordine;
    int alto, basso, centro, pos;
    
    	/* CONTROLLO ORDINE */
    	i = 0;
    	ordine = 1;
               while(ordine == 1 && i<=n-1){
    	      if(A[i] == A[i+1]-1)
    	        {ordine = 1;}
    	      else
    	        {ordine = 0;}
    	   i++;
    	}
    
    	/* SE L'ARRAY NON è ORDINATO ESCI */
    	if (ordine==0) {abort();}
    
    	/* RICERCA BINARIA */
    	alto = 0;
    	basso = n-1;
    	pos = -1;
    	do {
    	centro = (alto+basso)/2;
    	if (A[centro]==chiave)
    		{pos = chiave;}
    	else if (A[centro]<chiave)
    		{alto = chiave+1;}
    	else
    		{basso = chiave-1;}
    	}
    	while(alto<=basso && pos==-1);
    
    if(pos!= -1)
    	*ris = 1;
    else
    	*ris = 0;
    }

  2. #2

    Re: [caccia all'errore] Core dumped

    Originariamente inviato da Metallica
    Ho un file, questo sotto che si compila senza errori ma quando metto tutti i parametri alla fine mi dà un core dumped. Dov'è l'errore???
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    /* PROTOTIPO FUNZIONE */
    void bin_search(float *A, int n, int chiave, int *ris);
    
    /* PROGRAMMA CHIAMANTE*/
    main()
    {
    	/* DICHIARAZIONE VARIABILI */
    	float *A;
    	int i, c;
    	int n, chiave, logical;
    
    	/* LETTURA ELEMENTI ARRAY */
    	printf("Inserire il numero di elementi formanti l'array: ");
    	scanf("%d",&n);
    
    	/* ALLOCAZIONE DINAMICA DELLA MEMORIA */
    	if(!(A = (float *)malloc(n*sizeof(float))))
    	abort();
    
    	/* LETTURA ELEMENTI ARRAY */
    	printf("\n");
    	for (i=0; i<=n-1; i++){
    	printf("Inserire il valore dell'elemento %d: ", c=i+1);
    	scanf("%f", &A[i]);
    	}
    
    	/* NUMERO DA RICERCARE */
    	printf("\nInserire il numero che si desidera individuare: ");
    	scanf("%d", chiave);
    
    	bin_search(A, n, chiave, &logical);
    	printf("%d", logical);
    
    	free(A);
    }
    
    /****************** SPECIFICHE FUNZIONE *************************/
    void bin_search(float *A, int n, int chiave, int *ris)
    {
    int i, ordine;
    int alto, basso, centro, pos;
    
    	/* CONTROLLO ORDINE */
    	i = 0;
    	ordine = 1;
               while(ordine == 1 && i<=n-1){
    	      if(A[i] == A[i+1]-1)
    	        {ordine = 1;}
    	      else
    	        {ordine = 0;}
    	   i++;
    	}
    
    	/* SE L'ARRAY NON è ORDINATO ESCI */
    	if (ordine==0) {abort();}
    
    	/* RICERCA BINARIA */
    	alto = 0;
    	basso = n-1;
    	pos = -1;
    	do {
    	centro = (alto+basso)/2;
    	if (A[centro]==chiave)
    		{pos = chiave;}
    	else if (A[centro]<chiave)
    		{alto = chiave+1;}
    	else
    		{basso = chiave-1;}
    	}
    	while(alto<=basso && pos==-1);
    
    if(pos!= -1)
    	*ris = 1;
    else
    	*ris = 0;
    }
    è un pò che sono all'asciutto di C ma perchè usi una funzione che non è dichiarata?? :di56:

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175
    nessuno sà aiutarmi???
    per favore è importante è per l'esame di programmazione

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175

    Re: Re: [caccia all'errore] Core dumped

    Originariamente inviato da ringo_mato
    è un pò che sono all'asciutto di C ma perchè usi una funzione che non è dichiarata?? :di56:
    intendi dire perchè uso una void???

  5. #5

    Re: Re: Re: [caccia all'errore] Core dumped

    Originariamente inviato da Metallica
    intendi dire perchè uso una void???
    Fagianato alla grande fa niente..

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    167

    Re: [caccia all'errore] Core dumped

    Originariamente inviato da Metallica
    [B]Ho un file, questo sotto che si compila senza errori ma quando metto tutti i parametri alla fine mi dà un core dumped. Dov'è l'errore???



    L'ho guardato un po' velocemente, ma questa riga

    scanf("%d", chiave);

    ti dà chiaramente un errore.

    la devi correggere con:

    scanf("%d", &chiave);

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175
    grazie non l'avevo notato ma purtroppo è ancora core dumped

  8. #8
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Warning missing prototype for abort
    Includi stdlib.h. Mettila sempre insieme a stdio.h, sono le due librerie standard, praticamente gestiscono tutti le cose basilari


    Warning no type specified. Defaulting to int
    Te l'avrò detto 1249843286412 volte
    Il main() è lo dichiari void o devi mettere valore di ritorno.


    Warning possible usage of chiave before definition
    L'errore è nella dichiarazione della funzione:
    void bin_search(float *A, int n, int chiave, int *ris);
    Nella dichiarazione della funzione NON mettere i nomi, a lui serve solo sapere il tipo di dato. I nomi li metti nell'implementazione della funzione.

    All'esame nn devi fare nemmeno un warning! (ma il tuo compilatore nn te li segnala? Setta l'opzione -wall)
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Re: [caccia all'errore] Core dumped

    Originariamente inviato da Metallica
    Ho un file, questo sotto che si compila senza errori ma quando metto tutti i parametri alla fine mi dà un core dumped. Dov'è l'errore???
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    /* PROTOTIPO FUNZIONE */
    void bin_search(float *A, int n, int chiave, int *ris);
    
    /* PROGRAMMA CHIAMANTE*/
    main()
    {
    	/* DICHIARAZIONE VARIABILI */
    	float *A;
    	int i, c;
    	int n, chiave, logical;
    
    	/* LETTURA ELEMENTI ARRAY */
    	printf("Inserire il numero di elementi formanti l'array: ");
    	scanf("%d",&n);
    
    	/* ALLOCAZIONE DINAMICA DELLA MEMORIA */
    	if(!(A = (float *)malloc(n*sizeof(float))))
    	abort();
    
    	/* LETTURA ELEMENTI ARRAY */
    	printf("\n");
    	for (i=0; i<=n-1; i++){
    	printf("Inserire il valore dell'elemento %d: ", c=i+1);
    	scanf("%f", &A[i]);
    	}
    
    	/* NUMERO DA RICERCARE */
    	printf("\nInserire il numero che si desidera individuare: ");
    	scanf("%d", chiave);
    
    	bin_search(A, n, chiave, &logical);
    	printf("%d", logical);
    
    	free(A);
    }
    
    /****************** SPECIFICHE FUNZIONE *************************/
    void bin_search(float *A, int n, int chiave, int *ris)
    {
    int i, ordine;
    int alto, basso, centro, pos;
    
    	/* CONTROLLO ORDINE */
    	i = 0;
    	ordine = 1;
               while(ordine == 1 && i<=n-1){
    	      if(A[i] == A[i+1]-1)
    	        {ordine = 1;}
    	      else
    	        {ordine = 0;}
    	   i++;
    	}
    
    	/* SE L'ARRAY NON è ORDINATO ESCI */
    	if (ordine==0) {abort();}
    
    	/* RICERCA BINARIA */
    	alto = 0;
    	basso = n-1;
    	pos = -1;
    	do {
    	centro = (alto+basso)/2;
    	if (A[centro]==chiave)
    		{pos = chiave;}
    	else if (A[centro]<chiave)
    		{alto = chiave+1;}
    	else
    		{basso = chiave-1;}
    	}
    	while(alto<=basso && pos==-1);
    
    if(pos!= -1)
    	*ris = 1;
    else
    	*ris = 0;
    }
    Spero che infinitejustice ti abbia risposto... io non ho un compilatore C a disposizione in questo momento ma ho notato alcnue cose inutili. Le ho segnate in grassetto.

    Le prendo un considerazione:
    1) c = i+1: perchè assegnare il valore ad una variabile che non viene usata da nessuna parte, solo per stampare il valore dell'espressione (i+1)? --> printf("Inserire il valore dell'elemento %d: ", i+1);

    2) ordine = 1: perchè riassegnare ad ogni ciclo lo stesso valore, che già ha? Qui basta modificare un po' il controllo
    if(A[i] != A[i+1]-1) {
    ordine = 0;
    }

    3) if (ordine == 0) e tutte le volte che viene effettuato un confronto con lo 0. Questo è logico, dal punto di vista semantico, ma per quanto riguarda C (e anche C++) è inutile: in questi linguaggi il valore 0 è considerato per definizione FALSO e qualsiasi altro valore è VERO. Quindi si può modificare così:

    if (!ordine)

    Lo stesso vale per tutti i confronti con valori che possono essere o 0 o qualcos'altro: se si deve verificare che il valore di una variabile, sia per esempio -1 (ed il suo dominio è -1 e 0) basta effettuare questo controllo: if (variabile).

    Questi sono solo consigli, il tuo programma funziona lo stesso perfettamente senza queste modifiche.



    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    a sto punto facciamo cosi:
    codice:
    /*
    					Ricerca binaria
    Funzia su array ordinati precendentemente
    
    */
    void bin_search(const int a[], int first, int last, int target, bool& found, int& index)
    {
        int centro;
        if (first > last) 
        	found = false;
        else
        {
            centro = (first + last)/2;
            if (target == a[centro]) // META
    	  { 
    		found = true;
     		index = centro;
    	  }
    	  // PARTE SINISTRA
            else if (target < a[centro]) bin_search(a, first, centro - 1, target, found, index);
    	  // PARTE DESTRA 
            else if (target > a[centro]) bin_search(a, centro + 1, last, target, found, index);
            
        }
    }
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

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.