Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoc oko moje male funkcije :D

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pomoc oko moje male funkcije :D

[ Pregleda: 2193 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nibble

Član broj: 63173
Poruke: 302
*.dlp128.bih.net.ba.



+1 Profil

icon Pomoc oko moje male funkcije :D01.05.2006. u 18:23 - pre 218 meseci
Pocetnik sam u C-u i interesuje me da li sam dobro napisao ovu funkciju.
Meni ona radi kako treba ali mi izbacuje warning "C4172: returning address of local variable or temporary".
Znam da je zbog povratne vrijednosti upozorenje pa se pitam moze li se ova funkcija prepraviti da ne bude nikakvih upozorenja.

Evo funcije

Code:


int cNick(char str[16])
{
    char nick[16] = {0};
    short i,j;

    i = 0;
    j = 1;
    
    while(str[j] != '!')
    {
        nick[i] = str[j];

        i++;j++;
    }

    return (int)nick;
}

 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: Pomoc oko moje male funkcije :D01.05.2006. u 18:44 - pre 218 meseci
I
Code:
    // ...
    i = (short)nick;

    return (int)i;
}


II
Code:
int cNick(char str[16])
{
    static char nick[16] = {0};
    //...

Ali cemu sluzi ta f-ja? Mozda to sto ona radi i nije bas ono sto zelis da radi.
Ipak se ++uje.
 
Odgovor na temu

Nibble

Član broj: 63173
Poruke: 302
*.dlp466.bih.net.ba.



+1 Profil

icon Re: Pomoc oko moje male funkcije :D01.05.2006. u 23:11 - pre 218 meseci
Pravim irc bota i ta mi funkcija sluzi za odvajanje nicka(nadimka) od hosta.
Npr. ako imam :[email protected] znaci da izdvoji kao nick Test jer je nick sve do znaka "!".
Hvala ti na pomoci Misha!
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: Pomoc oko moje male funkcije :D02.05.2006. u 07:15 - pre 218 meseci
Aha, warning dobijas jer je nick niz koji regularno postoji samo za vreme izvrsavanja funkcije. Kada se funkcija zavrsi, memorija koju je taj niz zauzimao biva oslobodjena i dostupna bilo cemu sto bi zelelo da je koristi, tako da se moze desiti da dobijes malko pobrkane rezultate s vremena na vreme ako npr. prvo na ovaj nacin odredis nick, pa potom jos nesto preradjujes itd. pa probas da koristis. Koriscenjem static postizes to da niz postoji i nakon zavrsetka funkcije, tj. u toku rada celog programa, te bi to bilo jedno od resenja. Ima jos.

Nemas potrebe da na pocetku punis ceo niz nullovima. Upisi samo jedan na kraju. Vidi attachment.

Nije mi samo jasno zasto funkcija cita str[16] od 1-vog a ne od 0-tog znaka te ako to nije slucajno, oslobodi komentarisani str++.
Ipak se ++uje.
Prikačeni fajlovi
 
Odgovor na temu

Nibble

Član broj: 63173
Poruke: 302
*.dlp64.bih.net.ba.



+1 Profil

icon Re: Pomoc oko moje male funkcije :D02.05.2006. u 08:50 - pre 218 meseci
Code:
Nije mi samo jasno zasto funkcija cita str[16] od 1-vog a ne od 0-tog znaka te ako to nije slucajno, oslobodi komentarisani str++. 

Zato sto u nick nespada prvi karakter ":" jer kad imamo :[email protected] nick je Test.

Hvala ti puno Misha na pomoci funkcija besprijekorno radi.
 
Odgovor na temu

Nibble

Član broj: 63173
Poruke: 302
*.dlp272.bih.net.ba.



+1 Profil

icon Re: Pomoc oko moje male funkcije :D02.05.2006. u 09:05 - pre 218 meseci
Izvinite ako sam dosadan imam jos jedno pitanje.

Code:


char *DNS(char *what)
{
WORD sockVersion;
WSADATA wsaData;
HOSTENT *hostent = NULL;
IN_ADDR iaddr;
char *buffer;

 DWORD addr = inet_addr(what);

 buffer = (char*)malloc(512 * sizeof(char));
 
 memset(buffer,0,512);

 sockVersion = MAKEWORD( 1, 0 );

if( WSAStartup( sockVersion, &wsaData ) != 0)return "error";

 if (addr != INADDR_NONE) 
 {
  hostent = gethostbyaddr((char *)&addr, sizeof(struct in_addr), AF_INET);            
  strcpy(buffer,hostent->h_name);
  return buffer;
 }
 else 
 {
    hostent = gethostbyname(what);

    if (hostent != NULL) {
            iaddr = *((LPIN_ADDR)*hostent->h_addr_list);
             strcpy(buffer,inet_ntoa(iaddr));
        return buffer;
        }
    }
 if (hostent == NULL){
      strcpy(buffer, "Cannot Resolve Adress");
      return buffer;
    }
    strcpy(buffer, "Some Error");
  return buffer;
}


Pitanje glasi:Ako sam vec alocirao pointer buffer na 512 bajta slobodne memorije da li trebam staviti free(buffer) prije ili poslije return komande?
 
Odgovor na temu

n1tr0
Freelance
Cortanovci / NS

Član broj: 55279
Poruke: 465
80.93.231.*

Sajt: grubicv.iz.rs


+2 Profil

icon Re: Pomoc oko moje male funkcije :D05.05.2006. u 14:54 - pre 218 meseci
Pa ako stavis unutar funkcije posle return komande nece se izvrsiti, jer ces izaci iz funkcije kada naidjes na return.
Ako stavis pre onda ce ti buffer dobiti vrednost NULL i vratice *DNS-u za adresu NULL. Samim tim DNS nece pokazivati ni na sta...
Kada rezervises nesto u memoriji sa malloc, u ovom primeru 512 bajtova i stavis da pokazuje buffer na to, prilikom return-a funkcija ce vratiti adresu i *DNS ce pokazivati na to u memoriji. Savetujem ti da po izlasku iz funkcije obradis te podatke na koje pokazuje DNS i onda ih oslobodis sa free.
 
Odgovor na temu

Nibble

Član broj: 63173
Poruke: 302
*.dlp285.bih.net.ba.



+1 Profil

icon Re: Pomoc oko moje male funkcije :D05.05.2006. u 19:40 - pre 218 meseci
Pa da upravu si n1tr0.Mozda je ipak najbolje da umjesto char *buffer stavim char buffer[512].
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pomoc oko moje male funkcije :D

[ Pregleda: 2193 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.