LINUXSOFT.cz
Nazwa użytkownika: Hasło:     
    CZ UK PL

> Komentarze :: Poradna Prosim poradte

Prosim poradte 29.4.2007 12:04
Tomáš Eichler

Mame za ukol udelat program v c,zadani je takove

Zadání
Napište funkci v jazyce C zjišťující počet výskytů slov. Funkce bude volána opakovaně, pro každé slovo jednou.

Odevzdávejte soubor obsahující výhradně definici jediné funkce pojmenované a deklarované dle zadání. Soubor nesmí obsahovat direktivu #include. Veškeré potřebné datové typy apod. deklarujte lokálně.

Deklarace funkce
void *Pocitej_Slova(char *, void *);

Je-li hodnota prvního argumentu NULL, označuje konec zpracovávání. V opačném případě je zde uloženo další slovo ke zpracování.
Hodnota druhého argumentu je při prvním volání funkce NULL, při kazdém následujícím volání je vždy rovna návratové hodnotě funkce z předchozího volání (nápověda: tento argument je určen pro předávání interního stavu funkce mezi jednotlivými voláními).
Návratová hodnota při posledním volání funkce je ukazatel na dvourozměrné pole takové, že v prvním řádku jsou jednotlivá slova podle abecedy a ve druhém řádku jejich četnosti. Poslední hodnotou v prvním řádku musí být NULL a ve druhém 0.
Příklad
void *p;

p=Pocitej_Slova("nazdar",NULL);
p=Pocitej_Slova("ahoj",p);
p=Pocitej_Slova("cau",p);
p=Pocitej_Slova("nazdar",p);
p=Pocitej_Slova(NULL,p);

printf("\"%s\" %d\n",((char **)(((void **)p)[0]))[2],((int *)(((void **)p)[1]))[2]);
/*
Vypise:
"nazdar" 2
*/

Naprogramoval sem to takhle:
[code]
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

void *Pocitej_Slova(char *slovo, void *data)
{ char ** p, **dt;
int i,len;
if(!slovo)return data;
if(!data)
{ data=malloc(2*sizeof(char*));
memset(data,0, 2*sizeof(char*));
}
p=(char **)data;
for(len=0; p[len];len++);

for(i=0;i<len;i+=2)
{ if(0==strcmp(p[i], slovo))
{ (*((int*)p[i+1]))++;
return data;
}
if(strcmp(slovo, p[i]) < 0)break;
}

dt=(char**)malloc((len+4)*sizeof(char*));
memset(dt,0,(len+4)*sizeof(char*));
if(i > 0) memcpy(dt,p,i*sizeof(char*));
if( i < len+2)memcpy(dt+i+2,p+i,(len+2-i)*sizeof(char*));
dt[i]=strdup(slovo);
dt[i+1]=(char*)malloc(sizeof(int));
*((int*)dt[i+1])=1;
free(data);
return dt;
}
int main(int argc, char* argv[])
{
void *p;
int i;
p=Pocitej_Slova("nazdar",NULL);
p=Pocitej_Slova("ahoj",p);
p=Pocitej_Slova("cau",p);
p=Pocitej_Slova("nazdar",p);
p=Pocitej_Slova("ahoj",p);
p=Pocitej_Slova(NULL,p);

for(i=0;((char **)p)[i];i+=2)
{
printf("\"%s\" %d\n",((char **)p)[i],*(((int **)p)[i+1]));
}
system ("PAUSE");
return 0;
}
[/code]
V dev c,se mi to normalne vyhodnoti spravne.Ale kdyz to posilam na ucitelovy stranky pres automat,kde se posila jen samostatna funkce bez int main a includ(v tom automatu se to samo na to doplni)tak se mi to nepreloyi,napise se mi protokol s timhle>

cc1: warnings being treated as errors
test.c: In function 'Pocitej_Slova':
test.c:33: warning: implicit declaration of function 'strdup'
test.c:33: warning: assignment makes pointer from integer without a cast
--- gcc-4.0 --- ! Chyba
cc1: warnings being treated as errors
test.c: In function `Pocitej_Slova':
test.c:33: warning: implicit declaration of function `strdup'
test.c:33: warning: assignment makes pointer from integer without a cast
--- gcc-2.95 --- ! Chyba

nevite prosim vas nekdo co s tim

Re: Prosim poradte 29.4.2007 19:29
Aleš Hakl

Odhadoval bych to na to, ze strdup(3) je POSIXovina, ktera ve standardnim ISO C neni.

Re: Prosim poradte 29.4.2007 19:41
Tomáš Eichler

Takze co bys mi radil abych udelal,mam ten program prekopat,nebo neco jinyho,ja ted nevim,bych ten program chtel nechat tak jak je,se me to nechce prave nejak predelavat

Re: Prosim poradte 29.4.2007 20:15
Aleš Hakl

Odstranit z toho programu to prave jedno volani strdup(3) je jiste obrovsky problem.

Re: Prosim poradte 29.4.2007 21:08
Tomáš Eichler

No to je,nevim jak to mam udelat ,aby to tim automatem proslo.

Re: Prosim poradte 30.4.2007 10:25
Tomáš Eichler

Ai mas ale pravdu ze to neni ve standartu c.me poradili ze pry se to da sestavit pomoci strlen, malloc, a memcpy,ale to teda nevim jak

Re: Prosim poradte 1.5.2007 18:27
Daniel Kozák

strdup nevim co presne to dela, ale alspon te zkusim nakopnout. strlen vraci delklu retezce, malloc alokuje prostor v pameti dle potreby, a memcpy kopiruje obsah pameti. jinak si ty funkce proste fej vyhledat googlem a vyhodi ti to jejich pouziti.


KOMENTARZE
Prosim poradte 29.4.2007 12:04 Tomáš Eichler
  L Re: Prosim poradte 29.4.2007 19:29 Aleš Hakl
    L Re: Prosim poradte 29.4.2007 19:41 Tomáš Eichler
      L Re: Prosim poradte 29.4.2007 20:15 Aleš Hakl
        L Re: Prosim poradte 29.4.2007 21:08 Tomáš Eichler
          L Re: Prosim poradte 30.4.2007 10:25 Tomáš Eichler
            L Re: Prosim poradte 1.5.2007 18:27 Daniel Kozák
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
> Szukanie oprogramowania
1. Pacman linux
Download: 4851x
2. FreeBSD
Download: 9044x
3. PCLinuxOS-2010
Download: 8541x
4. alcolix
Download: 10916x
5. Onebase Linux
Download: 9631x
6. Novell Linux Desktop
Download: 0x
7. KateOS
Download: 6219x

1. xinetd
Download: 2383x
2. RDGS
Download: 937x
3. spkg
Download: 4693x
4. LinPacker
Download: 9918x
5. VFU File Manager
Download: 3173x
6. LeftHand Mała Księgowość
Download: 7171x
7. MISU pyFotoResize
Download: 2776x
8. Lefthand CRM
Download: 3540x
9. MetadataExtractor
Download: 0x
10. RCP100
Download: 3089x
11. Predaj softveru
Download: 0x
12. MSH Free Autoresponder
Download: 0x
©Pavel Kysilka - 2003-2024 | mailatlinuxsoft.cz | Design: www.megadesign.cz