C - zapis mimo pamate ??

Programovacie jazyky, rady, poradňa...
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

C - zapis mimo pamate ??

Príspevok od používateľa njoko »

pada to lebo ze pisem do pamata kde nemam co robit, rsp na 000000atd

Kód: Vybrať všetko

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>

struct zavisle{
              char *ndruh;
              struct zavisle *dalsi;
              };

struct zviera{
       char *druh;
       int pocetz;
       struct zavisle *zav;//alebo sem?
       struct zviera * dalsie;
       };
       
zviera *vytvor(zviera *prve)		//vytvori prazdnu strukturu
{
    prve=(zviera *)malloc(sizeof(zviera));
    prve->dalsie=NULL;
    return prve;   
    
}
zavisle *vytvorz(zavisle *first)		//vytvori prazdny zoznam
{
    first=(zavisle *)malloc(sizeof(zavisle));
    first->dalsi=NULL;
    return first;   
    
}

int main(){         

    zviera *prve;
    zviera *akt;
    zavisle *first;
    zavisle *aktz;
    char str[1024];
    char  *pch;
    char  *pom;
    int i,g,e,j,f,max=0;
    int a=0;
    first=vytvorz(first);//vytvori sa sll 
    
    scanf("%d",&g);
    prve=vytvor(prve);//vytvori sa sll obsahujuci aj sll
    akt=prve;
    aktz=first;
    for(i=1;i<=g;i++)
    {                     
       
        getchar();
        gets(str);
      
        pch = strtok (str," ");
        strcpy(akt->druh,str);
        pch = strtok (NULL, " ");
        akt->pocetz=atoi(pch);
     
        e=atoi(pch);          
             for(j=1;j<=e;j++)
             { 
               pch=strtok(NULL," "); 
                     
               strcpy(aktz->ndruh,pch);
               aktz->dalsi=(zavisle *)malloc(sizeof(zavisle));  
               aktz=aktz->dalsi;             
             } 
             aktz->dalsi=NULL;
         akt->zav=aktz;// priradenie zoznamu do prvku nadzoznamu
         akt->dalsie=(zviera *)malloc(sizeof(zviera));
         akt=akt->dalsie;  
     }
     akt->dalsie=NULL;
     akt=prve;
     for(f=1;f<=g;f++)
     {          
                if(akt->pocetz>max)max=akt->pocetz;
                printf("POCET JE %d\n",akt->pocetz);
                printf("Druh je %s\n",akt->druh);  
                akt=akt->dalsie;                
     }
     printf("Max je %d\n",max);
     
     
     getchar();
return 0;
}
do vonkajsieho zoznamu to nacita ale potom ked ma do vnutorneho , teda sem

Kód: Vybrať všetko

strcpy(aktz->ndruh,pch);
tak to vyhodi hento....nerozumiem ved to mam vytvorene funkciou vytvorz a tam je aj ten prvy clen alokovany tak co sa tomu nepaci.....dakujem za pomoc
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Skus poslat nejaky priklad vstupnych udajov... :wink:
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

Príspevok od používateľa njoko »

trebars

godzilla 2 mys bocian
bocian 1 mys
mys 0

samozrejme sa to ma dalej spracovavat, ale tu som sa zasekol :(
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

No, tak nepouzivaj tam funkciu gets(), ale scanf(). gets() ti nacita cely riadok... :)
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

Príspevok od používateľa njoko »

a scanf nacita co? sak ja potrebujem cely riadok a potom ho rozdelujem (ten vstup este ma predtym na riadku nejake cislo, na henten konrenty je to 3)
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Predpokladam, ze riadok
godzilla 2 mys bocian
znamena, ze godzilla je zavisla na dvoch zvieratach, cize na mysi a bocianovi, spravne?
V tom pripade to skus riesit nasledovne

Kód: Vybrať všetko

scanf("%s", meno_zvierata);
scanf("%d", &pocet_zvierat_od_ktorych_je_zavisle);
zviera=(typ *)malloc(pocet_zvierat_od_ktorych_je_zavisle *sizeof(typ));
for (i=0; i<pocet_zvierat_od_ktorych_je_zavisle; i++)
scanf("%s", zviera[i]);
btw. prednedavnom som robil podobnu ulohu na jednu sutaz a riesil som to rekurziou, no moc do hlbky som tvoj zdrojak nestudoval, mozno ti to pojde aj bez nej. :)

//jj, mas pravdu scanf("%s", zviera);
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

Príspevok od používateľa njoko »

asi to malo byt

Kód: Vybrať všetko

scanf("%s", zviera[i]);
dakujem, skusim, akurat tie zvierata budem asi ukladat so sll a nie do pola

edit, no spravil som to takto :

Kód: Vybrať všetko

scanf("%s", akt->druh); 
        scanf("%d", &akt->pocetz); 
        aktz=(zavisle *)malloc(akt->pocetz *sizeof(zavisle));
        pocet=akt->pocetz; 
        for (i=0; i<pocet; i++)
        { 
          scanf("%s", aktz->ndruh);
          aktz=aktz->dalsi;
        }
        akt->dalsie=(zviera *)malloc(sizeof(zviera));
        akt=akt->dalsie;
akurat po zbehnuti sa to hned zavrie a mlo by este cakat na znak hmmm to bude asi inde zadrhel
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

To bude asi tym, ze v bufferi este daco zostalo, daj tam bud dvakrat getchar(), alebo system("pause");, alebo getch() z conio.h, alebo scanf()... Mas viacero moznosti... :D
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

Príspevok od používateľa njoko »

problemom je volba..
nefunguje....nejak to vykoumam
a sakra teraz mi to nejak neviem co...ked mam taky vstup ako som pisal tak taky vstup sa mi ani nepodari zadat lebo po zadani prveho riaku program skonci.... :(
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Posli komplet cely zdrojak...
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

Príspevok od používateľa njoko »

kod :

Kód: Vybrať všetko

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>

struct zavisle{
              char *ndruh;
              struct zavisle *dalsi;
              };

struct zviera{
       char *druh;
       int pocetz;
       struct zavisle *zav;//alebo sem?
       struct zviera * dalsie;
       };
       
zviera *vytvor(zviera *prve)		//vytvori prazdnu strukturu
{
    prve=(zviera *)malloc(sizeof(zviera));
    prve->dalsie=NULL;
    return prve;   
    
}
zavisle *vytvorz(zavisle *first)		//vytvori prazdny zoznam
{
    first=(zavisle *)malloc(sizeof(zavisle));
    first->dalsi=NULL;
    return first;   
    
}

int main(){         

    zviera *prve;
    zviera *akt;
    //zavisle *first;
    zavisle *aktz;
    char str[1024];
    char  *pch;
    char  *pom;
    int i,g,e,j,f,pocet,max=0;
    int a=0;
   //first=vytvorz(first);//vytvori sa sll 
    
    scanf("%d",&g);
    prve=vytvor(prve);//vytvori sa sll obsahujuci aj sll
    akt=prve;
    //aktz=first;
    for(i=1;i<=g;i++)
    {                     
       
        scanf("%s", akt->druh); 
        scanf("%d", &akt->pocetz); 
        aktz=(zavisle *)malloc(akt->pocetz *sizeof(zavisle));
        pocet=akt->pocetz; 
        for (i=0; i<pocet; i++)
        { 
          scanf("%s", aktz->ndruh);
          aktz=aktz->dalsi;
        }
        akt->dalsie=(zviera *)malloc(sizeof(zviera));
        akt=akt->dalsie;
        
        
     akt=prve;
     for(f=1;f<=g;f++)
     {          
                if(akt->pocetz>max)max=akt->pocetz;
                printf("POCET JE %d\n",akt->pocetz);
                printf("Druh je %s\n",akt->druh);  
                akt=akt->dalsie;                
     }
     printf("Max je %d\n",max);
     }
    // tu som skusal aj getchar aj system("wait") aj scanf
return 0;
}
addictor
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 419
Registrovaný: 28 dec 2007, 13:34
Bydlisko: MT / BA
Kontaktovať používateľa:

Príspevok od používateľa addictor »

skus pouzit debug... tam sa da pekne zistit, kde ti to tecie... :wink:
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

Príspevok od používateľa njoko »

nerozumiem...jediny sposob "debugu" ktory robievam(iny nejak hm) je cez pomocne vypisy, lenze ked sa to hned zavrie...
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

no tak pouzivaj IDE kde sa da aj krokovat zdrojak :roll:

len tak btw po zbeznom prezreti zdrojaku ... kde alokujes pamat napr pre ndruh, ktory pouzivas v tom strcpy(aktz->ndruh,pch); ?? (C som uz dlho nevidel tak mozno trepem ... a mozno nie)
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

Príspevok od používateľa njoko »

ved tu

Kód: Vybrať všetko

aktz=(zavisle *)malloc(akt->pocetz *sizeof(zavisle));
sa alokuje pre ten zoznam, a ndruh je v nom
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

no v nom je sice ndruh .. ale to je len pointer na char (= 4B) ukazujuci niekam
addictor
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 419
Registrovaný: 28 dec 2007, 13:34
Bydlisko: MT / BA
Kontaktovať používateľa:

Príspevok od používateľa addictor »

njoko napísal:nerozumiem...jediny sposob "debugu" ktory robievam(iny nejak hm) je cez pomocne vypisy, lenze ked sa to hned zavrie...
Ak pouzivas visualko (a predpokladam, ze si FIITkar druhal a toto potrebujes na DSA :wink: , ak ne, tak sme mali podobnu ulohu) tak ked das F5, spusti ti debug... na dalsi prikas sa posunies bud F10 alebo F11, v zavislosti od toho, ci sa chces aj vnorit do danej funkcie, alebo nou iba prejst... a tam ti v tabulke vypisuje pre zadane premenne, co je v nich ulozene a da sa pekne odsledovat, ako sa to meni... ono je to tazko takto vysvetlovat... snad si aspon trosicku pochopil...
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

Príspevok od používateľa njoko »

pouzivam dev-c++,ale mam aj visual , len nejak blbne, skusim ,dakujem
Napísať odpoveď