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

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...)

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?

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?

[quote:0d3e49da49="savvy"]>>8[/quote:0d3e49da49]

Yeeehaaa, Bit shifts! Dat is fout joh. :wink:

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.

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 :slight_smile: de waarde die Erik krijgt lijkt me wel sterk (0x1D84), dus misschien dat hij wel de pointer afdrukt.

Hey allen,

Allereerst:

[quote:d33a661a21=“erik”]Ik krijg ‘antwoord’, doch in Hex waarden: 0x1d84.[/quote:d33a661a21]
Als ik de functie anders ‘print’ krijg ik onderstaande warnings tijdens het compileren:

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

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

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.

[quote:d33a661a21=“colpolyp”]je zal toch iets meer moeten vertellen over wat je wil.[/quote:d33a661a21]
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

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 &#40;void&#41;;
void MySecondFunction &#40;void&#41;;

//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]

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

[quote:98ccbc9cc5="savvy"]Hmm, denk je? wat is er dan precies fout :?

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

Hehe :smiley: Ik bedoel fout als in een groene stropdas op een paars overhemd. Het werkt wel, maar het is volstrekt onleesbare code. :slight_smile: 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!

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

@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 :slight_smile:

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]

@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

[quote:cb2e16022c="araminta"]Het werkt wel, maar het is volstrekt onleesbare code. :)[/quote:cb2e16022c] 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 :slight_smile:

hoop dat ik duidelijk ben geweest :smiley:

[quote:70793fa99f="Erik Koldenhof"]@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.
[/quote:70793fa99f]

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 :slight_smile:

@Savvy,

jou laatste code geeft mij dezelfde error als de eerste versie:
[i:15fbca334e]warning prebinding disabled because of undefined symbols
Undefined symbols:_CMGetColorSyncVersion[/i:15fbca334e]

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):
[i:15fbca334e]
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
[/i:15fbca334e]

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

Erik

@Savvy,

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

Thanks tot zover,
ga ff happie eten.

Erik

Maak zeker dat je hem linked tegen ApplicationServices.framework.

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

eet smakelijk :slight_smile:

[quote:9ee3a47c53="savvy"]hoop dat ik duidelijk ben geweest :D[/quote:9ee3a47c53]

Zeker wel :slight_smile:

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. :slight_smile:

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.

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