30 berichten aan het bekijken - 1 tot 30 (van in totaal 36)
  • Q:
    Bijdrager
    Erik

    Help: C programmeurs hier aanwezig?

    Ik kan het niet laten. Ik weet het, ik had het niet moeten doen, kappen nou, is lastig, maar toch…

    Na wat leuke colorsync app-jes in applescript(studio) gebouwd te hebben, wil ik ‘iets’ meer over C en C++ weten, zodat ik de ware kracht van colorsync kan ontsluiten (command-line is voorlopg voldoende).

    Met zo’n 1600 pagina’s aan naslagwerk bij de hand heb ik m’n eerste C-appje kunnen maken, die overigens gewoon vanuit de command-line loopt, interfacing komt later wel.

    Eerste C app: Vraag aan het OS welke versie van ColorSync er draait, en print deze naar de console.

    Ik krijg ‘antwoord’, doch in Hex waarden: 0x1d84.
    Tenminste, dat is de enige wijze waarop ie werkt, anders krijg ik ‘warnings’ tijdens het builden.
    Ik had gehoopt om de normale versie terug te krijgen maar helaas.

    Is er iemand hier op het forum die het leuk vindt om mij hier mee op weg te helpen? De bron code is overigens snel gepost, want het zijn net 38 regels.

    Ik ben benieuwd.

    PS. de functie heet CMGetColorSyncVersion, en wordt hier beschreven.

    Met pre-compiled bedankjes,

    Erik

    Bijdrager
    Zout

    kun je die waarde niet gewoon omrekenen naar het decimale stelsel? welk getal krijg je er dan uit? (ben zelf niet zo goed in hexidecimaal rekenen…)

    Bijdrager
    Sad

    je zal toch iets meer moeten vertellen over wat je wil. wil je een gewone integer als antwoord? Dan kan je de hex waarde omzetten naar integer.

    Met welke functie krijg je deze waarde terug? Met welke functie krijg je wat je wel wil, maar dan met compile warnings? Welke warnings krijg je dan?

    Bijdrager
    savvy

    probeer dit eens:

    [code:1:fd43b8712b]#include <stdio.h>
    #include "/Developer/Headers/FlatCarbon/CMApplication.h"

    int main (int argc, const char * argv[]) {
    int version;
    CMGetColorSyncVersion((UInt32*)&version);
    printf("ColorSync version: %x.%xn", (version&0xFF00)>>8, version&0xFF);
    return 0;
    }[/code:1:fd43b8712b]
    ik weet alleen niet of het juist is.. is er een manier om de versie te controleren?

    Bijdrager
    araminta
    ”savvy”

    >>8

    Yeeehaaa, Bit shifts! Dat is fout joh.;)

    On topic: druk je niet per ongeluk het adres van de pointer af, en niet de waarde ervan? Ben niet zo thuis in die pointers, maar dat is wel een bekend foutje.

    Bijdrager
    savvy

    Hmm, denk je? wat is er dan precies fout:?
    [code:1:d1ca2f4ac5]
    Op apple’s site over ColorSync 3.0 API’s
    #define kColorSync3 0x00000300

    Dus daarmee heb ik de major en minor version uit geconcludeerd.

    mijn uitkomst was: 0x00000410
    ^^ major version
    ^^ minor version
    [/code:1:d1ca2f4ac5]
    Het zou best kunnen dat het fout is, maar ik weet daarom ook niet hoe ik mijn versie moet controlleren

    PS: ik weet zeker dat ik de pointer niet afdruk:) de waarde die Erik krijgt lijkt me wel sterk (0x1D84), dus misschien dat hij wel de pointer afdrukt.

    Bijdrager
    Erik

    Hey allen,

    Allereerst:

    ”erik”

    Ik krijg ‘antwoord’, doch in Hex waarden: 0x1d84.

    Als ik de functie anders ‘print’ krijg ik onderstaande warnings tijdens het compileren:

    printf(“Colorsync versie: %sn”, MySecondFunction);
    main.c:17: warning: char format, different type arg (arg 2)

    printf(“Colorsync versie: %dln”, MySecondFunction);
    main.c:17: warning: int format, pointer arg (arg 2)

    Overigens kan ik mij herinneren dat de uitleg van de betreffende functie ook al over een ‘pointer’ naar de colorsync versie spreekt. Dus dat is iets anders dan de letterlijke versie daadwerkelijk uitlezen?

    In decimale vorm werd het iets van ‘7558’ of iets dergelijks, maar dat is ook niet wat ik verwacht.

    ”colpolyp”

    je zal toch iets meer moeten vertellen over wat je wil.

    Ik wist dit eigenlijk van tevoren. Ik wil iets meer doen met C programmeren, en weet dat het heeeeeeel lastig is. Met daadwerkelijke eenvoudige voorbeelden hoop ik mezelf wat sneller op het goede pad te krijgen, zo heb ik het destijds ook met applescript gedaan, en ook tijdens het ‘veranderen’ van een C-SDK zodat ie goed door Applescript aan te roepen was (call functions).

    Ik zal in een nieuwe posting ff mijn volledige broncode plaatsen, het is maar een simpel voorbeeldje, en let ajb niet op de terminologie die ik bij de comments heb gebruikt, want de exacte termen ben ik nog niet machtig.

    Dank alvast, ik ga ook nog even met de andere voorbeelden aan de gang.

    Eerik

    Bijdrager
    Erik

    Hier dus de volledige broncode van mijn main.c (andere files gebruik ik niet, behalve dan de genoemde headers):

    [code:1:5dfd5d107a]
    #include <stdio.h>
    #include <ApplicationServices/ApplicationServices.h>

    //ProtoTypes, hier wordt de sub-routine kennelijk geïnitieerd
    void MyFirstFunction (void);
    void MySecondFunction (void);

    //De main is hetgeen wordt uitgevoerd zodra de app start

    int main (int argc, const char * argv[]) {
    // insert code here…

    MyFirstFunction();

    printf("Colorsync versie: %dln", MySecondFunction);

    return 0;
    }

    // Hier wordt de eerste sub-routine dus echt gebouwd
    void MyFirstFunction (void)
    {
    char *MyTextVar = "Hallo daar!";
    printf("%sn", MyTextVar);
    }

    // Hier wordt de tweede sub-routine dus echt gebouwd
    void MySecondFunction (void)
    {
    CMError CMGetColorSyncVersion (
    UInt32 * version
    );
    }

    [/code:1:5dfd5d107a]

    Bijdrager
    Erik

    O ja, hieronder de uitleg volgens Apple:

    Gets ColorSync version information.
    CMError CMGetColorSyncVersion (
    UInt32 * version
    );

    Parameter Descriptions
    version

    On output, points to the version of ColorSync installed on the system.

    function result
    See page for a description of the CMError data type.

    Discussion
    CMGetColorSyncVersion relieves you from having to call Gestalt to find out the version of ColorSync installed on the system.

    Availability
    Available in CarbonLib 1.0 and later when ColorSync 2.6 or later is present. Available in Mac OS X 10.0 and later.

    Header: CMApplication.h

    Bijdrager
    araminta
    ”savvy”

    Hmm, denk je? wat is er dan precies fout:?

    PS: ik weet zeker dat ik de pointer niet afdruk:) de waarde die Erik krijgt lijkt me wel sterk (0x1D84), dus misschien dat hij wel de pointer afdrukt.

    Hehe:D Ik bedoel fout als in een groene stropdas op een paars overhemd. Het werkt wel, maar het is volstrekt onleesbare code.:) Het is dus ‘not done’ eigenlijk.

    En ik bedoelde ook de code van Erik, niet die van jou.

    Ik ga er thuis ook mee klussen. Leuk!

    Bijdrager
    Erik

    Ik hoop dat ik jullie kan blijven volgen!:wink:

    Bijdrager
    savvy

    @Erik Koldenhof:
    Heb je mijn code wel geprobeerd???

    Niet om jouw te bekritiseren, maar je code zit vol met fouten:

    printf(“Colorsync versie: %dln”, MySecondFunction);

    Hier print je het address van de functie MySecondFunction.. het moet MySecondFunction() zijn om echt de waarde van MySecondFunction te printen.
    MySecondFunction heeft als return waarde void, dus hij returned niks:?
    Ook de functie MySecondFunction is verkeerd, hij doet niks.
    En met %dl bedoelde je waarschijnlijk %ld..

    Je hebt nog veel te leren:)

    ik heb jouw code een beetje bijgewerkt:
    [code:1:6d8ab1011b]
    #include <stdio.h>
    #include <ApplicationServices/ApplicationServices.h>

    //ProtoTypes, hier wordt de sub-routine kennelijk geïnitieerd
    //Correctie: Hier geef je de compiler aan dat deze functies bestaan
    //Dat is voor als je deze functies aanroept terwijl ze later pas worden gedefinieerd.
    int GetMajorColorSyncVersion();
    int GetMinorColorSyncVersion();

    //De main is hetgeen wordt uitgevoerd zodra de app start
    int main (int argc, const char * argv[]) {
    printf("Colorsync versie: %d.%dn", GetMajorColorSyncVersion(), GetMinorColorSyncVersion());
    return 0;
    }

    // Hier wordt de tweede sub-routine dus echt gebouwd
    int GetMajorColorSyncVersion() {
    UInt32 version;
    CMGetColorSyncVersion(&version);
    return (version&0xFF00)>>8;
    }

    int GetMinorColorSyncVersion() {
    UInt32 version;
    CMGetColorSyncVersion(&version);
    return version&0xFF;
    }[/code:1:6d8ab1011b]

    Bijdrager
    Erik

    @Savvy (en de anderen),

    hiep hiep, dit is precies waar ik heen wil. Lekker schieten op mijn eerste codes! Dank alvast!

    Ik heb de code van Savvy net even geprobeerd, maar die gaf een aantal fouten, ik ga er vanavond nog mee verder.

    En, please do extreem kritisch in deze!

    Ik ben volledig in het ‘blinde’ begonnen, met boeken en andere codes opschoot, en maar copy-pasten, etc. Daar leer ik het beste van.

    Maar Savvy, nogmaals bedankt voor deze eerste grondbeginselen ‘Wat doe ik fout’. Zo kan ik weer een avondje kloppen!

    PS. Nu begrijp ik echt helemaal niet meer hoe ik in vredesnaam de C-SDK van de EyeOne meter aan de praat heb kunnen krijgen, als ik al met dit soort fouten begin.

    Dus ipv ‘schrik-reactie’ van mijn kant, THANKS!

    Erik

    Bijdrager
    savvy
    ”araminta”

    Het werkt wel, maar het is volstrekt onleesbare code.:)

    ik vind het zeer leesbaar hoor:)

    Het feit dat de versie opgebouwd is in een WORD, met de major versie in de most significant byte, en de minor versie in de least signicant byte moet er geshift worden.

    Dus even wat makkelijker uitgelegd, de versie die de functie returned is opgebouwd uit 2 bytes, in de 1e byte staat de minor version, en in de 2e byte staat de major version. 2 bytes aan elkaar is het datatype WORD.
    Om de major versie uit deze WORD te halen moet er geshift worden,
    Ik zou geen ander makkelijkere manier kunnen bedenken:)

    hoop dat ik duidelijk ben geweest:D

    Bijdrager
    savvy
    ”Erik

    @Savvy (en de anderen),

    Ik heb de code van Savvy net even geprobeerd, maar die gaf een aantal fouten, ik ga er vanavond nog mee verder.

    Ik heb mijn code terug gecopypaste naar project builder maar dan geeft hij idd vage fouten aan, waarschijnlijk omdat er rare tekens worden meegecopieerd.

    je moet hem even overtypen dus:)

    Bijdrager
    Erik

    @Savvy,

    jou laatste code geeft mij dezelfde error als de eerste versie:
    warning prebinding disabled because of undefined symbols
    Undefined symbols:_CMGetColorSyncVersion

    Overigens krijg ik tijdens al mijn bouwwerken ook nog de volgende warnings (sinds een aantal updates geleden), ik weet niet of het er iets mee te maken heeft, anders wacht ik wel tot vrijdag (Panther):

    main.c:2: warning: could not use precompiled header ‘/System/Library/Frameworks/ApplicationServices.framework/Headers/ApplicationServices-gcc3.p’, because:
    main.c:2: warning: ‘AvailabilityMacros.h’ has different date than in precomp
    /System/Library/Frameworks/ApplicationServices.framework/Headers/ApplicationServices.h:20: warning: could not use precompiled header ‘/System/Library/Frameworks/CoreServices.framework/Headers/CoreServices-gcc3.p’, because:
    /System/Library/Frameworks/ApplicationServices.framework/Headers/ApplicationServices.h:20: warning: ‘AvailabilityMacros.h’ has different date than in precomp
    /System/Library/Frameworks/ApplicationServices.framework/Frameworks/HIServices.framework/Headers/AXUIElement.h:16: warning: could not use precompiled header ‘/System/Library/Frameworks/ApplicationServices.framework/Headers/ApplicationServices-gcc3.p’, because:
    /System/Library/Frameworks/ApplicationServices.framework/Frameworks/HIServices.framework/Headers/AXUIElement.h:16: warning: ‘AvailabilityMacros.h’ has different date than in precomp

    Overigens hebben deze warnings mijn andere bouwsels nooit in de weg gestaan om goed te werken….

    Erik

    Bijdrager
    Erik

    @Savvy,

    we zitten geloof gelijktijdig te posten,
    vanavond ga ik m ff handmatig overnemen.

    Thanks tot zover,
    ga ff happie eten.

    Erik

    Bijdrager
    savvy

    Maak zeker dat je hem linked tegen ApplicationServices.framework.

    dus by files in de linker pane:
    rechterklik->add frameworks->ApplicationServices.framework

    eet smakelijk:)

    Bijdrager
    araminta
    ”savvy”

    hoop dat ik duidelijk ben geweest:D

    Zeker wel:)

    Al wist ik al wel wat bit shiften was hoor. En in dit geval is het inderdaad erg logisch en zelfs gebruikelijk. Ik zat ook maar wat te geinen: ik zie niet iedere dag bit shifts meer namelijk.:)

    Overigens kon het niet het adres van de pointer zijn, want een pointer is 32 bits, toch? Maar goed, mosterd ruim na de maaltijd.

    Leuk projectje Erik, hou ons op de hoogte, kunnen vast wel een beetje helpen.

    Bijdrager
    Erik

    OK, Wanneer ik de juiste FrameWork toeken aan het project, dan geen warnings meer, en compile duurt nu 2 seconden ipv 30 sec.
    De errors die ik eerder kreeg, zijn nu ook weg.

    Op basis van de de eerdere info ga ik met m’n volgende grap verder:
    Het bepalen van het ‘default system profile’ (oftewel, het profiel dat staat geselecteerd onder je System Prefs: Monitor:Color).

    Volgens de colorSync Manager Reference, heb ik hiervoor de volgende functie nodig:

    CMGetSystemProfile: Obtains a reference to the current system profile.

    [code:1:e936a968ed]
    CMError CMGetSystemProfile (
    CMProfileRef * prof
    );
    [/code:1:e936a968ed]

    Parameter Descriptions

    prof
    A pointer to a profile reference of type CMProfileRef. On return, a reference to the current system profile.

    Dit gaat denk ik nog wel ff duren vrees, maar we gaan het proberen!

    Dat word lachen,

    Erik

    Bijdrager
    Erik

    volgende update…

    ik heb nu het volgende onder Prototypes opgenomen:
    [code:1:8e7323c5ed]char GetMySystemProfile();[/code:1:8e7323c5ed]

    In mijn main is dit toegevoegd:
    [code:1:8e7323c5ed]printf("Default System Profile: %sn", GetMySystemProfile());[/code:1:8e7323c5ed]

    En de functie zelf ziet er als volgt uit:
    [code:1:8e7323c5ed]char GetMySystemProfile()
    {
    char prof;
    CMError CMGetSystemProfile (
    CMProfileRef * prof
    );
    return prof;
    }
    [/code:1:8e7323c5ed]

    Resultaten:
    – wanneer ik de printout opmaak met ‘%c’, blijft ie leeg…
    – Wanneer ik de printout opmaak met ‘%s’, geeft ‘ie (null).

    Mijn uitleg van wat ik denk dat ik gedaan heb:
    Het prototype is gedefinieerd, waarbij ik denk dat de uitkomst van hele functie gegevens van het type ‘char’ mag bevatten (ik verwacht een profiel-naam of path terug?).

    De opmaak van de print-out lijkt me iets als tekenreeks te moeten zijn?

    De functie zelf:
    char prof; maakt de variabele ‘prof’ aan van het type char, welke door de CMGetSystemProfile gevuld wordt, waarna deze door de return teruggeven wordt (en dus voor de print-out gebruikt kan worden).

    OK, hij doet het dus nog niet goed, ik ga nog ff verder snuffelen in de boeken en andere broncodes die ik hier heb.

    Als iemand al eerder kan vertellen wat ik nou weer loop te bazelen, ge zijt meer dan welkom!

    Erik

    Bijdrager
    savvy

    ik heb het volgende even gebakken:

    [code:1:6514871a50]#include <stdio.h>
    #include <ApplicationServices/ApplicationServices.h>

    int main (int argc, const char * argv[]) {
    CMProfileRef prof;
    CMProfileLocation profLoc;

    CMGetSystemProfile(&prof);
    CMGetProfileLocation(prof, &profLoc);
    printf("profile location: %cn", profLoc.u.pathLoc.path);

    return 0;
    }[/code:1:6514871a50]

    maar geeft rare tekens weer, waarschijnlijk omdat het unicode is ofzo?
    jammer genoeg kan project builder geen autocomplete, (XCode wel?) dus makkelijskte om achter al die datatypes te komen is om even een breakpoint te zetten bij CMGetProfileLocation, daarna een step te doen, en je ziet de inhoud van profLoc.. alleen heb ik geen idee wat ik met die informatie moet:)

    @Erik:
    jouw functie GetMySystemProfile doet eigenlijk alleen dit: return prof;
    Je roept CMGetSystemProfile niet eens aan, je geeft alleen de prototype aan.

    Bijdrager
    Erik
    ”savvy”

    .. alleen heb ik geen idee wat ik met die informatie moet:)

    Weer wat om mee te puzzelen, ik zie dat je de codes heel anders opbouwt dan zoals Apple ze neerzet op het web, maar goed als het werkt komen we een heel eind.

    Ik verwacht van deze functie:
    – een pad naar het daadwerkelijke profiel, of
    – de filename van het profiel.

    Ik ga verder met je codes, Thanks again!

    PS. Doe je deze C grappen als hobby of professioneel?

    Erik

    Bijdrager
    savvy

    puur als hobby:)

    dit is trouwens de eerste keer dat ik met project builder werk:)
    Maar wanneer Panther er is ga ik wel fanatiek in xcode programeren:P

    btw: voor zover ik weet bouw ik het niet anders op als apple, ik doe alleen geen error checking..

    Bijdrager
    savvy

    Ik weet zeker dat die path in unicode is:)

    alleen kan je het niet printen met printf, en er is geen wchar support.
    Heb wel het volgende kunnen vinden op google:

    Actually, there is a simple answer. Get Panther (Mac OS X 10.3) when
    it is released (or seeded to registered developers). It supports wide
    characters, including wchar.h, langinfo.h and the various wide
    character/string routines.

    Dat wordt dus even wachten op Panther:)

    Je zou het wel zelf kunnen formatten naar multibyte met een eigen functie..

    Bijdrager
    Erik

    OK, Top! nog ff wachten dus (althans voor deze functie typen)…

    Ik zit nu overigens te staren naar al die code, en geloof dat ik nu ook begrijp wat mijn dochter van 6 nu ziet nou ze met lezen begint:
    -Je denkt dat je weet wat je leest, maar begrijpt er eigenlijk helemaal niets van :sealed:

    Maar, ik ga stug door!

    Bijdrager
    savvy

    Ik vind die Apple API’s ook ingewikkeld daarom:)
    Ik vind ze ook niet supergoed gedocumenteerd (en zijn waarschijnlijk ook outdated). Soms mist er informatie, zoals met die versie, er stond nergenst hoe de versie systeem werkte, dat heb ik dan weer zelf moeten uitzoeken aan de hand van wat andere voorbeelden.

    Trouwens met NSString kan je ook unicode strings formateren en printen.
    Maar daar heb ik nooit meegewerkt, waarschijnlijk werkt het ook niet in een commandline applicatie.

    Bijdrager
    araminta
    Bijdrager
    Erik

    Hey araminta,

    Bedankt voor de link, het blijkt dat ik ‘m al heb staan op m’n HD, en ga er ook nog ’s goed mee aan de gang.

    Zit nu te stoeien met het boek ‘C++ Grand Cru’.
    Ben nu aangeland bij pointers en ‘*’, nu wordt het ff doorknagen, want ik begrijp niets van dat ‘*’ :sealed:

    Maar goed, we blijven gewoon doorgaan!

    De leercurve is inderdaad zoals velen mij al hebben verteld, extreem stijl, maar ja, dan had ik maar een vak moeten leren.

    Erik

    Bijdrager
    Erik

    o ja, in het boek beginnen ze nu ook met ‘strings’ te werken, maar die kan ik niet standaard gebruiken?

    weet iemand een header file daarvoor uit zijn/haar hoofd?

    thanks,

    erik

30 berichten aan het bekijken - 1 tot 30 (van in totaal 36)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.