[ Príspevkov: 15 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 17.02.09
Prihlásený: 15.04.26
Príspevky: 454
Témy: 32 | 32
Bydlisko: Bytča(okres...
NapísalOffline : 15.11.2014 21:48 | strtod c

Zdravím vedel by mi niekto povedať ako by sa mala zapísať táto časť kódu ? Potrebujem len príjsť nato ako môžem použiť premennú "a" do ktorej uložím hodnotu ktorá vracia funkcia bunky vo funkcií strtod. Lebo keď to porovnám tak mi to vždy vypíše že x je 0.

Kód:

int min(int argc,char *argv[]){
    char *word;
    char *str;
    int i = 0;
    double x;
    double y=99999;
    char *a;

    a = bunky (argv, i);
    char *newline = strchr(a, '\n' );
    if ( newline )
        *newline = 0;
    while(1){
        x = strtod(a, &str);
        if( x < y){
            y = x;
            printf("%f", y);
        }
    }
}


char* bunky(char *argv[], int i){
    if(strcmp(argv[2], "row")==0){
       char *str;
       char *word;
       char pole[1024];
       int a;
       double x = strtod(argv[3], &str);
        while(i < x){

            i++;
            fgets(pole, sizeof(pole), stdin);
            word = strtok(pole, " ");
            while(word != NULL){
                return word;
            }
        }
    }
}


_________________
MB:Asus p5q pro, CPU:Intel q9400 2.67Ghz @ 3.2Ghz Vcore:1.3, GPU:Gigabyte gtx560 830/4008 @ 920/4300 , PSU: EnermaxPRO82 525W , RAM:4GB Kingstone 1066MHz CL5@ 901Mhz CL5, HDD: Western Digital 320GB AAKS , CPU cooler: Scythe Ninja 2
Rev. B, Case: Cooler Master Elite 330
Offline

Užívateľ
Užívateľ
strtod c

Registrovaný: 08.03.09
Prihlásený: 17.01.25
Príspevky: 1116
Témy: 88 | 88
Bydlisko: 00100100
NapísalOffline : 15.11.2014 22:15 | strtod c

Chapes spravne ako sa pouziju parametre a ako pracuje strtod http://www.cplusplus.com/reference/cstdlib/strtod/ ?


_________________
Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 17.02.09
Prihlásený: 15.04.26
Príspevky: 454
Témy: 32 | 32
Bydlisko: Bytča(okres...
Napísal autor témyOffline : 15.11.2014 22:22 | strtod c

Môžeš mi troška napovedať kde robím chybu ? napr keď cez fgets načítam riadok kde bude "12345 256" tak potom cez strtok sa mi uloží pointer na 12345. Keď dám to strtod do tej funkcie bunky tak mi to vráti že x je 12345 čož je dobre, ale keď už to chcem spraviť tak že vrátim hodnotu word, vložím ju do premnnej "a" a potom to chcem porovnať cez strtod tak už mi to nejako nejde.
Tie parametre v strtod by som mal mať dobre nie?

// Spojený príspevok Sob 15.11.14 23:21

I tried everything. Však aj keď to debugujem a prezerám si hodnoty tak premenná "a" má rovnakú hodnotu ako word lenže to strtod to proste nevezme a vždy hodí 0.


_________________
MB:Asus p5q pro, CPU:Intel q9400 2.67Ghz @ 3.2Ghz Vcore:1.3, GPU:Gigabyte gtx560 830/4008 @ 920/4300 , PSU: EnermaxPRO82 525W , RAM:4GB Kingstone 1066MHz CL5@ 901Mhz CL5, HDD: Western Digital 320GB AAKS , CPU cooler: Scythe Ninja 2
Rev. B, Case: Cooler Master Elite 330
Offline

Užívateľ
Užívateľ
strtod c

Registrovaný: 08.03.09
Prihlásený: 17.01.25
Príspevky: 1116
Témy: 88 | 88
Bydlisko: 00100100
NapísalOffline : 16.11.2014 9:13 | strtod c

Ak to a obsahuje retazec co chces tak by to malo ist. Nemoze to byt tym, ze to word je lokalna premenna a ta zanikne na konci funkcie bunky a ty akoby vracias pointer na retazec ktory zanikne? ale to by potom to a neobsahovalo dobru hodnotu ako tvrdis ty.


_________________
Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 17.02.09
Prihlásený: 15.04.26
Príspevky: 454
Témy: 32 | 32
Bydlisko: Bytča(okres...
Napísal autor témyOffline : 16.11.2014 9:21 | strtod c

No hej, mňa ešte napdá že by chyba mohla byť v tom že funkcia bunnky mi proste reťazec vrátiť nemôže ? nemám to nejako zle deklarované ?

Kód:
int min(int argc,char *argv[]){
    char *word;
    char *str;
    int i = 0;
    double x;
    double y=99999;
    char *a;

    a = bunky (argv, i); // Keď dám v debugru display a, tak to "a" má úplne rovnaký tvar ako malo word, word mi už zaniklo. "a" má tvar 0x... "12345"
    char *newline = strchr(a, '\n' );
    if ( newline )
        *newline = 0;
    while(1){
        x = strtod(a, &str); // A tu mi to proste nespracuje hodí do x 0, aj do str 0
        if( x < y){
            y = x;
            printf("%f", y);
        }
    }
}


char* bunky(char *argv[], int i){
    if(strcmp(argv[2], "row")==0){
       char *str;
       char *word;
       char pole[1024];
       int a;
       double x = strtod(argv[3], &str);
        while(i < x){

            i++;
            fgets(pole, sizeof(pole), stdin); // Majme reťazec 12345 6478 698
            word = strtok(pole, " "); // Rozdelíme ho na tokeny, a word bude pointer na prvý tzn, 123456. Ak dám pri debugovaní display word tak mi ukáže nejaku 16tkovu adresu a potom "123456"
            while(word != NULL){
                return word; // Vrátim word
            }
        }
    }
}


_________________
MB:Asus p5q pro, CPU:Intel q9400 2.67Ghz @ 3.2Ghz Vcore:1.3, GPU:Gigabyte gtx560 830/4008 @ 920/4300 , PSU: EnermaxPRO82 525W , RAM:4GB Kingstone 1066MHz CL5@ 901Mhz CL5, HDD: Western Digital 320GB AAKS , CPU cooler: Scythe Ninja 2
Rev. B, Case: Cooler Master Elite 330
Offline

Užívateľ
Užívateľ
strtod c

Registrovaný: 08.03.09
Prihlásený: 17.01.25
Príspevky: 1116
Témy: 88 | 88
Bydlisko: 00100100
NapísalOffline : 16.11.2014 9:40 | strtod c

Skus pouzit strcpy namiesto priameho priradenia, najlepsie este v tej funkcii, takze daj to a ako globalnu premennu a prirad to namiesto vracania alebo ako parameter cez ukazatel.


_________________
Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 17.02.09
Prihlásený: 15.04.26
Príspevky: 454
Témy: 32 | 32
Bydlisko: Bytča(okres...
Napísal autor témyOffline : 16.11.2014 9:54 | strtod c

Segmentation fault. Ale ináč rád by som sa globálny premenným vyhol :D.


_________________
MB:Asus p5q pro, CPU:Intel q9400 2.67Ghz @ 3.2Ghz Vcore:1.3, GPU:Gigabyte gtx560 830/4008 @ 920/4300 , PSU: EnermaxPRO82 525W , RAM:4GB Kingstone 1066MHz CL5@ 901Mhz CL5, HDD: Western Digital 320GB AAKS , CPU cooler: Scythe Ninja 2
Rev. B, Case: Cooler Master Elite 330
Offline

Užívateľ
Užívateľ
strtod c

Registrovaný: 08.03.09
Prihlásený: 17.01.25
Príspevky: 1116
Témy: 88 | 88
Bydlisko: 00100100
NapísalOffline : 16.11.2014 10:14 | strtod c

Ty chces, aby ta funkcia bunky vracala postupne vsetky cisla(vo forme retazcov) zo zadaneho retazca?


_________________
Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 17.02.09
Prihlásený: 15.04.26
Príspevky: 454
Témy: 32 | 32
Bydlisko: Bytča(okres...
Napísal autor témyOffline : 16.11.2014 10:15 | strtod c

Ano, ide o to že ja chcem spraviť funkciu ktorá mi bude vracať v podstate tie tokeny, a ja si ich potom v jednotlivých funkciach už spracujem.


_________________
MB:Asus p5q pro, CPU:Intel q9400 2.67Ghz @ 3.2Ghz Vcore:1.3, GPU:Gigabyte gtx560 830/4008 @ 920/4300 , PSU: EnermaxPRO82 525W , RAM:4GB Kingstone 1066MHz CL5@ 901Mhz CL5, HDD: Western Digital 320GB AAKS , CPU cooler: Scythe Ninja 2
Rev. B, Case: Cooler Master Elite 330
Offline

Užívateľ
Užívateľ
strtod c

Registrovaný: 08.03.09
Prihlásený: 17.01.25
Príspevky: 1116
Témy: 88 | 88
Bydlisko: 00100100
NapísalOffline : 16.11.2014 10:35 | strtod c

Ten tvoj napad s tymto postupnym vracanim mi pripomina prikaz yield zo C# :D, tu je moj napad ako na to bez globalnych premennych.
Kód:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void bunky(int bol, char * a)
{
    char s[] = "123 456 789 0";
    char znaky[] = " ";
    char * ds;
    if(bol == 0)
        ds = strtok(s, znaky);
    else
        ds = strtok(NULL, znaky);
    if(ds != NULL)
        strcpy(a, ds);
    else
        strcpy(a, "error");
}

int main(int argc,char *argv[]){
    char a[100];
    bunky(0, a);
    while(strcmp(a, "error") != 0)
    {
        double x = strtod(a, NULL);
        printf("%s\n", a);
        printf("%f\n", x);
        bunky(1, a);
    }
}


_________________
Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-)
Offline

Užívateľ
Užívateľ
strtod c

Registrovaný: 14.03.11
Prihlásený: 08.09.26
Príspevky: 815
Témy: 23 | 23
Bydlisko: Bratislava
NapísalOffline : 19.11.2014 13:33 | strtod c

Caliente píše:
Môžeš mi troška napovedať kde robím chybu ? napr keď cez fgets načítam riadok kde bude "12345 256" tak potom cez strtok sa mi uloží pointer na 12345.


Podľa Frasera
Returning a value from a function is a two-step process. First, specify the type of value the function
will return, and second, using the return statement, pass a return value of that type:

double example()
{
double a = 8.05;
// do some stuff
return a;
}

Returning Handles
You need to take care when you return a handle from a function.

■Caution Never return a handle to a variable of local scope to a function, because it will not be a valid handle
on exiting the function.


Ja som v jednom štádiu paranoje prerábal výstupné premenné na vstupné.

A BTW,
double y=99999;
by som si nedovolil napísať.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 17.02.09
Prihlásený: 15.04.26
Príspevky: 454
Témy: 32 | 32
Bydlisko: Bytča(okres...
Napísal autor témyOffline : 19.11.2014 22:52 | strtod c

To čo postol reDo fungovalo, ale nakoniec som sa trocha zasekol a nedokázal som to prerobiť do podoby do ktorej som potreboval, teraz už je neskoro :) . Ak správne chápem to čo si postol tak potom stále nechápem ako to spraviť tak ako chcem.


_________________
MB:Asus p5q pro, CPU:Intel q9400 2.67Ghz @ 3.2Ghz Vcore:1.3, GPU:Gigabyte gtx560 830/4008 @ 920/4300 , PSU: EnermaxPRO82 525W , RAM:4GB Kingstone 1066MHz CL5@ 901Mhz CL5, HDD: Western Digital 320GB AAKS , CPU cooler: Scythe Ninja 2
Rev. B, Case: Cooler Master Elite 330
Offline

Užívateľ
Užívateľ
strtod c

Registrovaný: 08.03.09
Prihlásený: 17.01.25
Príspevky: 1116
Témy: 88 | 88
Bydlisko: 00100100
NapísalOffline : 20.11.2014 8:19 | strtod c

Ty si postol odpoved a potom si ju zmazal, skusil som to podla nej prerobit, dalo by sa to len tak, ze by si dodaval ten nacitany retazec ako parameter alebo by si ho niekde drzal ako globalnu premennu pretoze lokalne premenne v tej funkcii zanikaju.


_________________
Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-)
Offline

Užívateľ
Užívateľ
strtod c

Registrovaný: 14.03.11
Prihlásený: 08.09.26
Príspevky: 815
Témy: 23 | 23
Bydlisko: Bratislava
NapísalOffline : 20.11.2014 10:26 | strtod c

Nemusí to byť práve globálna premenná.


Offline

Užívateľ
Užívateľ
strtod c

Registrovaný: 08.03.09
Prihlásený: 17.01.25
Príspevky: 1116
Témy: 88 | 88
Bydlisko: 00100100
NapísalOffline : 20.11.2014 14:46 | strtod c

Mohol by si napisat tvoj napad? staticka ?


_________________
Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-)
 [ Príspevkov: 15 ] 


strtod c




© 2005 - 2026 PCforum, edited by JanoF