Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
Autor | Správa |
---|
Registrovaný: 18.10.06 Prihlásený: 01.02.12 Príspevky: 19 Témy: 4 | 4 Bydlisko: MA |
Ahojte,
potrebujem radu. Mám program spraveny v c++ na manipuláciu kontaktov. no pri spustení v MVS vypíše chybu: Unhandled exception at 0x01245870 in zadanie.exe: 0xC0000005: Access violation writing location 0x00000000.
keď ho spustím ako exe súbor tak zasa windovs vypíše: program prestal pracovať.
problém bude v databazovom súbore data.txt, pretože ak je prazdny tak to funguje. Akonáhle však súbor naplním údajmi, vyhadzuje tieto chyby.
viete v čom môže byť problém?
ďakujem
|
|
Registrovaný: 02.06.08 Prihlásený: 19.07.16 Príspevky: 3325 Témy: 147 | 147 Bydlisko: Žilina / Os... |
kód ?
_________________ PC - ASUS M2N-MX Se+ | AMD X2 4200+ | 2GB RAM | Nvidia 8600GT | WD 320GB | 350W |NTB - ASUS K50AB SX-010 | | ASUS X550L | SteelSeries Mousepad | A4tech XL-750BF | HTC Explorer | CCNA (640-802) | |
|
Registrovaný: 18.10.06 Prihlásený: 01.02.12 Príspevky: 19 Témy: 4 | 4 Bydlisko: MA |
Kód: #include "stdafx.h" #include <cstdlib> #include <iostream> #include <conio.h>
typedef struct clovek{ char meno[10]; char priezv[12]; char narod[15]; char mesto[15]; int exist; //Urcuje ci kontakt je ulozeny. }clovek; clovek *p; // Pointer na zaciatok pola struktur. FILE *f; // Pointer na vystupny subor; FILE *r; // Pointer na vstupny subor int poc; // Urcuje rozsah pola struktur. int uloz=0; // Urcujuce kolko kontaktov je ulozenych. int zac=1;
/******************************************************************************/ /*Zoznam uplnych fukncnych prototypov funkcii: */ void menu(); //Funckia pre vykreslovanie menu void reset(); //Funkcia pre alokovanie a resetovanie pamate void pridaj(); //Pridavanie kontaktov do pamate void uprav(); //Upravvanie kontaktov void pis_obr(); //Zobrazenie kontaktov na obrazovku void pis_sub(); //Vystup do suboru void najdi(); //Hladanie kontaktu- menu hladania void vymaz(); //Vymazanie kontaktu - podla priezviska void utried_m(); //Utriedi kontakty - podla priezviska void p_mena(); //Vyhlada podla krstneho mena void p_priezv(); //Vyhlada podla priezviska void p_narod(); //Vyhlada podla void poriadok(); //Presunutie zaznamov tesne vedla seba, //aby neboli rozhadzane v poli. void kontrola(); void vymena(clovek *,clovek *); void txt_citaj(); void tlac_zdroj();
/******************************************************************************/
using namespace std;
int main(int argc, char *argv[]) { reset(); // vytvorime pole struktur (default 100) txt_citaj(); // Nacitame kontakty zo suboru. menu(); tlac_zdroj(); //Vytlacime kontakty do suboru z ktoreho budeme neskor citat return EXIT_SUCCESS; }
void reset() { system("cls"); if(zac==0) { printf("Kolko pamatovach miest chcete vytvorit?: "); scanf("%d",&poc); } else { poc=100; zac=0; } if((p=(clovek*) malloc(sizeof(clovek)*poc))==NULL){ printf("\nChyba pri vytvarani zoznamu!\n"); system("pause"); reset(); } else{ for(int i=0;i<poc;i++){ p[i].exist=0; } uloz=0; printf("\nZoznam bol uspesne vytvoreny\n"); system("pause"); return; } }
void menu() { char volba; do{ system("color 2E"); system("cls"); printf("\t *************** Program Zoznam osob *************\n\n\n\n"); printf("\t1. Pridat kontakt.\n"); printf("\t2. Upravit kontakt.\n"); printf("\t3. Zmazat kontakt.\n"); printf("\t4. Vypisat kontakty na obrazovku.\n"); printf("\t5. Vypisat kontakty do suboru.\n"); printf("\t6. Vyhladat kontakt.\n"); printf("\t7. Nacitat kontakty zo suboru.\n"); printf("\t8. Resetovat pamat.\n\n"); printf("\t9. Koniec programu.\n\n\n"); printf("Ulozenych kontaktov: %d Volna pamat: %d Celkova pamat: %d\n\n\n",uloz,(poc-uloz),poc); printf("\t\tVasa volba: "); fflush(stdin); volba=getch(); //Osetrenie vstupu. Ak volbe nieje ziadna z moznosti menu prirad jej hodnotu 0. To znamena ze sa vypise chybova hlaska. if (!(volba=='1' || volba=='2' || volba=='3' || volba=='4' || volba=='5' || volba=='6' || volba=='7' || volba=='8' || volba=='9')) volba='0'; switch (volba){ case '0': system("cls"); system("color 04"); printf("\nZadali ste chybnu volbu\n\n"); system("pause"); break; case '1': pridaj(); break; case '2': uprav(); break; case '3': vymaz(); poriadok(); break; case '4': pis_obr(); break; case '5': pis_sub(); break; case '6': najdi(); break; case '7': txt_citaj(); break; case '8': free(p); p=NULL; reset(); break; case 'k': kontrola(); break; } if(volba=='1' || volba=='2' || volba=='3' || volba=='7')utried_m(); }while(volba!='9'); }
void pridaj() { int i=0; int hotovo=1; //Ukazuje ci kontakt uz bol ulozeny alebo nie. system("cls"); //Otestovanie volnej pamate, ak je malo miesta navrat do menu. if(uloz==poc){ fprintf(stdout,"Nie je volna pamat\n"); system("pause"); return; } /*Cyklus precesava pole zaznamov. Ak najde pradzne miesto a zaroven este nebol kontakt ulozeny (hotovo=1), takt od uzivately nacita udaje. */ while(i<=poc){ if(p[i].exist==0 && hotovo){ hotovo=0; uloz++; p[i].exist=1; puts("Meno: "); gets(p[i].meno); puts("Priezvisko: "); gets(p[i].priezv); puts("Datum narodenia: "); gets(p[i].narod); puts("Mesto: "); gets(p[i].mesto); } i++; } printf("\nKontakt bol ulozeny.\n\n"); system("pause"); return; }
void pis_obr() { int i=0; int vypis=0; //Premenna ukazuje kolko kontaktov bolo vypisanych na obrazovku int prazdny=1; //Overenie ci mame ulozene nejake kontakty. system("cls"); for(i=0;i<poc;i++){ if(p[i].exist==1){ //Narazili sme na kontakt. prazdny=0; //Mame teda nieco ulozene, tak to vypiseme. printf("Priezvisko: %s\n",p[i].priezv); printf("Meno: %s\n",p[i].meno); printf("Datum narodenia: %s\n",p[i].narod); printf("Mesto: %s\n",p[i].mesto); printf("\n\n"); vypis++; //Inkrementujeme pocitadlo. if(vypis==3){ //Ak pocitadlo je rovne 3. vypis=0; //Vynulujeme ho. system("pause"); //A odpauzujeme. system("cls"); //Vycistíme. } } } if(prazdny==1){ //Ak pocas cyklu nenarazime na ziadny kontakt printf("\nZoznam je prazdny!\n"); //Prazdny sa teda stale rovna 0 } system("pause"); return; }
void pis_sub() { int prazdny=1; //Overenie ci mame ulozene nejake kontakty, predpokladame ze ziadne. if((f=fopen("zoznam.txt","w"))==NULL){ //Test otvarania suboru printf("Chyba pri otvarani suboru, nie je mozne zapisovat na disk!\n"); return; } for(int i=0;i<poc;i++){ if(p[i].exist==1){ //Rovnaky cyklus ako pri vystupe na obrazovku. prazdny=0; fprintf(f,"Priezvisko: %s\n",p[i].priezv); fprintf(f,"Meno: %s\n",p[i].meno); fprintf(f,"Datum narodenia: %s\n",p[i].narod); fprintf(f,"Mesto: %s\n",p[i].mesto); fprintf(f,"\n\n"); } } if(prazdny==1){ printf("\nZoznam je prazdny!\n"); system("pause"); } else{ printf("Zoznam bol uspesne vytlaceny\n\n"); system("pause"); } fclose(f); //Zatvorime subor. return; } void uprav() { char priezv[10]; int i=0; int j=0; int najdeny=0; int prazdny=0; system("cls"); for(i=0;i<poc;i++){ if(p[i].exist){ prazdny=1; } } if(prazdny==0){ printf("\nZoznam je prazdny!\n"); system("pause"); return; }
printf("\nZadajte meno kontaktu, ktory chcete upravit: \nPoz: upravi posledny vyhovujuci kontakt!\n"); scanf("%s",&priezv); for(i=0;i<poc;i++){ if(strcmp(p[i].priezv,priezv)==0){ j=i; najdeny=1; } } if(najdeny){ prazdny=1; printf("\nKontakt najdeny, mozete zadavat nove udaje:\n "); printf("\nMeno: "); scanf("%s",p[j].meno); printf("\nPriezvisko: "); scanf("%s",p[j].priezv); printf("\nDatum narodenia: "); scanf("%s",p[j].narod); printf("\nMesto: "); scanf("%s",p[j].mesto); system("pause"); return; } else{ printf("\nKontakt nebol najdeny\n"); system("pause"); return; } }
void najdi() { char vol; system("cls"); int prazdny=0; if(uloz==0) { system("cls"); printf("Zoznam je prazdny\n"); system("pause"); return; } printf("\nPodla akeho kluca chcete vyhladavat?\n"); printf("1. Podla krstneho mena.\n"); printf("2. Podla priezviska.\n"); printf("3. Podla datumu narodenia.\n"); printf("4. Navrat do menu.\n\n"); printf("\tVasa volba: "); scanf("%d",&vol); switch (vol){ case 1: p_mena(); break; case 2: p_priezv(); break; case 3: p_narod(); break; case 4: return; break; } }
void p_mena() { char meno[10]; int i; int najdeny=0;
printf("\nZadajte krstne meno kontaktu, ktory chcete najst: "); scanf("%s",&meno); for(i=0;i<poc;i++){ if(strcmp(p[i].meno,meno)==0){ najdeny=1; printf("Meno: %s\n",p[i].meno); printf("Priezvisko: %s\n",p[i].priezv); printf("Datum narodenia: %s\n",p[i].narod); printf("Mesto: %s\n",p[i].mesto); printf("\n\n"); } }
if(najdeny==0){ printf("\nKontakt nebol najdeny\n"); system("pause"); return; } system("pause"); return; }
void p_priezv() { char priezv[15]; int i; int najdeny=0;
printf("\nZadajte priezvisko kontaktu, ktory chcete najst: "); scanf("%s",&priezv); for(i=0;i<poc;i++){ if(strcmp(p[i].priezv,priezv)==0){ najdeny=1; printf("Meno: %s\n",p[i].meno); printf("Priezvisko: %s\n",p[i].priezv); printf("Datum narodenia: %s\n",p[i].narod); printf("Mesto: %s\n",p[i].mesto); printf("\n\n"); } }
if(najdeny==0){ printf("\nKontakt nebol najdeny\n"); system("pause"); return; } system("pause"); return; }
void p_narod() { char narod[15]; int i; int najdeny=0;
printf("\nZadajte datum narod kontaktu, ktory chcete najst: "); scanf("%s",&narod); for(i=0;i<poc;i++){ if(strcmp(p[i].narod,narod)==0){ najdeny=1; printf("Meno: %s\n",p[i].meno); printf("Priezvisko: %s\n",p[i].priezv); printf("Datum narod: %s\n",p[i].narod); printf("Mesto: %s\n",p[i].mesto); printf("\n\n"); } }
if(najdeny==0){ printf("\nKontakt nebol najdeny\n"); system("pause"); return; } system("pause"); return; }
void vymaz() { int i; char priezv[12]; int prazdny=0; int najdeny=0; for(int j=0;j<poc;j++){ if(p[j].exist){ prazdny=1; } } if(prazdny==0){ printf("\nZoznam je prazdny!\n"); system("pause"); return; }
printf("Zadajte priezvisko kontaktu, ktory chcete vymazat: "); scanf("%s",priezv); for(i=0;i<poc;i++) { if(strcmp(p[i].priezv,priezv)==0) { najdeny=1; break; } } if(najdeny) { p[i].exist=0; uloz--; printf("Kontakt bol uspene vymazany.\n"); } else printf("Kontakt nebol najdeny\n"); system("pause"); return; }
void vymena(clovek *x, clovek *y) { clovek pom; pom=*x; *x=*y; *y=pom; return; }
void utried_m() { int i=0; int j=0; do{ j=i; if(p[j].exist==1 && p[j+1].exist==1){ while(j>=0 && strcmp(p[j].priezv,p[j+1].priezv)==1){ vymena(&p[j],&p[j+1]); j--; } if(strcmp(p[j].priezv,p[j+1].priezv)==0 && strcmp(p[j].meno,p[j+1].meno)==1) { vymena(&p[j],&p[j+1]); } } i++; }while(i<=poc); return; }
void poriadok() { int i=0; int presun=0; do{ if(p[i].exist==0 && p[i+1].exist==1){ p[i]=p[i+1]; p[i+1].exist=0; presun==1; } else presun=0; i++; }while(i<=poc); } void kontrola() { system("cls"); printf("Kontrolný vypis\n\n"); for(int i=0;i<poc;i++) { printf("%d\n",p[i].exist); } system("pause"); return; }
void tlac_zdroj() { system("cls"); int prazdny=1; // predpokladame ze zoznam je prazdny if(uloz==0){system("pause"); return;}
if((r=fopen("data.txt","w"))==NULL){ //otvorime subor pre pisanie a overime jeho otvorenie printf("Chyba pri otvarani suboru\n"); system("pause"); return; } else{ //Ak bol subor uspesne otvoreny zacneme do neho zapisovat. //fprintf(r,"%d\n",uloz); for(int i=0;i<poc;i++){ //Prejdeme celym polom a zapiseme existujuce zaznamy. if(p[i].exist==1){ fprintf(r,"%s %s %s %s %s %s\n",p[i].meno,p[i].priezv,p[i].narod,p[i].mesto); } }
return; } fclose(r); } void txt_citaj() { system("cls"); int poc0; int i=0; int znak; if((r=fopen("data.txt","r"))==NULL){ //Overime otvorenie suboru pre citanie. printf("Chyba pri otvarani suboru!!\n"); system("pause"); return; } while(!feof(r)){ //Citame zo suboru pokial neprideme na jeho koniec. while(p[i].exist==1){ //Najdeme si najblizsiu volnu poziciu v poli. i++; } //A ulozime do nej kontakt fscanf(r,"%s %s %s %s %s %s\n",p[i].meno,p[i].priezv,p[i].narod,p[i].mesto); p[i].exist=1; uloz++; if(poc==uloz) { p=(clovek*) realloc(p,100*sizeof(clovek)); poc+=100; if(p==NULL) { reset(); return; } } i++; } fclose(r); printf("Zoznam bol uspesne nacitany\n"); system("pause"); return; } int _tmain(int argc, _TCHAR* argv[]) { return 0; }
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 | 66 Bydlisko: Žilina |
To si robíš hádam srandu..
_________________ C#, PHP, ... |
|
Registrovaný: 02.06.08 Prihlásený: 19.07.16 Príspevky: 3325 Témy: 147 | 147 Bydlisko: Žilina / Os... |
hlada_sa_chyba()
Skús to skompilovať v niečom inom, devko alebo niečo pod. iný kompilátor... Prípadne skús "odkrokovať" cez debug a hľadať problém tak.
_________________ PC - ASUS M2N-MX Se+ | AMD X2 4200+ | 2GB RAM | Nvidia 8600GT | WD 320GB | 350W |NTB - ASUS K50AB SX-010 | | ASUS X550L | SteelSeries Mousepad | A4tech XL-750BF | HTC Explorer | CCNA (640-802) | |
|
Registrovaný: 01.02.12 Prihlásený: 23.02.12 Príspevky: 4 Témy: 0 | 0 |
c++ nie je moja domena, ale tak skusim...
1. V txt_citaj sa v slucke while zvysuje premenna i v rozmedzi "0 < i < velkost suboru"
2. Vo vnutornej while slucke kontrolujes hodnotu "p[i].exist"
problem je v tom ze, velkost pola "p" mas rezervovanu pre pocet zaznamov a nie pre velkost suboru,
co v dosledku znamena ze sa snazis citat z oblasti pamete, ktora programu nemusi patrit ....
riesenie:
vo vnutornej while slucke zvysuj "i" o velkost zaznamu ( sizeof(clovek) ) a nie o "1"
|
|
Registrovaný: 18.10.06 Prihlásený: 01.02.12 Príspevky: 19 Témy: 4 | 4 Bydlisko: MA |
Dakujem za odpoved no nejako nechápem čo tam mám konkrétne zmeniť aby to nerobilo. Mohol by si mi to prosim ťa napisať ako mam zmeniť tú čast kodu?
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 | 66 Bydlisko: Žilina |
Keby si si ten program odkrokoval ako som ti radil ja aj majky, už by si to mal dávno hotové........
_________________ C#, PHP, ... |
|
Registrovaný: 18.10.06 Prihlásený: 01.02.12 Príspevky: 19 Témy: 4 | 4 Bydlisko: MA |
neviem či už som mimo ale skúšal som to krokovať a stále mi to padá na tom istom probléme.
vždy ma to zastaví tu:
int main(int argc, char *argv[])
{
reset(); // vytvorime pole struktur (default 100)
txt_citaj(); // Nacitame kontakty zo suboru.
no nerozumiem prečo?
// pridané po 22 hodinách 40 minútach od posledného príspevku
Už to ide. Problem bol vo funkcii fscanf.
Ďakujem
|
|
Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Assembler, C, C++, Pascal, Java | 12 | 706 | 23.05.2016 13:17 tyrenus | | v Assembler, C, C++, Pascal, Java | 2 | 872 | 12.03.2009 12:08 Svjatogor | | v Assembler, C, C++, Pascal, Java | 1 | 421 | 20.03.2015 22:36 walther | | v Assembler, C, C++, Pascal, Java | 4 | 624 | 27.09.2012 16:15 marian_r | | v Assembler, C, C++, Pascal, Java | 13 | 783 | 25.03.2017 11:21 mitko | | v Assembler, C, C++, Pascal, Java | 1 | 879 | 11.05.2008 8:23 sento | | v Assembler, C, C++, Pascal, Java | 19 | 1151 | 11.09.2010 20:57 jawakiller | | v Assembler, C, C++, Pascal, Java | 2 | 603 | 16.05.2008 16:51 Cruel | | v Assembler, C, C++, Pascal, Java | 2 | 1331 | 06.12.2006 20:44 rebecca | | v Assembler, C, C++, Pascal, Java | 24 | 1649 | 31.08.2010 22:02 ado21 | | v Assembler, C, C++, Pascal, Java | 2 | 562 | 07.06.2012 21:57 Hipi21 | | v Assembler, C, C++, Pascal, Java | 23 | 1190 | 28.05.2009 14:02 reDo | | v Assembler, C, C++, Pascal, Java | 0 | 773 | 19.04.2007 17:28 pecko | | v Assembler, C, C++, Pascal, Java | 7 | 775 | 23.05.2008 16:21 poma | | v Assembler, C, C++, Pascal, Java | 1 | 328 | 05.11.2013 16:00 Ďuri | | v Assembler, C, C++, Pascal, Java | 2 | 725 | 12.09.2011 19:39 mk* |
|