Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Rad1m 01. 04. 2014, 20:26:37
-
Ahoj,
muze mi nekdo poradit, proc mi nefunguje funkce sorts a pritom funguje insback? Jde mi o to, ze v sorts kompletne preskocim while loop, zatimco v insback to funguje spravne. Uz do toho koukam snad hodinu a nevidim chybu.
Diky.
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// maximum length for a word
#define LENGTH 45
// default dictionary
#define DICTIONARY "words.txt"
typedef struct node
{
char word[LENGTH + 1];
struct node* next;
}
Word;
Word *head = NULL;
/****************************************/
/* PROTOTYPES */
/****************************************/
Word* sorts(char *node);
Word* insback(char *node);
void create(char *node);
void display();
void freememory();
/****************************************/
/* FUNCTIONS */
/****************************************/
void create(char *node)
{
Word *new_node = NULL;
new_node=(Word*)malloc(sizeof(Word));
if(head==NULL)
{
printf ("Creating list\n");
new_node->next=NULL;
head=new_node;
printf ("List created\n");
}
}
//Insert sorted after the word
Word* sorts(char *node)
{
Word *temp1;
temp1 = (Word*)malloc(sizeof(Word));
temp1 = head;
while(temp1->next!=NULL)
{
printf ("looping\n");
Word *curr;
curr = (Word*)malloc(sizeof(Word));
strncpy(curr->word, node, LENGTH);
if (strcmp(curr->word, temp1->word) >0 )
{
printf ("adding word\n");
curr->next = NULL;
temp1->next = curr;
}
temp1 = temp1->next;
}
return head;
}
//Insert from back
Word* insback(char *node)
{
Word *temp1;
temp1 = (Word*)malloc(sizeof(Word));
temp1 = head;
while(temp1->next!=NULL)
{
temp1 = temp1->next;
}
Word *curr;
curr = (Word*)malloc(sizeof(Word));
strncpy(curr->word, node, LENGTH);
curr->next = NULL;
temp1->next = curr;
return head;
}
// output the list
void display()
{
Word *Wordlist;
Wordlist = head;
while (Wordlist != NULL)
{
printf("%s->", Wordlist->word);
Wordlist = Wordlist->next;
}
printf("End of the list!\n");
}
// free allocated memory
void freememory()
{
Word *freenode = NULL;
Word *curr = NULL;
freenode = head;
while(freenode != NULL)
{
curr = freenode;
freenode = freenode->next;
free(freenode->word);
free(curr);
}
}
/****************************************/
/* M A I N */
/****************************************/
int main()
{
system("clear");
char data[LENGTH];
int count = 0;
FILE* file = fopen(DICTIONARY, "r");
printf ("Opening file\n");
// check successfull opening of the file
if(file == NULL) {
perror("Error opening file");
return -1;
}
create(NULL);
//read data (words) from file
while(fscanf (file, "%s", data) == 1)
{
count++;
insback(data);
}
//insfront("Start");
printf ("%d words read\n", count);
display();
freememory();
fclose(file);
return 0;
}
-
temp1 = (Word*)malloc(sizeof(Word));
temp1 = head;
Určitě nebude dělat to, co chcete.
-
zacházíš blbě s pamětí a máš smůlu, že to nepadá
==2249== Memcheck, a memory error detector
==2249== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==2249== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==2249== Command: ./a.out
==2249==
==2249== Conditional jump or move depends on uninitialised value(s)
==2249== at 0x4E6E88D: vfprintf (vfprintf.c:1617)
==2249== by 0x4E75A59: printf (printf.c:35)
==2249== by 0x4009C9: display (main.c:102)
==2249== by 0x400AF5: main (main.c:153)
==2249==
==2249== Invalid read of size 8
==2249== at 0x400A1A: freememory (main.c:117)
==2249== by 0x400AFF: main (main.c:154)
==2249== Address 0x518b3f0 is 48 bytes inside a block of size 56 free'd
==2249== at 0x4C240FD: free (vg_replace_malloc.c:366)
==2249== by 0x400A2D: freememory (main.c:118)
==2249== by 0x400AFF: main (main.c:154)
==2249==
==2249== Invalid free() / delete / delete[]
==2249== at 0x4C240FD: free (vg_replace_malloc.c:366)
==2249== by 0x400A39: freememory (main.c:119)
==2249== by 0x400AFF: main (main.c:154)
==2249== Address 0x518b3c0 is 0 bytes inside a block of size 56 free'd
==2249== at 0x4C240FD: free (vg_replace_malloc.c:366)
==2249== by 0x400A2D: freememory (main.c:118)
==2249== by 0x400AFF: main (main.c:154)
==2249==
==2249==
==2249== HEAP SUMMARY:
==2249== in use at exit: 392 bytes in 7 blocks
==2249== total heap usage: 16 allocs, 16 frees, 1,408 bytes allocated
==2249==
==2249== LEAK SUMMARY:
==2249== definitely lost: 392 bytes in 7 blocks
==2249== indirectly lost: 0 bytes in 0 blocks
==2249== possibly lost: 0 bytes in 0 blocks
==2249== still reachable: 0 bytes in 0 blocks
==2249== suppressed: 0 bytes in 0 blocks
==2249== Rerun with --leak-check=full to see details of leaked memory
-
void create(char *node)
{
Word *new_node = NULL;
new_node=(Word*)malloc(sizeof(Word));
if(head==NULL)
{
printf ("Creating list\n");
new_node->next=NULL;
head=new_node;
printf ("List created\n");
}
}
Pokud to správně chápu, tak budeš mít nepěkný memory leak když tudle funkci zavoláš a head nebude NULL.
-
Jinak, proč to nezkusit udělat v C++? Díky RAII se ti nestane výše zmíněná chyba pokud použiješ chytré pointery (nebo spíš, vyváží tvou nepozornost). http://www.cplusplus.com/reference/memory/shared_ptr/.
-
void create(char *node)
{
Word *new_node = NULL;
new_node=(Word*)malloc(sizeof(Word));
if(head==NULL)
{
printf ("Creating list\n");
new_node->next=NULL;
head=new_node;
printf ("List created\n");
}
}
Pokud to správně chápu, tak budeš mít nepěkný memory leak když tudle funkci zavoláš a head nebude NULL.
jde o kurz CS50, ktery delam na edx.org, ted je tam ukol v C. Na memory leak se urcite taky podivam a zkusim to vyladit, az tomu budu vice rozumet. To, co mi vrta hlavou je, ze obe funkce sorts a insback zacinaji uplne stejne, volam je stejne sorts(data) nebo insback(data) a pro insback funguje while loop a pro sorts to nefunguje.
-
jde o kurz CS50, ktery delam na edx.org, ted je tam ukol v C. Na memory leak se urcite taky podivam a zkusim to vyladit, az tomu budu vice rozumet. To, co mi vrta hlavou je, ze obe funkce sorts a insback zacinaji uplne stejne, volam je stejne sorts(data) nebo insback(data) a pro insback funguje while loop a pro sorts to nefunguje.
V tom kódu jsou mraky chyb. Jen ty hlavní logické:
1) ve while smyčce chybí break, když se tam přidá prvek (potom už není potřeba nic dál procházet)
2) do curr->next se nemá přiřazovat NULL ale temp1->next
-
Ta angličtina je taky bomba, třeba "successfull" nebo "length for a word", to jsou fakt perly! ;D
-
Sám jsi perla, length se běžně používá:
http://www.cplusplus.com/reference/string/string/length/
a word má v tom kontextu taky smysl.
-
Sám jsi perla, length se běžně používá:
http://www.cplusplus.com/reference/string/string/length/
a word má v tom kontextu taky smysl.
Jak je na té odkazované stránce vidět, tak se length váže s of ;)
-
Jak je na té odkazované stránce vidět, tak se length váže s of ;)
To vím a přijde mi to úplně nepodstatné. V každém projektu, na kterém se podílejí lidi z celého světa se v komentářích najdou mnohem horší prohřešky proti správné angličtině a nikdo to neřeší.
-
Ta angličtina je taky bomba, třeba "successfull" nebo "length for a word", to jsou fakt perly! ;D
chlape najdi si pritelkyni a mozna i nejake kamarady, pak se ti mozna zvedne sebevedomi a nebudes si muset neco dokazovat na internetu
-
Sám jsi perla, length se běžně používá:
http://www.cplusplus.com/reference/string/string/length/
a word má v tom kontextu taky smysl.
Jak je na té odkazované stránce vidět, tak se length váže s of ;)
"for a word" je gramaticky naprosto v poradku, jde o to, co chcete rict. Tim ovsem nepopiram, ze tam nemam preklepy. Nicmene diskuze je mimo tema, skoro to vypada, ze se nekteri nikdy neucili programovat a hned to umeli od narozeni a nepotrebovali od nikoho poradit.
Diky tem, co maji komentare k veci. Prekopal jsem kod a uz to funguje o neco lepe.