[C] -- Problem s pristupem do pameti atd.

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod dimes 3. 1. 2006 19:52

Prosim pomozte mi s timhle: Pri kompilaci se ozve:

[dimes@localhost ~]$ gcc kontakty.c kontakty.c: In function ‘VlozKontakt’: kontakty.c:23: warning: incompatible implicit declaration of built-in function ‘exit’ kontakty.c: In function ‘TiskniKontakty’: kontakty.c:34: warning: passing argument 2 of ‘fread’ makes integer from pointer without a cast kontakty.c:35: warning: comparison between pointer and integer

Pri spusteni, po aplikaci TiskniKontakty se ozve:

Neoprávněný přístup do paměti (SIGSEGV)

Kód: Vybrat vše
#include <stdio.h>

typedef struct ko
{
   int cislo;
   char jmeno[150];
}kontakt;

int VlozKontakt(FILE *soubor)
   {
      kontakt neu;
      char name[10] = {"kniha.txt"};
      soubor = fopen(name, "a+t");
         puts("\nCislo:\n");
         scanf("%d\n", &neu.cislo);
         puts("\nJmeno dotycne osoby:\n");
         scanf("%s\n\n", &neu.jmeno);
         puts("\nOK. Vse ulozeno.\n");
         
      if(fseek(soubor, 0, SEEK_END) != 0)
         exit(1);
      if(fwrite(&neu, sizeof(kontakt), 1, soubor) != 0)
         return 0;
         fclose(soubor);
   }

void TiskniKontakty(FILE *soubor, kontakt *data)
   {
      
      char name2[10] = {"kniha.txt"};
      soubor = fopen(name2, "tr");
      fread(data, sizeof(soubor), 1, soubor);
      while(name2 == EOF)
         printf("\n%i      %s", data->cislo, data->jmeno);
      fclose(soubor);
   }

int main()
{
FILE *knizicka;
kontakt *neu5;
char vlozeni, tisk;
puts("\nPro vlozeni kontaktu stisknete V\n");
scanf("%c", &vlozeni);
   if(vlozeni == 'V' || vlozeni == 'v')
      VlozKontakt(knizicka);
puts("\nPro tisk vsech kontaktu stisknete T\n");
scanf("%c", &tisk);
   if(tisk == 'T' || tisk == 't')
      TiskniKontakty(knizicka, neu5);
return 0;
}

Sem linuxak.
dimes
Kolemjdoucí

Odeslat příspěvekod michich 3. 1. 2006 20:18

Kód: Vybrat vše
      soubor = fopen(name, "a+t");

Detail, ale co si slibujes od toho pismenka "t"? Mel by ti stacit normalni rezim "a".
Kód: Vybrat vše
         
      if(fseek(soubor, 0, SEEK_END) != 0)

Ten seek pak nepotrebujes.
Kód: Vybrat vše
      soubor = fopen(name2, "tr");
      fread(data, sizeof(soubor), 1, soubor);

Staci rezim "r". A u toho fread urcite nepatri sizeof(soubor), ale sizeof(kontakt)
Kód: Vybrat vše
      while(name2 == EOF)
         printf("\n%i      %s", data->cislo, data->jmeno);

Co je to za podminku, probuh? Nebude nikdy splnena.

Kód: Vybrat vše
int main()
{
FILE *knizicka;

Tuhle promennou nikdy neinicializujes a ten soubor si ty funkce stejne oteviraji samy, takze by ten parametr vubec nemusely mit.

Kód: Vybrat vše
kontakt *neu5;
...
      TiskniKontakty(knizicka, neu5);

Tohle bude zrejme pricina SIGSEGV. Tenhle pointer mas neinicializovany. Ve funkci TiskniKontakty pak zapises na nejake nahodne misto v pameti.
michich
Junior

Odeslat příspěvekod dingo 3. 1. 2006 20:19

Nefunguje ti to, protoze tam mas chyb jak maku...
Nejen, ze jsou funkce naprosto stupidne navrzene, ale prace s pameti je taky dost dechberouci...

Je videt, ze jsi zacatecnik - zacni priste s necim jednodussim...


Kód: Vybrat vše
    fread(data, sizeof(soubor), 1, soubor);
    while(name2 == EOF)
        printf("\n%i      %s", data->cislo, data->jmeno);

je uplne beznadejne spatne!! (typicke pouziti je sizeof(data) - tedy "data" by mela byt lokalni promenna (ne parametr funkce) a fread() bude bezet ve whileu.

No a i kdyby bylo dobre, porad jeste ve funkci main() nealokovals pamet pro promennou data (je to jen ukazatel a ukazuje nekam nahodne do pameti, ktera mu nepatri...)
SIGDEVu by ses (asi) vyhnul upravou radky radky
Kód: Vybrat vše
kontakt *neu5 = malloc( sizeof( kontakt));

Nicmene porad je implementace funkce TiskniKontakty naprosto spatne.
Jsem bezvýhradný ateista, až se bojím, že mě za to bůh potrestá...
--
澳洲野犬
dingo
Junior
Uživatelský avatar

Odeslat příspěvekod dimes 4. 1. 2006 20:44

dobra, diky za rady, asi se doopravdy pustim do neceho lehciho :lol:
Sem linuxak.
dimes
Kolemjdoucí


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků