Newsgroup: it.comp.lang.c
Titolo: errore strano in una lista

la compilazione va a buona fine
provo a eseguire il programma (di sicuro poco corretto) ecco cosa mi dà
bash-2.05b$ ./18.1
Inserisci il primo elemento:
4
Inserisci elementi successivi:
5
Inserisci elementi successivi:
7
Inserisci elementi successivi:
0
Inconsistency detected by ld.so: dl-fini.c: 50: _dl_fini: Assertion 
`_rtld_local._dl_nloaded > 0' failed!
ma cos'è questo errore?
questo è il sorgente
#include <stdio.h>
#include <stdlib.h>
struct hello {
	int inf;
	struct hello *next;
};
struct hello *creaLista(int ins);
main()
{
	int ins;
	struct hello *p, *paus;
	struct hello *listaPtr;
 
	printf("Inserisci il primo elemento:\n");
	scanf("%d", &ins);
 
	/* Caso primo elemento */
	if(ins == 0)
		p = NULL;
	else {
		listaPtr = creaLista(ins);
		paus = p;
		/* Caso altri elementi */
		do {
			printf("Inserisci elementi successivi:\n");
			scanf("%d", &ins);
			listaPtr = creaLista(ins);
		} while (ins != 0);
		paus->next = NULL;
	}
}
struct hello *creaLista(ins) {
	struct hello *p, *paus;
	int size;
	if (!p) {
	struct hello *p;
	size = sizeof(struct hello);
	p = (struct hello*)malloc(size);
	p->inf = ins;
	p->next = NULL;
	} else {
	size = sizeof(struct hello);
	paus = (struct hello*)malloc(size);
	paus->inf = ins;
	paus = paus->next;
	return p;
	}
}

 [snip]
Google e`  tuo amico  ;) Cmq,  in linea puramente  teorica e  sorgente a
parte, non parrebbe essere colpa tua.
Venendo  al sorgente  ho  cercato di  toccarlo  il meno  possibile. Solo
alcune note sul main:
- dichiara il main come "int main(void)"
- perche` p = NULL se il primo numero inserito e` zero?
- potevi  gestire  meglio  l'inserimento dei  dati;  ad  *esempio*  una
  soluzione semplice  poteva essere  (non ho  toccato questa parte):
  printf("Inserisci il primo elemento:\n");
  while (scanf("%d", &ins) == 1 && ins)
  {
    /*  do  something  */
    printf("Inserisci elementi successivi:\n");
  }
  Questo ti eviterebbe di dover  diversificare i vari casi (primo elemento
  e successivi) mantendo comunque un messaggio diverso a video.
- non  ho ben  capito che  cosa volessi fare  ... ho  ipotizzato volessi
  creare una lista linkata di interi (non ordinata).
- non liberi mai l'eventuale memoria allocata
Ed alcune note sulla funzione creaLista:
- dichiara esplicitamente il tipo di ins
- esegui un controllo su p che non e` inizializzato
- cosa ritorni se p e` NULL?
- size e` uguale in entrambi i casi
- non ti servono p e paus (o meglio ... cosa volevi fare?)
- nell'else esegui operazioni su paus ma ritorni p
Siccome  la funzione  era  davvero  poco chiara,  e  siccome ritorna  un
puntatore ad  un elmento dalla  lista ma  prende come parametro  solo il
numero da inserire (e non anche  un puntatore alla lista corrente) e non
utilizzi variabili globali (cmq  quel prototipo sarebbe stato ridondante
comunque) ho  ipotizzato che  quella funzione  volesse creare  *solo* il
nuovo nodo della lista e l'inserimento volesse essere fatto nel main.
#include <stdio.h>
#include <stdlib.h>
struct hello
{
  int inf;
  struct hello *next;
};
struct hello *creaLista(int ins);
int main(void)
{
  int ins;
  struct hello *p = NULL;
# ifndef __LIFO_LIST__
  struct hello *paus = NULL;
#endif
  struct hello *listaPtr = NULL;
 
  printf("Inserisci il primo elemento:\n");
  scanf("%d", &ins);
 
  /* Caso primo elemento */
  if(ins == 0)
    /* qui puoi ritornare subito */
    return 0;
 
  else
  {
    /* Caso altri elementi */
    do
    {
      listaPtr = creaLista(ins);
 
      if (!p)
        p = listaPtr;
 
      else
      {
#ifndef __LIFO_LIST__
        /* attraversa tutta la lista; inserimento in coda */
        for(paus = p; paus->next != NULL; paus = paus->next);
 
        paus->next = listaPtr;
#else
        /* inserimento in testa */
        listaPtr->next = p;
        p = listaPtr;
#endif
      }
 
      printf("Inserisci elementi successivi:\n");
      scanf("%d", &ins);
    }
    while (ins != 0);
  }
 
  /* considera l'idea di liberare la memoria allocata */
  return 0;
}
struct hello *creaLista(int ins)
{
  struct hello *p = NULL;
 
  /* controlla il valore di ritorno di malloc */
  p = malloc(sizeof(struct hello));
  p->inf = ins;
  p->next = NULL;
 
  return p;
}
Se  compili questo  codice  senza definire  __LIFO_LIST__ gli  eventuali
inserimenti  verranno fatti  in coda,  altrimenti in  testa; se  volessi
provare  anche un  inserimento in  testa  puoi provare  a compilare,  ad
esempio, con:
gcc -D__LIFO_LIST__ -W -Wall -pedantic -pedantic-errors -ansi es.c
Ciao.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it