Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 6 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 10.02.10
Prihlásený: 21.08.17
Príspevky: 67
Témy: 15
Bydlisko: Bratislava ...
Príspevok NapísalOffline : 16.11.2012 17:05

Zdravim mam jeden problem a uz mi z neho sibe pomaly.

Kód:
vstupc[10000];

nacitam udaj do stacickeho stringu
Kód:
fgets(vstupc,10000,stdin);


no potom mam strukturu

Kód:
struct Node
            {
            char *udaj;
            };


Kód:
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
Dostanem udaj tak node->udaj = (char*) malloc(strlen(vstupc)*sizeof(char));


Potom dostanem dalsi udaj, a chcem ho pridat k tomu, co tam uz je.
Skusal som to takto
Kód:
node->udaj=realloc(node->udaj, ((strlen(node->udaj)+strlen(vstupc))* sizeof(char)));
sprintf(node->udaj, "%s%s", node->udaj, vstupc);


Zda sa, ze to aj funguje hocijake znaky, cisla medzeri vsetko funguje, ale ako nahle, dam prvy udaj 7 miestny string a nasledne chcem k nemu pridat hocijaky dlhy udaj, tak to padne.

Ale ked to debugujem tak vsetko funguje, zapise sa kam ma, vsetko sa prida tam kde ma. Uz som ztoho jelen. Dakujem, za rady.







_________________
AMD Ryzen R7 1700X, B350, 16GB Ram, 270x
Online

Skúsený užívateľ
Skúsený užívateľ
realloc

Registrovaný: 11.01.09
Prihlásený: 29.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOnline : 16.11.2012 18:38

Mozes poslat viac kodu? Aspon v tej casti, kde nacitavas string a alokujes ( nech je to suvisle, aby sme vedeli posudit, ci je problem tam ).







_________________
Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS.
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 10.02.10
Prihlásený: 21.08.17
Príspevky: 67
Témy: 15
Bydlisko: Bratislava ...
Príspevok Napísal autor témyOffline : 16.11.2012 19:08

Kód:
while(scanf("%s",&prikaz)==1){
    temp = strcmp( prikaz, "save" );
    if (temp==0){
     fgets(vstupc,70,stdin); //udaj                                       
     root = insert(root,vstupn,vstupc+1);
     }
}


Kód:
struct Node* insert(struct Node* node, char *data, char *datas)
{
  if (node == NULL)
    return(newNode(data,datas));
  else
  {
   
    int porovnaj = strcmp( data, node->data );
    if (porovnaj < 0)     
***                                     
    {     
         
    }
    else if (porovnaj > 0)
    {
       ***
    }else if (porovnaj == 0)
    { 
      //Uz som to skusal aj takto obklukou, ale rovnakz vzsledok ako realloc
       copy= (char*) malloc(strlen(node->udaj)*sizeof(char));
       strcpy(copy,node->udaj);
       node->udaj=NULL;
       node->udaj = (char*) malloc((strlen(copy)+strlen(datas)+1)*sizeof(char));
       sprintf(node->udaj, "%s%s", copy, datas);
    }
    return node;
  }


struct Node* newNode(char *data,char *datas)
{
  struct Node* node = (struct Node*) malloc(sizeof(struct Node));
 
  node->udaj = (char*) malloc(strlen(datas)*sizeof(char));
 
   ****
  strcpy(node->udaj,datas);                //udaje
  ****
  return(node);
}


udaj v strukture staticky tak to ide vpohode. Padne to vzdy tam niekde ako sa tam pridava nova hodnota ked tam uz nejaka je, ale len ak prva bola 7 miesta :D, co absolutne nechapem.







_________________
AMD Ryzen R7 1700X, B350, 16GB Ram, 270x
Online

Skúsený užívateľ
Skúsený užívateľ
realloc

Registrovaný: 11.01.09
Prihlásený: 29.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOnline : 18.11.2012 10:17

Podla tohto kodu ti neviem povedat, kde je problem. Zrejme ti ostava len viac siahnut na debugger a tam poriadne krokovat program a hlavne sledovat, kde to padne, na ktorom riadku. Zistit si hodnoty premennych a zistit, preco to padlo.







_________________
Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS.
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 18.11.2012 11:17

Padá to teda na tomto kuse kódu, áno?
Kód:
//Uz som to skusal aj takto obklukou, ale rovnakz vzsledok ako realloc
copy= (char*) malloc(strlen(node->udaj)*sizeof(char));
strcpy(copy,node->udaj);
node->udaj=NULL;
node->udaj = (char*) malloc((strlen(copy)+strlen(datas)+1)*sizeof(char));
sprintf(node->udaj, "%s%s", copy, datas);


Skúsim teda len hádať. Copy ukazuje na pamäť o veľkosti strlen(node->udaj), takže tam nie je miesto pre ukončovaciu nulu. A to môže byť veľký problém.
node->udaj neuvoľňuješ funckiou free = memleaky jak sviňa a tie vedia často zariadiť nepredvídateľné chovanie.
Ak by si poslal celý spustiteľný kód, ľahšie by sa radilo.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Online

Skúsený užívateľ
Skúsený užívateľ
realloc

Registrovaný: 11.01.09
Prihlásený: 29.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOnline : 18.11.2012 11:52

BX píše:
Ak by si poslal celý spustiteľný kód, ľahšie by sa radilo.

JJ, tiez som spominal, ale mozno ide o nejaky projekt do skoly, tak to tu asi nechce supnut cele.







_________________
Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS.
Odpovedať na tému [ Príspevkov: 6 ] 


Nemôžete zakladať nové témy v tomto fóre
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

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra