Gå til innhold

lnostdal

Medlemmer
  • Innlegg

    490
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av lnostdal

  1. Eg sitter nå å prøve å programmere et program i Labview. Og i det programmet eg lage så benytter eg meg av "formula node" hvor det skal være mulig å programmere "c lignende kode" som det så fint står i helpen.

    I denne formula node skal eg lage en enkel for setning, som telleren skal begynne på -10 og gå til 10. Så har eg en formel som beskriver hvilken verdi Y skal ha.

    Y er en funksjon som består av 2 variabler:

    a, som er en verdi brukeren velger

    i, som er telleren.

     

    Det som skal sender ut av denne her er, i som eg kobler til x-grafen ( i praksis er i=x-aksen) og y som er verdien.

     

    Her er det som eg har skrevet i formula node:

    int32 i = -10;
    for (i<11;)
    {
    y1=a*i**2;
    i++;
    }

     

    Input på formula node er a, og output'er er y og i.

     

    Utgangene kobles til en "Build XY graph" som lager et koordinat-system av dette.

    Men eg får feilmelding om at eg mangler en "left parantese" i begynnelsen av linje2. Men ser ikkje at det er feil det eg har skrevet.

    Noen tips?

    7107911[/snapback]

     

    ok, kan det være så enkelt at den vil ha parantesen helt innat for'en? ..slik:

     

    for(i<11;)

     

     

    forøvrig ser dette litt merkelig ut:

     

    y1=a*i**2;
    

     

    sikker på at det ikke skal stå y1=a*i*2; her?

     

    edit:

    du nevner også at y skal være en funksjon - det høres ut som om du sier at den er en funksjon som aksepterer to argumenter .. funksjoner kalles slik i C:

     

    y(x, y);
    

  2. Der skjønte jeg desverre lite du :p

    7107788[/snapback]

     

    ok, vel dette er umulig å få til med kun et batch-script .. så du må sette deg inn i et språk om du skal forstå dette

     

    språk som passer til denne type oppgaver er:

     

    * python

    * common lisp (dette er hva jeg brukte her)

    * perl

    * ruby

     

    ..vel, dette er de mest vanlige til slike oppgaver vil jeg tro..

     

    edit:

    skal du jobbe med veldig store datamengder er common lisp raskest av disse - om du ønsker noe ennå raskere kan optimalisert C være ennå raskere i noen tilfeller (men C er et helvette å jobbe med; så drop C - optimaliser altid til sist)

  3. Muligheter for at noen mekker/viser ossen jeg gjør sånn at det jeg ber om skjer?

     

     

    mvh disco808

    7107417[/snapback]

     

    CLISP og cl-ppcre (begge fungerer både under Linux og Windows):

     

    #!/usr/bin/env clisp
    
    ;; see http://clisp.cons.org/impnotes/quickstart.html
    
    
    
    (asdf:operate 'asdf:load-op :cl-ppcre)
    
    
    (defmacro awhile (result-symbol expr &body body)
     (let ((ret (gensym)))
       `(let ((,ret nil))
          (do ((,result-symbol ,expr ,expr))
              ((not ,result-symbol) ,ret)
            (setf ,ret ,@body)))))
    
    
    (with-open-file (ss (first ext:*args*))
     (awhile line (read-line ss nil nil)
       (let ((p1 (subseq line 2 6))
             (p2 (cl-ppcre:split "#|\\s" (subseq line 7))))
         (format t "data from line: '~A', '~A', '~A'~%"
                 p1 (first p2) (second p2)))))
    

     

    M$XXXX#872D23C25EDE820A993ED63AD773DDF1 YYYYY

    M$BBBB#972F23E25EDE320A093ES63AD873DPF1 AAAA

    M$BBBB#972F23E25E0aaoeuaoeu93ES63AD873DPF1 AAAA34ui

    M$BBBB#972F23E25EDE320A093EaoeuoaeuiueS63AD873DPF1 AAAA23u23ui

     

    lars@ibmr52:~/programming/lisp/clisp$ ./script2.lisp disco808.txt
    data from line: 'XXXX', '872D23C25EDE820A993ED63AD773DDF1', 'YYYYY'
    data from line: 'BBBB', '972F23E25EDE320A093ES63AD873DPF1', 'AAAA'
    data from line: 'BBBB', '972F23E25E0aaoeuaoeu93ES63AD873DPF1', 'AAAA34ui'
    data from line: 'BBBB', '972F23E25EDE320A093EaoeuoaeuiueS63AD873DPF1', 'AAAA23u23ui'
    

     

    edit:

    ser du bare var ute etter de på "yttersidene", men jeg har tatt med den "i midten" også - rop om du ikke greier å fjerne dette selv

  4. 1 hvordan skal jeg lage en algoritme som kan forandre seg etter jeg har brukt 200 timer

     

    Du tar med sjekken for 200 i algoritmen - altså du gjør en sjekk og splitter om unntaket gjelder:

     

    if(something < 200)
     doSomething();
    else
     doSomethingElse();
    

     

    2. hvordan får jeg inn slik at programmet sammenligner denne måneds regning med forgje måned

    7107136[/snapback]

     

    Hum .. åssen forventer du at en annen skal svare på dette i denne sammenhengen?

  5. to ting etter at ubuntu er installert:

     

    * aktivere "repositories" som er deaktivert som standard slik at du får tilgang til codecs og programvare som ikke er tilgjengelig i standard-repositoriene: https://help.ubuntu.com/community/Repositories/Ubuntu

    * følge denne guiden: https://help.ubuntu.com/community/RestrictedFormats

     

    videre om du ønsker 3D-aksellerasjon (NVidia/ATI): https://help.ubuntu.com/community/BinaryDriverHowto

     

    ..XGL, Beryl/AIGLX o.l. taes til slutt..

  6. Takk. Det var i grunn det jeg trodde fordi jeg ikke har klart å finne noe via google.

     

    En annen ting. Er det mulig å sende inn deler av et array til en funksjon? En eller annen subarray sak? f.eks. element 0 - 5.

     

    Ørjan...

    7099160[/snapback]

    Ja, du kan sende inn deler ut å bale så mye som lnostdal:

     

    Forstår du forskjellene mellom det du gjør og det jeg gjør - og fordeler/bakdeler ved hver av dem?

     

    Forresten - om man først skal bruke C++ så bruker man templates for å generere kode for utskrift og behandling av forskjellige typer.

     

    * Du skriver ikke ut arrayer og minnesegmenter av ukjente typer (eller tar ikke hensyn til "utvidbarhet").

    * Du resirkulerer ikke koden for iterasjon over ukjente typer.

    * m.m.

  7. (edit: dette er slik jeg installerte den under Ubuntu Dapper)

    sudo aptitude remove flashplugin-nonfree
    wget http://www.adobe.com/go/fp9_update_b1_installer_linuxplugin
    tar xf FP9_plugin_beta_101806.tar.gz
    cd flash-player-plugin-9.0.21.55/
    sudo mv libflashplayer.so /usr/lib/firefox/plugins/
    

     

    Restart Firefox (pass på at alle vinduer er lukket), og sjekk her om det fungerte: http://www.adobe.com/products/flash/about/

     

    ..om du skulle støte på problemer fjerner du ganske enkelt `libflashplayer.so' fra `/usr/lib/firefox/plugins' og installerer pakken `flashplugin-nonfree' igjen..

  8. en mulig optimalisering (eller kanskje det går tregere?):

     

    void iterateVectorSegment(VectorSegment* vector_segment, VectorCallback vector_callback){
     // NOTE: Temporary leaves `vector_segment->vector' in a non-sane state.
     // Set up fake environment so we can reuse code in `iterateVector'.
     Vector* vector = vector_segment->vector;
     void* old_data = vector->data;
     vector->data = getVectorElt(vector, vector_segment->start_index);
     size_t old_num_elements = vector->num_elements;
     vector->num_elements = vector_segment->end_index - vector_segment->start_index;
     iterateVector(vector, vector_callback);
    
     // Restore original environment.
     vector->data = old_data;
     vector->num_elements = old_num_elements;}
    

     

    edit:

    det er også mer vanlig at testen i for-loopen i `iterateVector' ser slik ut:

     

    i < vector->num_elements

  9. En annen ting. Er det mulig å sende inn deler av et array til en funksjon? En eller annen subarray sak? f.eks. element 0 - 5.

    7099160[/snapback]

     

    nei, et array er ikke noe annet en ett "flytende" allokert minnesegment - det inneholder hverken informasjon om:

     

    * antall elementer

    * start-index (0)

    * slutt-index (5)

     

    du må bygge et "språk" over disse tingene (pekere og arrays) ved å abstrahere v.h.a. structs og funksjoner .. dette har gått fryktelig fort og det kan hende jeg må redigere denne posten litt ettersom det kan være endel bugs her, men her har du en ting som "reflekterer" array eller minnesegmenter og pakker dem inn i strukturer og funksjoner (blir nesten OOP) som gjør at man har litt mer meta-data å jobbe med når man skal gjøre ting:

     

    edit: koden i dette forumet blir selvfølgelig seendes helt jævlig ut, så her: http://paste.lisp.org/display/28235

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    typedef char bool;
    
    
    typedef struct {
     /* We build an abstraction over plain arrays/memory-allocations that contain
        more information. */
     size_t num_elements;
     size_t element_size;
     bool reflection;
     void* data;
    } Vector;
    
    
    Vector* reflectArray(void* array, size_t num_elements, size_t element_size){
     // Constructor.
     Vector* vector = malloc(sizeof(Vector));
     vector->data = array;
     vector->num_elements = num_elements;
     vector->element_size = element_size;
     vector->reflection = 1;
     return vector;}
    
    
    void deleteVector(Vector* vector) {
    // Destructor.
     if(!vector->reflection)
       free(vector->data);
     free(vector);}
    
    
    void* getVectorElt(Vector* vector, size_t index){
     return(vector->data + (vector->element_size * index));}
    
    
    typedef void (*VectorCallback)(void*);
    
    
    void iterateVector(Vector* vector, VectorCallback vector_callback){
     {size_t i = 0;
       for(; i != vector->num_elements; i++) 
         vector_callback(getVectorElt(vector, i));}}
    
    
    typedef struct {
     size_t start_index;
     size_t end_index;
     Vector* vector;
    } VectorSegment;
    
    
    VectorSegment* newVectorSegment(Vector* vector, size_t start_index, size_t end_index){
     // Constructor.
     VectorSegment* vector_segment = malloc(sizeof(VectorSegment));
     vector_segment->vector = vector;
     vector_segment->start_index = start_index;
     vector_segment->end_index = end_index;
     return(vector_segment);}
    
    
    void deleteVectorSegment(VectorSegment* vector_segment){
     // Destructor.
     free(vector_segment);}
    
    
    void iterateVectorSegment(VectorSegment* vector_segment, VectorCallback vector_callback){
     // Set up fake environment so we can reuse code in `iterateVector'.
     {Vector* tmp =
         reflectArray(getVectorElt(vector_segment->vector, vector_segment->start_index),
                      vector_segment->end_index - vector_segment->start_index,
                      vector_segment->vector->element_size);
       iterateVector(tmp, vector_callback);
       deleteVector(tmp);}}
    
    
    
    //// USER CODE ////
    
    void printVectorOfDoubles(double* vector_element){
     printf("vector_element: %f\n", *vector_element);}
    
    
    
    int main(){
     double double_array[6] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 };
    
     Vector* vector = reflectArray(double_array, 6, sizeof(double));
     printf("iterateVector:\n");
     iterateVector(vector, (VectorCallback)&printVectorOfDoubles);
    
     printf("\n\niterateVectorSegment:\n");
     VectorSegment* vector_segment = newVectorSegment(vector, 2, 4);
     iterateVectorSegment(vector_segment, (VectorCallback)&printVectorOfDoubles);
    
     deleteVectorSegment(vector_segment);
     deleteVector(vector);
     return 0;}
    

     

    lars@ibmr52:~/programming/c$ gcc -Wall -g a.c -o a && ./a
    iterateVector:
    vector_element: 0.000000
    vector_element: 1.000000
    vector_element: 2.000000
    vector_element: 3.000000
    vector_element: 4.000000
    vector_element: 5.000000
    
    
    iterateVectorSegment:
    vector_element: 2.000000
    vector_element: 3.000000
    

  10. Det varierer - hvilket språk og bibliotek bruker du? Noen er basert på substring(string, start_pos, end_pos) .. altså _ikke_ substring(string, start_pos, length) .. noe som betyr at du må gjøre:

     

    substring(string, the_start_pos, the_start_pos + the_end_pos) .. u see?

     

    ..det som kan skje om dette er tilfellet er at den (edit:) slutter på gal posisjon..

     

    Her er forøvrig en oppdatering av det jeg pastet over .. v.h.a. CLISP kan man bruke dette som et script/program fra konsollet:

     

    #!/usr/bin/env clisp
    
    (if (= 3 (length ext:*args*))
       (princ (subseq (third ext:*args*)
                      (parse-integer (first ext:*args*))
                      (+ (parse-integer (first ext:*args*))
                         (parse-integer (second ext:*args*)))))
       (format t "Usage: ~A <start> <length> <string>" *load-pathname*))
    

     

    lars@ibmr52:~/programming/lisp/clisp$ chmod +x script2.lisp
    lars@ibmr52:~/programming/lisp/clisp$ ./script2.lisp 2 5 "Lars Rune Nøstdal"
    rs Ru
    lars@ibmr52:~/programming/lisp/clisp$ ./script2.lisp 2 5
    Usage: script2.lisp <start> <length> <string>
    

     

    (I eksempelet gir jeg filen etternavnet `.lisp', men en kan godt unnlate å gi den et etternavn. Da vil det for brukeren ikke være synlig at dette er et Lisp-script.)

  11. Uummh. Fins det ikke noe kalkulator?

    Eg orker ikke telle meg frem til 43 og så ta med 45 siffer bak der igjen :/

     

    Se på det som en utfordring folkens!  :w00t:

    7096953[/snapback]

     

    ok, fra posisjon 43 og 45 tegn utover:

     

    cl-user> (let* ((start 43) (end (+ start 45)))
              (subseq "01100110011010010110111001100100010111110110000101101110011011110111010001101000011001010111001001011111011101110110000101111001"
                      start end))
                   
    "000010110111001101111011101000110100001100101"
    

     

    edit: pasten over er tydeligvis noe forumet ikke takler :roll:, så jeg postet her også: http://paste.lisp.org/display/28205

  12. Gitt følgende kode

     

    #include <stdio.h>
    #include <malloc.h>
    
    int main(int argc, char **argv) {
       int x;
       double *buf = (double*)malloc(sizeof(double)*5*5);
       
       for(x=0; x<15; x++)
           buf[x] = x + 0.25;
    }
    

     

    Hvordan finner jeg ut hvor mange double(25) det er plass til i buf?.

    Hvordan kan jeg finne ut hvor mange elementer(15) det er i buf?

     

    Ørjan...

    7096024[/snapback]

     

    sizeof(double) * 25 forteller kun `malloc' om _størrelser_; ikke _antallet_ av noe. Antall må du holde styr på selv på et eller annet vis.

     

    Når du vet at `malloc'-kallet gikk bra - altså at det ikke returnerte NULL kan du regne ut hvor mange elementer av en viss type (altså størrelse) du får plass til i minnet du har allokert fordi du vet den totale størrelsen og størrelsen til hvert enkelt element du ønsker å lagre. F.eks:

     

    #include <stdio.h>
    
    int main()
    {
     printf("sizeof(int): %d\n", sizeof(int));
     printf("sizeof(double): %d\n", sizeof(double));
     return 0;
    }
    
    /*
    lars@ibmr52:~/programming/c$ gcc -g -Wall a.c -o a && ./a
    sizeof(int): 4
    sizeof(double): 8
    */
    

     

    ..dette betyr at "for hver double" jeg allokerer har plass til to int'er, så på min maskin er dette sikkert:

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    
    int main()
    {
     assert((sizeof(double) / 2) == sizeof(int));
     
     int* i = malloc(sizeof(double) * 1);
     i[0] = 1234;
     i[1] = 4321;
    
     printf("i[0]: %d\n", i[0]);
     printf("i[1]: %d\n", i[1]);
    
     free(i);  
    
     return 0;
    }
    
    /*
    lars@ibmr52:~/programming/c$ gcc -g -Wall a.c -o a && ./a
    i[0]: 1234
    i[1]: 4321
    */
    

     

    ..uhm.. vel, heh .. uansett -- poenget er at malloc har ikke noe forhold til antall i det hele tatt; kun størrelse minne den skal forsøke å allokere.

     

    Måten man løser disse tingene på er ved ting som:

     

    typedef struct {
     void* data;
     size_t num_elements;
    } Stuff;
    

     

    ..og/eller..

     

    void someFunction(void* data, size_t num_elements);
    

     

    ..altså man må holde styr på _antall_ separat. :}

  13. Jeg kan godt poste en artikkel om koding av GTK+ under både Linux og Windows der jeg også tar i bruk Glade. Tror i grunn flere kan ha glede av dette.

     

    ..gi meg noen dager..

     

    edit:

    Nei, jeg har ombestemt meg - dette har jeg ikke tid til. Poster alikevel kort om åssen man kommer i gang under Ubuntu:

     

    C og C++-kompiler, man-pages og verktøy:

    sudo aptitude install build-essential glibc-doc manpages 

     

    GTK+-biblioteker, Glade og dokumentasjon:

    sudo aptitude install libgtk2.0-dev libgtk2.0-doc libglib2.0-doc libglade2-dev glade libpango1.0-doc

     

    Manualer, oppslagsverk og tutorialer havner da her:

     

    file:///usr/share/doc/libgtk2.0-doc/gtk/index.html

    file:///usr/share/doc/libgtk2.0-doc/gdk/index.html

    file:///usr/share/doc/libgtk2.0-doc/glib/index.html

    file:///usr/share/doc/libgtk2.0-doc/gobject/index.html

    file:///usr/share/doc/libgtk2.0-doc/pango/index.html

    file:///usr/share/doc/libgtk2.0-doc/gtk-tutorial/book1.html

     

    Header-filer er også greit å se over: file:///usr/include/gtk-2.0

     

    Scons brukes til å bygge programvare:

     

    sudo aptitude install scons

     

    Etter dette følger du GTK+-tutorialen. Spesielt:

    http://www.gtk.org/tutorial/c39.html#SEC-HELLOWORLD

    og

    http://www.gtk.org/tutorial/x111.html

     

    ..enkelt..

     

    edit2: jeg skal se om det går kjappt å få opp noe v.h.a. cygwin til Win32 .. orker ikke manuelt med mingw atm.

  14. Ønsker å kommentere et par ting. Når man poster kode i forum gjør man gjerne mest mulig for å isolere hvor problemet oppstår slik at de som skal hjelpe ikke må parse en masse ikke-relevant informasjon.

     

    I ditt tilfelle noe slikt:

     

    
    #include <iostream>
    
    using namespace std;
    
    
    void accountNumber(unsigned long int account_number)
    {
     cout << "account_number: " << account_number << endl;
    }
    
    
    int main(int argc, char* argv[], char* env[])
    {
     accountNumber(36245564177); // blah.cpp:14
     return 0;
    }

     

    lars@ibmr52:~/programming/c$ g++ -Wall -g blah.cpp -o blah && ./blah
    blah.cpp:14: error: integer constant is too large for ‘long’ type
    

     

    (legg merke til at jeg tar med linjenummer som kommentar også)

     

    ..ok, vel..

     

    Stol på kompileren, forstå engelsk og det den forsøker å fortelle deg. Den "tuller ikke" eller "babbler" slik som andre feilmeldinger ofte gjør i Windows.

     

    meldingen: "integer constant is too large for "long" type"

     

    konto1.settKontonr(36245564177); <== "integer constant"

     

    void settKontonr(unsigned long int kontonr); <== "long type"

     

    kjetil7 har allerede postet løsningen:

     

    #include <iostream>
    
    using namespace std;
    
    
    void accountNumber(unsigned long long account_number)
    {
     cout << "account_number: " << account_number << endl;
    }
    
    
    int main(int argc, char* argv[], char* env[])
    {
     accountNumber(36245564177LL);
     return 0;
    }
    

     

    lars@ibmr52:~/programming/c$ g++ -Wall -g blah.cpp -o blah && ./blah
    account_number: 36245564177
    

     

    edit:

    Dette er litt av grunnen til at det er lurt å kunne engelsk og bruke engelske bøker når man driver med programmering. (hva er "integer"? .. hva er "constant"?)

     

    edit2:

    Nevne også at det som regel kun er den første eller de to første meldingene fra kompileren man bør konsentrere seg om; resten er ofte følgefeil.

  15. oki..

    for å kalle VB i C.. hvordan gjør man dette?

     

    Man definerer callbacks på VB-siden. (et google-søk på "callbacks vb" gir noen treff)

     

    Callbacks er forøvrig en term som brukes i sammenheng med andre språk enn VB også. I Common Lisp definerer man callbacks v.h.a. CFFIs `defcallback'.

     

    "Callback" er altså en generel term, se her: http://en.wikipedia.org/wiki/Callback_%28computer_science%29

     

    Eller er det _mye_ bedre/lettere med Galde for C/VB-noobs som meg? :p

     

    Nei, du må forstatt kunne språket og forstå hva som skjer "under" - enten det er VB, C eller andre.

     

    edit: Det kan kanskje diskuteres om dette er viktigere i språk som C enn i språk som f.eks. Python og VB.

     

    Slike verktøy (bør) brukes av mennesker som allerede forstår hva som skjer slik at de kan spare tid. Forstår man ikke hva som skjer sitter man fast når man støter på problemer noe man _garantert_ gjør i ikke-trivielle sammenhenger.

     

    I tillegg har man under platformer (eller lukkede biblioteker fra MS generelt sett) som Win32 liten mulighet til å se (og dermed forstå) eller rette på det som skjer under lokket så der er ikke-triviell utvikling ennå mer tuklete. Derfor er det også der lurt å holde seg til åpne løsninger som f.eks. GTK+ der debug-symboler og kildekode følger med for å forbedre situasjonen litt.

     

    btw, e Glade bare for Linux?

    7092646[/snapback]

     

    Nei, Glade bruker GTK+ og genererer GUIer som vises v.h.a. (bruker) GTK+. GTK+ fungerer under både:

     

    * Linux

    * Mac

    * Windows

    * *BSD

    * m.fl.

  16. Nå forstår jeg ikke hva du mener:

     

    * Man kan kalle VB fra C

    * Man kan kalle C fra VB

     

    ..altså man kan kombinere bruken av språkene i samme prosjekt.. men så spørs det hva du er _ute etter_..

     

    * Om du er ute etter å tegne opp GUIer uten å måtte kode disse "manuelt" har man ting som Glade (GTK+).

     

    Det er altså ikke bare i VB dette er mulig. Ved hjelp av Glade navgir en widgets (knapper o.s.v.) en tegner opp og refererer siden til disse navnene i kode (samme om det er C eller hva) som definerer oppførsel.

     

    ..generelt sett kan man kombinere språk mer eller mindre som man ønsker selv; jeg kombinerer mye Lisp og C..

  17. legg en i både / og /bin .. den i / "viderefører kallet" til den i /bin

     

    det er noen år siden jeg surret med make, men jeg tror optionen -C er den du er ute etter

     

    $(MAKE) -C bin
    

     

    OT: har du vurdert Scons? -- ting man antar at er trivielle med make er ofte ikke det; slik er det ikke med Scons

  18. tightvnc; både win32 og *nix

     

    det følger forøvrig med en vnc-server i ubuntu

     

    angående administrering av linux-servere så er det langt mer vanlig (tror jeg) å bruke ssh (shell-tilgang) til dette

    7076251[/snapback]

    Av VNC-løsninger vil jeg heller anbefale RealVNC fremfor TightVNC.

    7076264[/snapback]

     

    hva er forskjellen(e) egentlig?

     

    nå er det i grunn rimelig sjeldent jeg bruker VNC siden SSH og SSHFS gjør alt jeg vil; men tightvnc har fungert de gangene jeg har hatt behov for remote-desktop-stuffs

×
×
  • Opprett ny...