Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Poligon auto București

nelamurire legata de pret la mode...

Hotel cu restaurant si Demipensiu...

Croaziera in Mediterana de Vest 1...
 Copilot are pica pe Vladimir Putin

MicroSoft Edge: Cum pun Google in...

Dashcam

Mini server - VMware
 betano.ro

Poveste fara sfarșit

I-auziti voi! - nu vor romani...

Colon iritabil
 Perioada de gratie inexistenta

Cel mai ieftin TV LED mic

Reverse proxy si htaccess pe Raps...

Statie de epurare sau fosa septic...
 

Eroare "has stopped working" la executie

- - - - -
  • This topic is locked This topic is locked
10 replies to this topic

#1
raul1ro

raul1ro

    Member

  • Grup: Members
  • Posts: 591
  • Înscris: 17.02.2011
Am scris acest cod si ii dau compilare si rulare. Toate bune pana aicea. Cand introduc un sir de caractere primesc eroarea "... has stopped working". Ce nu este in regula?
#include <stdio.h>
#include <stdlib.h>
typedef struct lista{
char* nume;
int puncte;
struct lista* next;
}nod;
int main()
{
nod *p;
p=(nod*)malloc(sizeof(nod));
scanf("%s", p->nume);
printf("%s", p->nume);
}



#2
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Ai alocat un bloc de memorie pe care il referentiezi cu p.

Bun.

Un sir de caractere e si el un bloc de memorie (cuvantul "sir" spune multe), deci si lui trebuie sa ii aloci un bloc de memorie.

Blocul de memorie identificat de p contine urmatoarele date: o adresa (char*), un intreg (int) si inca o adresa (struct lista*).

Deci stringul citit nu are unde sa aiba loc in acest bloc, C nu face nimic automat pentru tine.

Deci trebuie sa aloci un nou bloc de memorie (suficient de mare), si sa salvezi adresa sa de start in locatia de memorie a lui char* din primul bloc de memorie.

Apoi poti purcede cu citirea de date in acest al doilea bloc de memorie. Biblioteca standard va copia cu acel apel la scanf datele venite de la driverul tastaturii in acest al doilea bloc de memorie.

Edited by OriginalCopy, 11 September 2015 - 01:48.


#3
raul1ro

raul1ro

    Member

  • Grup: Members
  • Posts: 591
  • Înscris: 17.02.2011
Nu prea stiu cum sa fac asta.

P.S.: Incerc sa invat C

#4
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Dacă nu știi să faci asta înseamnă că nu îți înțelegi nici codul pe care l-ai scris.

#5
raul1ro

raul1ro

    Member

  • Grup: Members
  • Posts: 591
  • Înscris: 17.02.2011
Asta ai incercat sa imi explici?
#include <stdio.h>
#include <stdlib.h>
typedef struct lista{
char* nume;
int puncte;
struct lista* next;
}nod;
int main(){
char nume;
nod *p,*first=0;
p=(nod*)malloc(sizeof(nod));
scanf("%s", &nume);
p->nume=nume;
first=p;
printf("%s", &first->nume);
//si asa mai departe cu next...//
}

Daca da, acuma functioneaza pe jumatate. Daca introduc un singur caracter merge bine, daca introduc un sir de caractere primesc "stopped working"

P.S.: E greseala mea, normal ca citeste doar un caracter daca am creat "char nume". Cum pot sa fac sa pun informatia direct in pointer?

Edited by raul1ro, 11 September 2015 - 19:57.


#6
EnachescuAlin

EnachescuAlin

    Active Member

  • Grup: Members
  • Posts: 1,008
  • Înscris: 08.07.2013
Pentru ca tu ai declarat char nume, care inseamna un caracter. Daca declari char name[20] atunci o sa mearga cum vrei tu pentru ca acum name inseamna un sir de caracter care poate avea maxim 20 de caractere.

Dar uite cum as face eu ce ai facut tu acolo.
#include <stdio.h>
#include <stdlib.h>

#define LUNGIME_NUME 20

typedef struct lista {
	char *nume;
	int puncte;
	struct lista *next;
} nod;

nod* creazaNod()
{
	nod *p = (nod*) malloc(sizeof(nod));

	p->nume = (char*) malloc(LUNGIME_NUME);
	p->puncte = 0;
	p->next = NULL;

	return p;
}

int main()
{
	nod *p = creazaNod(), *first = NULL;

	scanf("%s", p->nume);

	first = p;
	printf("%s\n", first->nume);
}



#7
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postraul1ro, on 11 septembrie 2015 - 19:54, said:

Asta ai incercat sa imi explici?
Nu am incercat, eu chiar ti-am spus fix ce ai de facut. In imagini, uite corespondenta 1:1 intre ce am scris eu, si linia de cod scrisa de EnachescuAlin mai sus:

[ https://i.imgur.com/2SI3eJL.png - Pentru incarcare in pagina (embed) Click aici ]


Voi elevii nu aveti probleme de informatica, ci de reading comprehension in limba romana.

Mai lasati calculatoarele si mai cititi niste carti. Literatura.

View PostOriginalCopy, on 11 septembrie 2015 - 01:48, said:

Deci trebuie sa aloci un nou bloc de memorie (suficient de mare), si sa salvezi adresa sa de start in locatia de memorie a lui char* din primul bloc de memorie.

Linia aceea de cod nu contine nicio notiune pe care nu ai sti-o, pentru ca ai demonstrat ca stii toate aceste lucruri despre care am scris prin scrierea codului din postarea #1.

#8
raul1ro

raul1ro

    Member

  • Grup: Members
  • Posts: 591
  • Înscris: 17.02.2011
La mine intervine problema ca nu prea inteleg functia malloc. Stiu doar ca aloca memorie dar cum o folosesc nu prea stiu. La cursuri nu prea intelegeam ce zicea profesorul, iar la laborator vinea tipu cu un program facut si noi doar sa adaugam alte functii.

P.S.: Si eu ma intreb cum am reusit sa trec examenul.


Daca pun lungine_nume 0 tot imi functioneaza bine programul. De ce?

Edited by raul1ro, 12 September 2015 - 18:23.


#9
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postraul1ro, on 12 septembrie 2015 - 18:10, said:

La mine intervine problema ca nu prea inteleg functia malloc. Stiu doar ca aloca memorie dar cum o folosesc nu prea stiu.
Utilizatorul poate sa introduca dinamic date, tu nu stii in momentul in care scrii programul cate date va introduce, ci doar decizi ce fel de date va introduce si ce vei face cu ele.

Tu ai decis ca datele vor fi un sir de caractere care reprezinta un nume.

Pentru aceasta situatie, sistemul de operare iti pune la dispozitie o zona din RAM numita heap. Tu ii spui sistemului de operare "da-mi x bytes din heap", si el iti da, daca are la dispozitie atat.

Iti da adresa de memorie la care incepe blocul de memorie de marime x pe care tu i l-ai cerut.

Ce faci apoi cu acel bloc e problema ta. Dar e blocul tau de memorie, deci poti salva ce vrei in el.

In cazul tau, vrei sa copiezi in acel bloc numele introdus de utilizator, cu functia scanf.

Adresa de start a blocului o tii minte in variabila careia ii atribui valoarea returnata de malloc.

Deci, ce nu intelegi?

View Postraul1ro, on 12 septembrie 2015 - 18:10, said:

Daca pun lungine_nume 0 tot imi functioneaza bine programul. De ce?
De noroc.

#10
raul1ro

raul1ro

    Member

  • Grup: Members
  • Posts: 591
  • Înscris: 17.02.2011
#include <stdio.h>
#include <stdlib.h>
typedef struct lista{
	char* nume;
	int puncte;
	struct lista* next;
}nod;
nod* creazaNod()
{
	nod *p = (nod*) malloc(sizeof(nod));
	p->nume = (char*) malloc(15);
	p->puncte = 0;
	p->next = NULL;
	return p;
}
int main(){
	int puncte;
	printf("Introduceti numarul maxim de puncte ");
	scanf("%d",&puncte);
	int i;
	nod *p, *first=NULL, *last=NULL;
	p=creazaNod();
	for(i=0; i<4; i++){
		scanf("%s",p->nume);
		p->puncte = puncte;
		if(!first){
			first = p;
			last = p;
		}
		else{
			p->next = NULL;
			last->next = p;
			last = p;
		}
		printf("%s - %d\n",first->nume,first->puncte);
	}
	p = first;
	while(p){
		printf("%s - %d\n",p->nume,p->puncte);
		p = p->next;
	}
	return 1;
}


In momentul in care creez lista in for adresa first se modifica la fiecare repetitie a for-ului si preia ultimele informatii introduse si se pierde tot ce a fost inainte.
Cand intra in while, programul se executa pana creapa si imi afiseaza aceeasi chestie, ultimele date introduse.

Ma puteti ajuta cu aceasta problema?

#11
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

Quote

Ma puteti ajuta cu aceasta problema?
Da, deschide un topic regulamentar si vei primi ajutor.

Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate