[C] problem

C, C++, Java, PHP, Ruby...

Moderator/ica: Moderatori/ce

Pravila foruma
U naslovu teme unutar uglatih zagrada navesti o kojem jeziku je riječ. Primjer: [Java]
Avatar
Medojedni jazavac
Postovi: 1536
Pridružen/a: 22 tra 2012, 08:55
Spol: M
OS: eOS Luna
Lokacija: ForHill Croatia
Kontakt:

Re: C problem

Post Postao/la Medojedni jazavac »

pa to je isto: char ip[] i char *ip. moze samo stavit const, ili ka inicijlaizirat kao string pa ce automatski biti const jer ne bude spremljen na stogu
stefan je napisao/la:tu mač gemišta
To understand recursion, you must first understand recursion.
Avatar
jurastublic
Postovi: 1907
Pridružen/a: 16 tra 2011, 08:34
Spol: M
OS: Mint 10 LXDE itd...
Lokacija: i grupa Film

Re: C problem

Post Postao/la jurastublic »

To sam i napisao. Ali kad šalje ip[] funkciji, šalje po vrijednosti a pointerom šalje samo pointer na readonly string koji pokušava u funkciji promijeniti što se ne smije. Osim toga razlika je kod fgets() jer koristi sizeof() umjesto strlen() (koje mora za pointerski slučaj). zato je najlakše samo da zamijeni s poljima umjesto const char pointera a ostalo ostane isto.
Zadnja izmjena: jurastublic, dana/u 13 sij 2013, 21:38, ukupno mijenjano 2 puta.
"Hodor bre foobar"
Avatar
Bug
Postovi: 240
Pridružen/a: 18 lip 2009, 23:33
Spol: M
OS: Fedora 19, Debian 7

Re: C problem

Post Postao/la Bug »

Sad meni nije nesto jasno, posto je ovaj kod treba da ide u neki modul za aplikaciju, ja korisim njihove promenljive i oni su npr za script_path stavili da je buffer* type, a meni u funkciji check_ip() , sprintf ocekuje char...sta raditi?
isto je i sa fopen, ja saljem njemu buffer data type i izbacuje mi warning?

Da budem jasan, module radi, samo me ta 2-3warninga nerviraju.
A i malo mi je problem da radim test, jer moram onda recomplie app pa vamo namo inace bi se ja igrao sa tim i ispitivao sta ako..
Avatar
jurastublic
Postovi: 1907
Pridružen/a: 16 tra 2011, 08:34
Spol: M
OS: Mint 10 LXDE itd...
Lokacija: i grupa Film

Re: C problem

Post Postao/la jurastublic »

Pa pitaj njih kakav je buffer tip. To nije osnovni tip već neka struktura. Iz ovoga šta si pokazao se ne vidi.
"Hodor bre foobar"
Avatar
Bug
Postovi: 240
Pridružen/a: 18 lip 2009, 23:33
Spol: M
OS: Fedora 19, Debian 7

Re: C problem

Post Postao/la Bug »

pa i meni bilo cudno, no prateci kod (pomoc IDE-a)
dosao sam do fajla "buffer.h" koji u sebi sadrzi

Kod: Označi sve

typedef struct {
	char *ptr;

	size_t used;
	size_t size;
} buffer;
Posto sma rekao da nisam bas vican C-u ...jel sam dobro nasao?
Avatar
jurastublic
Postovi: 1907
Pridružen/a: 16 tra 2011, 08:34
Spol: M
OS: Mint 10 LXDE itd...
Lokacija: i grupa Film

Re: C problem

Post Postao/la jurastublic »

if (file = fopen(s->script_path, "r")) {

U ovome bi 's' trebao biti pokazivač na buffer a ne script_path.
Znači
struct buffer *s;
if (file = fopen(s->ptr, "r")) {

edit dodatak: ne vidi se za šta tu treba script_path. To je problem kada netko pošalje samo djeliće programa. Bolje poslati cijeli modul na http://pastebin.com a ovdje samo link. Ovako se svi samo muče, a forum se zatrpava nepotrebnim nagađanjem.
Zadnja izmjena: jurastublic, dana/u 14 sij 2013, 08:43, ukupno mijenjano 3 puta.
"Hodor bre foobar"
Avatar
Bug
Postovi: 240
Pridružen/a: 18 lip 2009, 23:33
Spol: M
OS: Fedora 19, Debian 7

Re: C problem

Post Postao/la Bug »

Mudar ovaj @jurastublic :D imas pivo :)
umesto s->script_path treba da stoji s->script_path->ptr
sad mi ne daje nikakv warning :)
Hvala svima :)
Sad mi ostalo jos da ubacim u app recomplie i da vidim dal ce da radi i dalje :)
Avatar
jurastublic
Postovi: 1907
Pridružen/a: 16 tra 2011, 08:34
Spol: M
OS: Mint 10 LXDE itd...
Lokacija: i grupa Film

Re: C problem

Post Postao/la jurastublic »

Nekako čisto sumnjam. Jadna ti majka ako sam ti ja jedina pomoć. :)
"Hodor bre foobar"
Avatar
Bug
Postovi: 240
Pridružen/a: 18 lip 2009, 23:33
Spol: M
OS: Fedora 19, Debian 7

Re: C problem

Post Postao/la Bug »

imam neki cudan problem

Kod: Označi sve

        res = check_ip(remote_ip, p->conf.script_path->ptr);
        if (( res != 1)) {
           #sta ako nije ...
          }

Kod: Označi sve

int check_ip(const char* ip, const char* path) {

    char command[4096];
    char out[4096];
    char str[10];
    char* res;
    int rs;
    sprintf(out, "%s %s\n", path, ip);
    strcat(command, out);
    FILE *fp = popen(command, "r");

    while (fgets(str, sizeof (str), fp) != NULL) {
        res = str;
    }

    pclose(fp);
    rs = atoi(res);
    if (rs == 1) {
        return 1;
    } else {
        return 0;
    }

}
I kao sto vidite ta funkcija vraca ili jedan ili nula...problem je sto onaj IF sto proverava "res" nekad 1 tumaci kao 0, a 0 kao 1...
Nije mi jasno zasto, da nije mozda zato to string pretvaram u int?
Avatar
jurastublic
Postovi: 1907
Pridružen/a: 16 tra 2011, 08:34
Spol: M
OS: Mint 10 LXDE itd...
Lokacija: i grupa Film

Re: C problem

Post Postao/la jurastublic »

Vjerojatno ti atoi vraća nulu i kad naiđe na pogrešku. Evo, napisao sam ti nešto što sigurno radi (jer sam provjerio).
I malo sam počistio kod jer imaš puno nepotrebnih stvari u njemu.
check_ip():

Kod: Označi sve

int check_ip(const char* ip, const char* path) {

    char outpath[4096];
    char strbuf[2];
    FILE *fp;
    
    sprintf(outpath, "%s %s\n", path, ip);          //OK, spoji ip i path u out sa razmakom izmedju
    fp = popen(outpath, "r");
    if (fgets (strbuf,sizeof (strbuf), fp) != NULL) {

// provjeri ulaz PRIJE atoi() jer atoi() je sranje, on vraća nulu i kad naiđe na pogrešku 
// - to te može zafrknut ako ti je nula ispravna vrijednost za povratak 
      if (strcmp(strbuf, "0") == 0 || strcmp(strbuf, "1") == 0){ 
       pclose(fp);      //zatvori fajl prije returna !!!
       return atoi(strbuf);
       }     
       else printf("pogreška na ulazu");
       return -1;     //ako nije 1 ili 0 vrati negativni broj jer je nula u redu
    }
}
i main():

Kod: Označi sve

int main(void) {
int res;                       //zamijeni ip i path kako tebi odgovara
char ip[]="192.168.1.88";
char path[]="/path_taj_i_taj";

res = check_ip(ip, path);
if (res == 1) //radi 1;      //budi specifičan u testovima jer se u tome lako zezneš
if (res == 0) //radi 0;      //s povratnim vrijednostima - nikad ne znaš šta može uletit
else //radi nešto treće;
return 0;
}
edit: ups sry, falio mi je razmak kod sprintf(outpath... :facepalm
"Hodor bre foobar"
Odgovori