IT NEWS PC REVUE PC FORUM FreeBSDInternet time: @796
Obsah fóra
Pravidlá  •  Kontakt  •  Prihlásenie  •  Registrácia

Bežme spolu a pomôžme deťom.

Príďte si zabehnúť s ČSOB nadáciou 2.6. od 10tej na Partizánsku lúku v BA. www.csobnadacia.sk

Myslite ekologicky s Orangeom

Zapojte sa do súťaže Zeleň pre mesto a získajte viac stromov pre svoje okolie www.orange.sk

Absolvovali ste chemoterapiu?

DetoxiPan GOLD zmierni jej bočné účinnky Testovaný a patentovaný japonský produkt www.detoxipan.sk

Zablokovali sa Vám dvere?

Poistite svoj domov s UNIQA a my ich otvoríme zadarmo za Vás! www.uniqa.sk

Problémy s nadváhou?

Zistite viac o dosiahnutí ľahšej a zdravšej hmotnosti. www.janinblog.com

Program v c++ problém

Zaslať odpoveď
AutorSpráva
ochar
Užívateľ
Užívateľ

Založený: 18.10.2006
Príspevky: 19
Bydlisko: MA

PríspevokZaslal: Po 30.01.12 20:16Odpovedať s citátomNávrat hore

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
Zobraziť informácie o autoroviOdoslať súkromnú správu
majky358
Užívateľ
Užívateľ

Založený: 02.06.2008
Príspevky: 2697
Bydlisko: Žilina
Vek: 18

PríspevokZaslal: Po 30.01.12 20:27Odpovedať s citátomNávrat hore

kód ?

_________________
ASUS K50AB SX-010 | SteelSeries Mousepad | A4tech XL-750BF |
Zobraziť informácie o autoroviOdoslať súkromnú správuICQSkypeZobraziť autorove WWW stránky
ochar
Užívateľ
Užívateľ

Založený: 18.10.2006
Príspevky: 19
Bydlisko: MA

PríspevokZaslal: Po 30.01.12 20:29Odpovedať s citátomNávrat hore

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;
}
 
Zobraziť informácie o autoroviOdoslať súkromnú správu
walther
Užívateľ
Užívateľ

Založený: 24.01.2008
Príspevky: 10194
Bydlisko: Bratislava
Vek: 24

PríspevokZaslal: Po 30.01.12 20:37Odpovedať s citátomNávrat hore

To si robíš hádam srandu..
Zobraziť informácie o autoroviOdoslať súkromnú správu
majky358
Užívateľ
Užívateľ

Založený: 02.06.2008
Príspevky: 2697
Bydlisko: Žilina
Vek: 18

PríspevokZaslal: Po 30.01.12 21:30Odpovedať s citátomNávrat hore

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.

_________________
ASUS K50AB SX-010 | SteelSeries Mousepad | A4tech XL-750BF |
Zobraziť informácie o autoroviOdoslať súkromnú správuICQSkypeZobraziť autorove WWW stránky
dhino
Užívateľ
Užívateľ

Založený: 01.02.2012
Príspevky: 4

PríspevokZaslal: St 01.02.12 12:57Odpovedať s citátomNávrat hore

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"
Zobraziť informácie o autoroviOdoslať súkromnú správu
ochar
Užívateľ
Užívateľ

Založený: 18.10.2006
Príspevky: 19
Bydlisko: MA

PríspevokZaslal: St 01.02.12 20:13Odpovedať s citátomNávrat hore

​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?
Zobraziť informácie o autoroviOdoslať súkromnú správu
walther
Užívateľ
Užívateľ

Založený: 24.01.2008
Príspevky: 10194
Bydlisko: Bratislava
Vek: 24

PríspevokZaslal: St 01.02.12 21:02Odpovedať s citátomNávrat hore

Keby si si ten program odkrokoval ako som ti radil ja aj majky, už by si to mal dávno hotové........
Zobraziť informácie o autoroviOdoslať súkromnú správu
ochar
Užívateľ
Užívateľ

Založený: 18.10.2006
Príspevky: 19
Bydlisko: MA

PríspevokZaslal: Št 02.02.12 20:01Odpovedať s citátomNávrat hore

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
Zobraziť informácie o autoroviOdoslať súkromnú správu
Zobraziť príspevky z predchádzajúcich:    
Zaslať odpoveď
Nemôžete pridávať nové témy do tohto fóra.
Nemôžete odpovedať na témy v tomto fóre.
Nemôžete upravovať svoje príspevky v tomto fóre.
Nemôžete mazať svoje príspevky v tomto fóre.
Nemôžete hlasovať v tomto fóre.

Powered by phpBB 2.x.x © 2005 - 2012 PCforum, webhosting by WebSupport, edited by JanoF

SEO - optimalizácia pre vyhľadávače

Freebsd