Eroare "has stopped working" la executie
Last Updated: Sep 12 2015 19:38, Started by
raul1ro
, Sep 10 2015 22:47
·
0
#1
Posted 10 September 2015 - 22:47
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
Posted 11 September 2015 - 01:48
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
Posted 11 September 2015 - 09:43
Nu prea stiu cum sa fac asta.
P.S.: Incerc sa invat C |
#4
Posted 11 September 2015 - 11:42
Dacă nu știi să faci asta înseamnă că nu îți înțelegi nici codul pe care l-ai scris.
|
#5
Posted 11 September 2015 - 19:54
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
Posted 11 September 2015 - 22:55
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
Posted 12 September 2015 - 06:45
raul1ro, on 11 septembrie 2015 - 19:54, said:
Asta ai incercat sa imi explici? [ 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. OriginalCopy, 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
Posted 12 September 2015 - 18:10
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
Posted 12 September 2015 - 18:33
raul1ro, 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. 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? raul1ro, on 12 septembrie 2015 - 18:10, said:
Daca pun lungine_nume 0 tot imi functioneaza bine programul. De ce? |
#10
Posted 12 September 2015 - 19:19
#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
Posted 12 September 2015 - 19:38
Quote Ma puteti ajuta cu aceasta problema? |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users