Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 31-08-2012, 08:34   #1
Dhavamba
Junior Member
 
Iscritto dal: Sep 2008
Messaggi: 15
[C] Segmentation fault (core dumped)

Salve ho un problema in questo codice, l'errore è:
Segmentation fault (core dumped)

Metto solo un pezzo del codice perchè l'errore l'ho individuato e si trova nella stringa:

scanf("\n%c",&item);

Però non capisco il motivo visto che il metodo richiede quei parametri, perchè l'esecuzione mi dà questo errore???



Codice:
#include <stdio.h>
#include <stdlib.h>

struct listNode {
	char data;
	struct listNode *nextPtr;
	};
	
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;

void insert (ListNodePtr*sPtr, char value);
char delete (ListNodePtr*sPtr, char value);
int isEmpty (ListNodePtr sPtr);
void printList(ListNodePtr currentPtr);
void instruction(void);

int main()
{
	ListNodePtr startPtr = NULL;
	int choice;
	char item;
	
	
	instruction();
	printf("? ");
	scanf("%d", &choice);
	
	while(choice != 3) {
		switch(choice) 
		{
			case 1:
			printf("Enter a character: ");
			scanf("\n%c",&item);
			insert(&startPtr, item);
			printList(startPtr);
			break;
......

comunque, non sò se può servire, ecco il sorgente completo

Codice:

#include <stdio.h>
#include <stdlib.h>

struct listNode {
	char data;
	struct listNode *nextPtr;
	};
	
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;

void insert (ListNodePtr*sPtr, char value);
char delete (ListNodePtr*sPtr, char value);
int isEmpty (ListNodePtr sPtr);
void printList(ListNodePtr currentPtr);
void instruction(void);

int main()
{
	ListNodePtr startPtr = NULL;
	int choice;
	char item;
	
	
	instruction();
	printf("? ");
	scanf("%d", &choice);
	
	while(choice != 3) {
		switch(choice) 
		{
			case 1:
			printf("Enter a character: ");
			scanf("\n%c",&item);
			insert(&startPtr, item);
			printList(startPtr);
			break;
			
			case 2:
			if ( !isEmpty( startPtr ) ) {
				printf("Enter character to be deleted: ");
				scanf("\n%c",&item);
				if (delete(&startPtr, item)) {
					printf("%c deleted.\n",item);
					printList(startPtr); }
				else {
					printf("%c not found.\n\n", item); }
				}
			else printf("List is empty.\n\n");
			
			break;
			
			default:
			printf("invalid choice.\n\n");
			instruction();
			break;
		}
		printf("?");
		scanf("%d", &choice);
	}
	
	printf("End of Run.\n");
	return 0;
}

void instruction(void)
{
	printf("Enter your choice:\n"
	       "1 to insert an element into the list.\n"
	       "2 to delete an element from the list.\n"
	       "3 to end.\n");
}

void insert(ListNodePtr *sPtr, char value)
{
	ListNodePtr newPtr;
	ListNodePtr previousPtr;
	ListNodePtr currentPtr;
	
	newPtr = malloc(sizeof(ListNode));
	
	if ( newPtr != NULL) {
		newPtr->data = value;
		newPtr->nextPtr = NULL;
		currentPtr = *sPtr;
		
		while (currentPtr != NULL && value > currentPtr->data) {
			previousPtr = currentPtr;
			currentPtr = currentPtr->nextPtr;
		}
		if ( previousPtr == NULL) {
			newPtr->nextPtr = currentPtr; }
			else {
				previousPtr->nextPtr = currentPtr;
				newPtr->nextPtr = currentPtr; }
				}
	else printf("%c not inserted.No memory available.\n",value);
}

char delete(ListNodePtr *sPtr, char value) 
{
	ListNodePtr tempPtr;
	ListNodePtr previousPtr;
	ListNodePtr currentPtr;
	
	if(value == (*sPtr)->data) {
		tempPtr = *sPtr;
		*sPtr = (*sPtr)->nextPtr;
		free(tempPtr);
		return value; }
	else {
		previousPtr = *sPtr;
		currentPtr = (*sPtr)->nextPtr;
		while (currentPtr != NULL && currentPtr->data != value) {
			previousPtr = currentPtr;
			currentPtr = currentPtr->nextPtr; }
			if (currentPtr != NULL) {
				tempPtr = currentPtr;
				previousPtr->nextPtr = currentPtr->nextPtr;
				free(tempPtr);
				return value; }
			}
	return '\0';
}

int isEmpty(ListNodePtr sPtr)
{
	return sPtr == NULL;
}

void printList(ListNodePtr currentPtr) 
{
	if (currentPtr == NULL) printf("List is Empty.\n\n");
	else {
		printf("The list is:\n");
		while(currentPtr != NULL) {
			printf("%c --> ", currentPtr->data);
			currentPtr = currentPtr->nextPtr; }
		printf("NULL.\n\n");
	}
}

Ultima modifica di Dhavamba : 31-08-2012 alle 08:38.
Dhavamba è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2012, 13:10   #2
__ZERO_UNO__
Member
 
L'Avatar di __ZERO_UNO__
 
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
Ho provato a compilare con GCC e funziona (non proprio, l'inserimento non funziona correttamente). Comunque, ti consiglio di provare a mettere le parentesi per ogni case. Quindi

Codice:
switch (...) {
  case 1: {

  }
  case 2: {

  } 

 ...
}
__________________

AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB
Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX
Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 03-09-2012, 05:21   #3
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
No, l'errore non e' li', ma nell'inserimento seguente: nella insert() cerchi di scandire la lista per cercare l'ultimo elemento ed appendere in coda.
Il ciclo while non verra' quindi mai eseguito; come risultato non assegni alcun valore alla variabile previousPtr, salvo poi utilizzarla. E questo fa arrabbiare il computer

Ovviamente la soluzione e' semplice, basta inizializzare previousPtr a NULL prima del ciclo

Codice:
void insert(ListNodePtr *sPtr, char value)
{
	ListNodePtr newPtr;
	ListNodePtr previousPtr;
	ListNodePtr currentPtr;
	
	newPtr = (ListNodePtr)malloc(sizeof(ListNode));	// MEGI add cast
	
	if ( newPtr != NULL) {
		newPtr->data = value;
		newPtr->nextPtr = NULL;
		currentPtr = *sPtr;
		
                /* A lista vuota non entri qui! */
		while (currentPtr != NULL && value > currentPtr->data) {
			previousPtr = currentPtr;
			currentPtr = currentPtr->nextPtr;
		}
                /* quindi, qui previousPtr non ha alcun valore *.
		if ( previousPtr == NULL) {
			newPtr->nextPtr = currentPtr; }
			else {
				previousPtr->nextPtr = currentPtr;
				newPtr->nextPtr = currentPtr; }
				}
	else printf("%c not inserted.No memory available.\n",value);
}
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La prima missione orbitale del razzo spa...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v