[ Nibble @ 01.05.2006. 18:23 ] @
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;
}

[ Mali Misha @ 01.05.2006. 18:44 ] @
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.
[ Nibble @ 01.05.2006. 23:11 ] @
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!
[ Mali Misha @ 02.05.2006. 07:15 ] @
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++.
[ Nibble @ 02.05.2006. 08:50 ] @
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.
[ Nibble @ 02.05.2006. 09:05 ] @
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?
[ n1tr0 @ 05.05.2006. 14:54 ] @
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.
[ Nibble @ 05.05.2006. 19:40 ] @
Pa da upravu si n1tr0.Mozda je ipak najbolje da umjesto char *buffer stavim char buffer[512].