Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie

C

Datumbereik

Categorieën

AND

Onderwerpen

AND

Subforum

Topicstarter

Topicstatus

103 topics - Pagina 1 van 5

[pic32, C]:variabele lengte struct array dynamisch alloceren

07-07-2015 discussie 6
Hallo

Ik loop een beetje tegen een programmeerkennis muur aan , hopelijk kunnen jullie mij hiermee helpen.
Ik wil diverse plaatjes inladen vanaf een sd kaart om op het juiste moment op een scherm te laten zien. Het gaat om teveel data om in ram te laten staan, dus moet het anders.

Nu heb ik per "schermelement" een struct met data over het element (bijvoorbeeld, afmetingen, beginlocatie etc). Echter is er van tevoren niet bekend hoe groot de array van element structs wordt. En daar gaat het mis voor mij.

Er zijn meerdere soorten elementen, maar ik houd het nu even bij 1.

De struct voor een plaatje heb ik als volgt gedefinieerd:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 typedef struct image_element { unsigned char conditional; unsigned char datafield; unsigned char comparisonType; unsigned char compareValue; unsigned char *filename; unsigned char active; unsigned short xSize; unsigned short ySize; unsigned short xStart; unsigned short yStart; }screen_image_element;
In de main routine wordt hiervoor een array gedeclareerd, maar doordat de benodigde lengte niet bekend is nog niet geinitialiseerd:
code:
1 screen_image_element image_elements[];
Mijn idee was als volgt:
code:
1 2 3 4 5 6 7 Een functie parst de data in een bestand naar een tijdelijke screen_image_element struct (dit werkt). Als image_elements[] nog leeg is (wordt apart bijgehouden) wil ik hem dan initialiseren. idee 1:image_elements = tijdelijke_struct (met het idee dat het dan een 1-velds array wordt, maar werkt niet) idee2: image_elements = malloc(sizeof(tijdelijke struct) image_elements[0] = tijdelijke struct idee 3: image_elements = realloc(image_elements, sizeof(tijdelijke stuct) image_elements[0] = tijdelijke struct
Hier loopt het al stuk. Ik krijg het maar niet voor elkaar.
Voordat ik nog uren ga zitten staren, kan wat ik wil wel?
mijn programmeerkennis wordt hier duidelijk flink gestretcht.

alvast bedankt
Tim

[C] Voorkomen van deadlock in programma structuur

06-07-2015 discussie 35
Inleiding
Na lang zelf geprobeerd te hebben een oplossing te vinden voor onderstaande probleem heb ik toch besloten om jullie om raad te vragen.



De belangrijkste taken van mijn programma zijn het ontvangen en verzenden van data.

- Het doel van de ontvanger is het verwerken van interrupts tot betekenisvolle data. Het doel van de zender is het verzenden van die data. Voor het op te lossen probleem maakt het niet uit of dit nu het verzenden en ontvangen van IR data is of 433.92Mhz enz.
- Het doel van de broadcaster is om alle acties die er in het programma gebeuren (via een API) te delen met externe programma's.
- Aanvullend biedt mijn programma ook de mogelijkheid van eventing en biedt het een ingebouwde webGUI aan.

Om alles zonder al te veel vertraging te laten lopen werkt het geheel van een aantal threadsafe queues. Dat betekent dat de ontvanger, zender en broadcaster logica telkens uit twee functie bestaan (zie verderop). In het geval van de ontvanger is er één functie die de ontvanger lijst vult en één functie die de ontvanger lijst uitleest. Dit heb ik toen zo geïmplementeerd zodat ik er zeker van kon zijn dat ik geen belangrijke informatie mis aan de ontvangst kant mocht de broadcaster te lang bezig zijn met zijn taak. Uiteindelijk heb ik die logica doorgetrokken in alle functionaliteit die in dit schema te zien is.

Om het probleem goed te doorgronden is het dus goed om te weten dat mijn programma nu gebruik maakt van de volgende threads:
- receive_queue / receive_process
- send_queue / send_process
- broadcast_queue / broadcast_process
- events_queue / events_process
- webserver_queue / webserver_process

Zoals gebruikelijk word de consistentie van de queue's bewaakt door locks:
code:
1 2 3 4 [lock] vul queue [unlock] [signal]
Probleem
Zoals ik in de titel aangeef ontstaat hier het risico van een deadlock. Een gangbare flow van het programma is als volgt.
code:
1 Receiver > Broadcast > Event > Sender > Broadcast
Er wordt een bepaalde code ontvangen, die wordt door de broadcaster doorgestuurd naar de eventing functionaliteit. De gebruiker heeft bepaald dat er aan de hand van deze code een andere code moet worden verzonden. De zender functie verteld vervolgens weer aan de broadcaster dat er iets verzonden is zodat er daaropvolgende weer een event kan plaatsvinden en ook de GUIs de kans krijgen om de verandering te visualiseren.

Zoals te zien is ontstaat het probleem op het moment dat de eerste broadcast functie nog bezig is op het moment dat hij weer opnieuw aangeroepen wordt. De oude lock is nog niet vrijgegeven terwijl er nieuwe wordt aangevraagd.

In de basis van zenden / ontvangen en broadcasten werkte alles prima. Nu echter deze problemen zich voordoen kom ik tot de conclusie dat deze implementatie zo niet houdbaar is voor de huidige complexiteit.

Tussenoplossing
Om het geheel toch werkend te krijgen is alle functionaliteit die afhankelijk is van de broadcaster nu via een socket verbinding aan het geheel geknoopt. Hierdoor draaien de GUIs en de eventing functionaliteit eigenlijk als aparte programma's naast het hoofdprogramma.

Zelf bedacht alternatief
Andere ideeën die ik had was het creëren van een soort event-driven-functionaliteit / observer pattern. De receiver laat weten dat er een code is ontvangen, deze triggered een functie die nagaat welke geregistreerde functies er geïnteresseerd zijn in deze informatie en voert deze functies uit.

Het probleem hiervan is dat dit (naar mijn idee) alleen werkt wanneer deze functies ook weer threaded worden gestart, omdat je anders opnieuw het risico loopt dat een trage GUI de receiver kan blokkeren. Elke thread krijgt dan een kopie van de data zodat je ook niet aan een threadsafe queue vast zit. Zou ik per event een nieuwe thread moeten starten, dan worden er in het ergste geval een tientallen keren per seconde threads gestart en weer gestopt. Dat is dus ook niet ideaal, maar zou in theorie wel alternatief kunnen zijn voor mijn probleem.

Andere oplossingen?
En op dat punt kwam ik er niet meer uit en besloot ik maar weer eens zelf een vraag te stellen

[C] Waarde ophalen uit key dictionary

24-06-2015 discussie 12
Gm,

Ik heb het volgende issue. Via een JS haal ik een waarde op uit een API. Middels een KEY dictionary schrijf ik deze code weg. Nu wil ik in C de waarde weer ophalen en er vervolgens mee aan de slag.

Ik heb op allerlei forums gezocht welke code ik dan in C zou kunnen gebruiken, maar kom er niet uit. Daarnaast weet ik niet waar ik de code dan in de C zou moeten schrijven om te gebruiken, daarom ook die code.

Zou volgens mij met een vrij simpel commando moeten, maar zoals gezegd geen idee welke dat is....

Hoop dat iemand me op weg kan helpen! Thx!

Zo schrijf ik de code weg in JS:
JavaScript:
1 2 3 4 5 //Construct a key-value dictionary var dict = {"KEY_LOCATION" : location, "KEY_TEMPERATURE": temperature}; //Send data to watch for display Pebble.sendAppMessage(dict);
;

In deze code wil ik de waarde terug laten komen als s_num_drinks
C:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 #include "pebble.h" #define REPEAT_INTERVAL_MS 50 // This is a custom defined key for saving our count field #define NUM_DRINKS_PKEY 1 // You can define defaults for values in persistent storage #define NUM_DRINKS_DEFAULT 0 static Window *s_main_window; static ActionBarLayer *s_action_bar; static TextLayer *s_header_layer, *s_body_layer, *s_label_layer; static GBitmap *s_icon_plus, *s_icon_minus; static int s_num_drinks = NUM_DRINKS_DEFAULT; static void update_text() { static char s_body_text[18]; snprintf(s_body_text, sizeof(s_body_text), "%u Bottles", s_num_drinks); text_layer_set_text(s_body_layer, s_body_text); } static void increment_click_handler(ClickRecognizerRef recognizer, void *context) { s_num_drinks++; update_text(); } static void decrement_click_handler(ClickRecognizerRef recognizer, void *context) { if (s_num_drinks <= 0) { // Keep the counter at zero return; } s_num_drinks--; update_text(); } static void click_config_provider(void *context) { window_single_repeating_click_subscribe(BUTTON_ID_UP, REPEAT_INTERVAL_MS, increment_click_handler); window_single_repeating_click_subscribe(BUTTON_ID_DOWN, REPEAT_INTERVAL_MS, decrement_click_handler); } static void main_window_load(Window *window) { Layer *window_layer = window_get_root_layer(window); s_action_bar = action_bar_layer_create(); action_bar_layer_add_to_window(s_action_bar, window); action_bar_layer_set_click_config_provider(s_action_bar, click_config_provider); action_bar_layer_set_icon(s_action_bar, BUTTON_ID_UP, s_icon_plus); action_bar_layer_set_icon(s_action_bar, BUTTON_ID_DOWN, s_icon_minus); int width = layer_get_frame(window_layer).size.w - ACTION_BAR_WIDTH - 3; s_header_layer = text_layer_create(GRect(4, 0, width, 60)); text_layer_set_font(s_header_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24)); text_layer_set_background_color(s_header_layer, GColorClear); text_layer_set_text(s_header_layer, "Drink Counter"); layer_add_child(window_layer, text_layer_get_layer(s_header_layer)); s_body_layer = text_layer_create(GRect(4, 44, width, 60)); text_layer_set_font(s_body_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); text_layer_set_background_color(s_body_layer, GColorClear); layer_add_child(window_layer, text_layer_get_layer(s_body_layer)); s_label_layer = text_layer_create(GRect(4, 44 + 28, width, 60)); text_layer_set_font(s_label_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18)); text_layer_set_background_color(s_label_layer, GColorClear); text_layer_set_text(s_label_layer, "of drinks on the wall"); layer_add_child(window_layer, text_layer_get_layer(s_label_layer)); update_text(); } static void main_window_unload(Window *window) { text_layer_destroy(s_header_layer); text_layer_destroy(s_body_layer); text_layer_destroy(s_label_layer); action_bar_layer_destroy(s_action_bar); } static void init() { s_icon_plus = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_ACTION_ICON_PLUS); s_icon_minus = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_ACTION_ICON_MINUS); // Get the count from persistent storage for use if it exists, otherwise use the default s_num_drinks = persist_exists(NUM_DRINKS_PKEY) ? persist_read_int(NUM_DRINKS_PKEY) : NUM_DRINKS_DEFAULT; s_main_window = window_create(); window_set_window_handlers(s_main_window, (WindowHandlers) { .load = main_window_load, .unload = main_window_unload, }); window_stack_push(s_main_window, true); } static void deinit() { // Save the count into persistent storage on app exit persist_write_int(NUM_DRINKS_PKEY, s_num_drinks); window_destroy(s_main_window); gbitmap_destroy(s_icon_plus); gbitmap_destroy(s_icon_minus); } int main(void) { init(); app_event_loop(); deinit(); }

[Arduino / C] Bitshift omzetten

17-06-2015 discussie 13
Ik ben bezig een applicatie voor Arduino om te zetten naar een C applicatie om te draaien op een NRF51 van Nordic Semi. Over i2c lees ik een accelerometer uit en doe vervolgens wat met die data.

In Arduino is de code als volgt:
C:
1 2 3 4 5 6 7 8 9 10 byte Buffer[6]; short AccelRaw_x, AccelRaw_y, AccelRaw_z; float Accel_x, Accel_y, Accel_z; readReg(addr_A, LSM330D_OUT_X_L_A, 6, Buffer); AccelRaw_x = ((Buffer[1] << 8) | Buffer[0]); AccelRaw_x = AccelRaw_x >> 4; Accel_x = AccelRaw_x * 0.001;
Voor de native applicatie heb ik er het volgende van gemaakt:
C:
1 2 3 4 5 6 7 8 9 10 uint8_t Buffer[6]; short AccelRaw_x, AccelRaw_y, AccelRaw_z; float Accel_x, Accel_y, Accel_z; readI2cData(LSM330D_A_ADDR0,LSM330D_OUT_X_L_A,Buffer,6); AccelRaw_x = ((Buffer[1] << 8) | Buffer[0]); AccelRaw_x = AccelRaw_x >> 4; Accel_x = AccelRaw_x * 0.001;
Zoals te zien nagenoeg hetzelfde. De resultaten zijn dat echter niet. Op Arduino krijg ik het volgende:
C:
1 2 3 4 5 Buffer[0] = 96 Buffer[1] = 254 AccelRaw_x (1) = -416 AccelRaw_x (2) = -26 Accel_x = -0.03
In de native applicatie gebeurt echter het volgende:
C:
1 2 3 4 5 Buffer[0] = 96 Buffer[1] = 254 AccelRaw_x (1) = 24672 AccelRaw_x (2) = 1542 Accel_x = 1.542
De bitshift en bitwise OR zouden volgens mij hetzelfde moeten doen maar ik kan zelf het verschil in resultaat niet verklaren. Iemand die me een zetje in de goede richting kan geven?

Segmentation fault in C, veroorzaakt door asprintf

26-05-2015 discussie 14
Ik probeer een C programma te debuggen, wat compiled, echter ik krijg een segmentation fault zodra het programma uitgevoerd wordt. Als ik de asprint regel uitzet door er commentaar van te maken geeft het programma geen fout bij uitvoerne. Op internet gezocht hoe dit opgelost kan worden, geen oplossing gevonden. Wel een hint naar Valgrind. Ik compile onder linux met: gcc segfault.c -g
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> #include <stdlib.h> #include <string.h> //#include <curl/curl.h> int main(void) { char aa=0;char ab=0; const char validurlchar[38]= "abcdefghijklmnopqrstuvwxyz0123456789-_"; char* source; asprintf(&source,"%s%s%.nl",validurlchar[aa],validurlchar[ab]); free(source); }
valgrind --leak-check=full -v ./a.out
geeft:
==2646== Memcheck, a memory error detector
==2646== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==2646== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==2646== Command: ./a.out
==2646==
--2646-- Valgrind options:
--2646-- --leak-check=full
--2646-- -v
--2646-- Contents of /proc/version:
--2646-- Linux version 3.16.7-21-desktop (geeko@buildhost) (gcc version 4.8.3 20140627 [gcc-4_8-branch revision 212064] (SUSE Linux) ) #1 SMP PREEMPT Tue Apr 14 07:11:37 UTC 2015 (93c1539)
--2646-- Arch and hwcaps: AMD64, LittleEndian, amd64-cx16-lzcnt-rdtscp-sse3-avx-bmi
--2646-- Page sizes: currently 4096, max supported 4096
--2646-- Valgrind library directory: /usr/lib64/valgrind
--2646-- Reading syms from /home/roel/a.out
--2646-- Reading syms from /lib64/ld-2.19.so
--2646-- Reading syms from /usr/lib64/valgrind/memcheck-amd64-linux
--2646-- object doesn't have a symbol table
--2646-- object doesn't have a dynamic symbol table
--2646-- Scheduler: using generic scheduler lock implementation.
--2646-- Reading suppressions file: /usr/lib64/valgrind/default.supp
==2646== embedded gdbserver: reading from /tmp/vgdb-pipe-from-vgdb-to-2646-by-roel-on-WHYN-001
==2646== embedded gdbserver: writing to /tmp/vgdb-pipe-to-vgdb-from-2646-by-roel-on-WHYN-001
==2646== embedded gdbserver: shared mem /tmp/vgdb-pipe-shared-mem-vgdb-2646-by-roel-on-WHYN-001
==2646==
==2646== TO CONTROL THIS PROCESS USING vgdb (which you probably
==2646== don't want to do, unless you know exactly what you're doing,
==2646== or are doing some strange experiment):
==2646== /usr/lib64/valgrind/../../bin/vgdb --pid=2646 ...command...
==2646==
==2646== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==2646== /path/to/gdb ./a.out
==2646== and then give GDB the following command
==2646== target remote | /usr/lib64/valgrind/../../bin/vgdb --pid=2646
==2646== --pid is optional if only one valgrind process is running
==2646==
--2646-- REDIR: 0x4017810 (ld-linux-x86-64.so.2:strlen) redirected to 0x3806bd01 (???)
--2646-- Reading syms from /usr/lib64/valgrind/vgpreload_core-amd64-linux.so
--2646-- object doesn't have a symbol table
--2646-- Reading syms from /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so
--2646-- object doesn't have a symbol table
==2646== WARNING: new redirection conflicts with existing -- ignoring it
--2646-- old: 0x04017810 (strlen ) R-> (0000.0) 0x3806bd01 ???
--2646-- new: 0x04017810 (strlen ) R-> (2007.0) 0x04c2c730 strlen
--2646-- REDIR: 0x40175c0 (ld-linux-x86-64.so.2:index) redirected to 0x4c2c2e0 (index)
--2646-- REDIR: 0x40177e0 (ld-linux-x86-64.so.2:strcmp) redirected to 0x4c2d880 (strcmp)
--2646-- REDIR: 0x4018510 (ld-linux-x86-64.so.2:mempcpy) redirected to 0x4c30330 (mempcpy)
--2646-- Reading syms from /lib64/libc-2.19.so
--2646-- REDIR: 0x4eba530 (libc.so.6:strcasecmp) redirected to 0x4a23770 (_vgnU_ifunc_wrapper)
--2646-- REDIR: 0x4ebc820 (libc.so.6:strncasecmp) redirected to 0x4a23770 (_vgnU_ifunc_wrapper)
--2646-- REDIR: 0x4eb9cb0 (libc.so.6:memcpy@GLIBC_2.2.5) redirected to 0x4a23770 (_vgnU_ifunc_wrapper)
--2646-- REDIR: 0x4eb8030 (libc.so.6:rindex) redirected to 0x4c2bfc0 (rindex)
--2646-- REDIR: 0x4eb06e0 (libc.so.6:malloc) redirected to 0x4c290a0 (malloc)
--2646-- REDIR: 0x4ec0ec0 (libc.so.6:strchrnul) redirected to 0x4c2ff40 (strchrnul)
==2646== Invalid read of size 1
==2646== at 0x4E7CF80: vfprintf (in /lib64/libc-2.19.so)
==2646== by 0x4EA67C2: vasprintf (in /lib64/libc-2.19.so)
==2646== by 0x4E85806: asprintf (in /lib64/libc-2.19.so)
==2646== by 0x400623: main (in /home/roel/a.out)
==2646== Address 0x61 is not stack'd, malloc'd or (recently) free'd
==2646==
==2646==
==2646== Process terminating with default action of signal 11 (SIGSEGV)
==2646== Access not within mapped region at address 0x61
==2646== at 0x4E7CF80: vfprintf (in /lib64/libc-2.19.so)
==2646== by 0x4EA67C2: vasprintf (in /lib64/libc-2.19.so)
==2646== by 0x4E85806: asprintf (in /lib64/libc-2.19.so)
==2646== by 0x400623: main (in /home/roel/a.out)
==2646== If you believe this happened as a result of a stack
==2646== overflow in your program's main thread (unlikely but
==2646== possible), you can try to increase the size of the
==2646== main thread stack using the --main-stacksize= flag.
==2646== The main thread stack size used in this run was 8388608.
--2646-- REDIR: 0x4eb0d20 (libc.so.6:free) redirected to 0x4c2a310 (free)
==2646==
==2646== HEAP SUMMARY:
==2646== in use at exit: 100 bytes in 1 blocks
==2646== total heap usage: 1 allocs, 0 frees, 100 bytes allocated
==2646==
==2646== Searching for pointers to 1 not-freed blocks
==2646== Checked 66,720 bytes
==2646==
==2646== LEAK SUMMARY:
==2646== definitely lost: 0 bytes in 0 blocks
==2646== indirectly lost: 0 bytes in 0 blocks
==2646== possibly lost: 0 bytes in 0 blocks
==2646== still reachable: 100 bytes in 1 blocks
==2646== suppressed: 0 bytes in 0 blocks
==2646== Reachable blocks (those to which a pointer was found) are not shown.
==2646== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==2646==
==2646== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
==2646==
==2646== 1 errors in context 1 of 1:
==2646== Invalid read of size 1
==2646== at 0x4E7CF80: vfprintf (in /lib64/libc-2.19.so)
==2646== by 0x4EA67C2: vasprintf (in /lib64/libc-2.19.so)
==2646== by 0x4E85806: asprintf (in /lib64/libc-2.19.so)
==2646== by 0x400623: main (in /home/roel/a.out)
==2646== Address 0x61 is not stack'd, malloc'd or (recently) free'd
==2646==
==2646== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Segmentation fault

Hoe kan ik dit oplossen?

[C] Ip address probleem

07-05-2015 discussie 8
Hallo, ik ben bezig met de OSCP security training en heb voor een lab (meteen een disclaimer dus: nee ik doe niks illegaals, dit is mijn werk) een exploit gevonden. Ik heb 'm hier en daar wat aangepast met die zeer gelimiteerde kennis van programmeren die ik helaas nog heb...

Nu loop ik tegen een probleem aan... Hier volgt een stukje code van een publieke exploit van CUPS:

http://sebug.net/paper/Ex...s/0301-exploits/sigcups.c
C:
1 2 3 4 5 6 7 8 9 10 11 12 13 #define BUF_SIZE 4096 #define die(a) { perror("[!] "a); exit(-1); } int verbose = 0; char *host = "127.0.0.1"; int port = 631; unsigned long retaddr = 3232239841; /* exploit: *($retaddr * 4) = $address_of_shellcode */ char greet[] = "POST /jobs HTTP/1.1\nContent-type: application/x-www-form-urlencoded\nContent-length: %d\n\n"; char evilmsg[] = "-%u="; /*
Hierin heb ik het originele retaddr vervangen van 805289688 naar 3232239841 (de int waarde van 192.168.16.225)

Als Ik de code nu compile lijkt die waarde nu te groot te zijn voor "unsigned long"?

Hoe krijg ik dit nu toch aan de praat zonder dat het impact heft op the hele lijn code (incl erachter)?

de error:

gcc ./cups.c
./cups.c:38:1: warning: this decimal constant is unsigned only in ISO C90 [enabled by default]

van webinterface naar raspberry en verder

30-04-2015 discussie 3
Beste Tweakers,

Voor een project wil ik een via 1 webinterface, waar ik een form heb met wat inputs, een paar arduino aanspreken. De communicatie tussen de arduino en de server is het probleem niet.
Het probleem is dat de web interface een reeks get commandos ontvangt van de webinterface. Deze get commandos moeten dan verwerkt worden door een programma/script, die vervolgens de arduino's aanspreekt.

Ik had eigenlijk wel verwacht dat half het internet vol stond met soort gelijke projecten, maar dat val vies tegen.

Ik zou op zich zelf wel een stukje c code kunnen schrijven die als het ware apache vervangt, die afhankelijk wat voor get commando er binnen komt, of een html pagina naar de client stuurt, of de arduino's aanspreekt.
Echt lijkt het mij verre van ideaal, om in hardcore c een webinterface te gaan schrijven.

Hebben jullie misschien suggesties hoe ik dit zou kunnen aanpakken?

Met vriendelijke groet,

Flammert

Ps: er word gewoon gebruik gemaakt van linux (natuurlijk)

vragen over strings in c

21-10-2014 discussie 45
Hoi,

ik ben pas begonnen met c en ik probeer nu alles rond strings een beetje te begrijpen.
nu heb ik nog een paar vragen waar ik zelf niet uitkom

zo wil ik bijvoorbeeld een string kunnen splitsen bij een bepaald teken, dus bijvoorbeeld:
hoi&hallo
en dat hij dan & ziet als scheidingsteken en er dan losse woorden van maakt dus hoi hallo.

ook ben ik benieuwd naar als ik een string heb:
Ik hou van lekkere tomatensoep.

dat ik dan bijvoorbeeld alle e's kan vervangen in een *
dus dan krijg je

Ik hou van l*kk*r* tomat*nso*p

zou iemand mij hier misschien mee kunnen helpen. kom er zelf namelijk niet uit.

Groetjes Teun

Probleempje met C

09-03-2014 discussie 58
Ik ben aan het leren programmeren in C. Hieronder staat mijn programma, dat het gemiddelde berekent. Als de gebruiker -1 typt, stopt het programma en toont het gemiddelde van alle ingetypte getallen.
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <stdio.h> main() { float stTest, avg, total = 0.0; int numTest; avg=total/numTest; return 0; for (numTest = 0; numTest ==25; numTest++){ printf("\nWat is het volgende getal? "); scanf(" %f", %stTest); if (stTest == -1){ break; } total += stTest; } avg=total/numTest; printf("%f",avg); return 0; }
Maar ik krijg bij het compilen volgende error:
main.c:9:22: error: expected expression before ‘%’ token
scanf(" %f", %stTest);

Kan iemand mij helpen?

[C] Netste methode om constantes te includen

02-02-2014 discussie 28
Volgens mij moet ik hier zijn

Ik heb c-files, die hebben een aantal constante arrays nodig. Gezien dat die afhankelijk van het target zijn (verschillende types microcontrollers) is het idee om die arrays in een andere file, target specific, te specificeren. Dan kunnen de c-files onafhankelijk van het target hergebruikt worden. Nu de vraag, wat is de beste methode? Ik heb er met iemand redelijk wat discussie over gehad, en we kwam er niet echt uit, de opties:

Gewoon de handel in a .h file definieren, static zodat hij het gewoon 1x in het geheugen plaatst en geen linker errors maakt. Nadeel is dat de waarde in een header stoppen volgens mij niet heel net is.
C: constantes.h
1
  static const int constante1 = 5;

C: api.c
1
2
3
4
5
#include "constantes.h"

void foo() {
  int a = constante1;
}
Optie twee: hetzelfde, maar nu het in een c file zetten en extern doen in de header. Nu wordt het wel in een code file gedefinieerd, en die 'hoort' bij een header. Gezien dat ze in verschillende folders zitten is het daardoor misschien duidelijker. Nadeel is dat ook als een target de constante niet gebruikt er nog steeds iets gedefinieerd moet zijn (de api.c code in dit voorbeeld is wel hetzelfde voor alle targets, maar niet alle targets hoeven hem per sé te gebruiken). Daarnaast doet de header file in principe niks.
C: constantes.h
1
  extern const int constante1;

C: constantes.c
1
  const int constante1 = 5;

C: api.c
1
2
3
4
5
#include "constantes.h"

void foo() {
  int a = constante1;
}
Oftewel optie 3. Gewoon de hele header file overslaan, en direct hem in de code file binnenhalen. Nadeel wat ik hier weer zie is dat het nou niet 1-2-3 duidelijk is waar constante1 vandaan komt in api.c.
C: constantes.c
1
  const int constante1 = 5;

C: api.c
1
2
3
4
5
extern const int constante1;

void foo() {
  int a = constante1;
}
Oftewel, wat is de beste methode? Mogelijk nog een vierde methode? En voor de duidelijkheid: de integer hier is een voorbeeld, in het echt is het een 2D array, dus je kan het niet zomaar door een enum of define vervangen.

[C] corrupted double-linked list

18-03-2013 discussie 6
Hallo iedereen,

Ik snap niet waarom ik onderstaande error krijg bij het uitvoeren van het programma:
*** glibc detected *** ./SMAspot: corrupted double-linked list: 0x00378998 ***
Afgebroken

Ik heb 2 gelijkaardige functies, de ene voor het ophalen van data, en de andere voor het verzenden van data en zijn in wezen identiek buiten een andere struct.
Het verzenden van data lukt niet (altijd?).
Wanneer ik een realloc doe per item, geraak ik 72 items ver met een segmentatiefout.
Maak ik men stuct groter, gebeurt de fout sneller, ik vermoed dat het fout gaat indien de pointer van adres verandert.
Heeft iemand een idee waarom?

Enkele belangrijke delen uit de code:
"globale" variabelen:
C:
1
2
3
PVOutPut *statuses = NULL;
unsigned int num_statuses = 0;
unsigned int alloc_statuses = 0;
Onderstaande functie wordt in een lus aangesproken:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
int AddToArray_put(PVOutPut item, unsigned int alloc_new)
{
    if(VERBOSE_HIGHEST) puts("AddToArray_put()");
    printf("item.datetime: %s\n", strftime_t("%d/%m/%Y %H:%M:%S", item.datetime));
    printf("item.engen: %llu\n", item.engen);
    printf("item.powgen: %i\n", item.powgen);
    printf("item.voltage: %lu\n", item.voltage);
    printf("alloc_new: %i\n", alloc_new);

    PVOutPut *tmpptr = NULL;
    printf("*tmpptr: %p\n", tmpptr);

    printf("num_statuses: %i\n", num_statuses);
    printf("alloc_statuses: %i\n", alloc_statuses);

    //If array full and no new allocation requested, set request to 1
    if((alloc_new == 0) and (num_statuses == alloc_statuses))
        alloc_new = 1;

    printf("alloc_new: %i\n", alloc_new);

    alloc_statuses = alloc_statuses + alloc_new;

    printf("alloc_statuses: %i\n", alloc_statuses);
    printf("statuses: %p\n", statuses);
    printf("sizeof(PVOutPut): %i\n", sizeof(PVOutPut));

    //statuses = (PVOutPut*)realloc(statuses, alloc_statuses * sizeof(PVOutPut));
    tmpptr = (PVOutPut*)realloc(statuses, alloc_statuses * sizeof(PVOutPut));

    printf("*tmpptr: %p\n", tmpptr);

    if(tmpptr != NULL){
        statuses = tmpptr;
        printf("statuses: %p\n", tmpptr);
        statuses[num_statuses] = item;
        num_statuses++;
        printf("num_statuses: %i\n", num_s corrupted double-linkedtatuses);
        //alloc_new = 0;
    }
    else{
        if(VERBOSE_LOW) puts("realloc() failed!");
        return -1;
    }
    //statuses[num_statuses] = item;
    //num_statuses++;

    //if(!statuses){
        //if(VERBOSE_LOW) puts("realloc() failed!");
        //return -1;
    //}
    //statuses[num_statuses] = item;
    //num_statuses++;
    //alloc_new = 0;

    if(DEBUG_VERYHIGH){
        printf("Number of statuses: %i using %i/%i bytes\n", num_statuses, num_statuses * sizeof(PVOutPut), alloc_statuses * sizeof(PVOutPut));
        //printf("statuses[%i].time: %s\t", num_statuses - 1, strftime_t(cfg->DateTimeFormat, statuses[num_records - 1].datetime));
        printf("statuses[%i].time: %s\t", num_statuses - 1, strftime_t("%d/%m/%Y %H:%M:%S", statuses[num_statuses - 1].datetime));
        printf("statuses[%i].engen: %llu\t",  num_statuses - 1, statuses[num_statuses - 1].engen);
        printf("statuses[%i].powgen: %i\n",   num_statuses - 1, statuses[num_statuses - 1].powgen);
        //printf("statuses[%i].voltage: %llu\t", num_statuses - 1, statuses[num_records - 1].voltage);
    }

    return num_statuses;
}
Ik krijg volgende output van m'n printf's:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 AddToArray_put() item.datetime: 17/03/2013 07:30:00 item.engen: 7261403 item.powgen: 0 item.voltage: 0 alloc_new: 37 *tmpptr: (nil) num_statuses: 0 alloc_statuses: 0 alloc_new: 37 alloc_statuses: 37 statuses: (nil) sizeof(PVOutPut): 20 *** glibc detected *** ./SMAspot: corrupted double-linked list: 0x00378998 *** Afgebroken
Bedankt wie kan helpen, want ik ben ver ten einde raad.

[C] curl response werkt sporadisch niet

16-03-2013 discussie 3
Hallo iedereen,

Ik ben mij aan het vermaken met wat programmeerwerk, vermits ik een echte amateur ben, kom ik soms wel eens in de problemen waarbij ik wat hulp moet vragen.
Zoals je ziet in het vereenvoudigde voorbeeld zie je dat ik data opvraag via curl.
Het probleem dat zich voordoet is dat soms de response de mist in gaat, en ik deze data niet kan verwerken.
Wat mij opvalt is dat de callback functie meermaals opgeroepen wordt alvorens het de mist in gaat, volgende request kan alles dan weer zijn zoals het hoort.
Wie kan me wat goede raad geven waar ik moet beginnen zoeken of waarom het mis gaat.


Bedankt iedereen!
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
int GetStatus(...)
{
    CURL *curl;
    CURLcode res = CURLE_OK;
    long responsecode = 0;
    char *response = NULL;

    curl = curl_easy_init();
    if(curl){
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
        curl_easy_setopt(curl, CURLOPT_POST, 1);
        curl_easy_setopt(curl, CURLOPT_URL, "http://pvoutput.org/service/r2/getstatus.jsp");
        //Get response from curl to *response
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback_func);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        while(...){
            ...
            snprintf(body, sizeof(body), "d=%s&h=1&asc=1&limit=288", ...);
            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body);
            res = curl_easy_perform(curl);

            //Upload OK?
            if (res != CURLE_OK){
                printf("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
                return -1;
            }
            else{
                curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responsecode);
                printf("responsecode: %li\n", responsecode);
                printf("response: %s\nfrom body: %s\n", response, body);
                if (responsecode == 200){
                ...
                }
                else if (responsecode == 400){
                ...
                }
                else if (responsecode == 403){
                ...
                }
                //Uknown response
                else{
                    printf("Unknown response: %lu\tresponse: %s\n", responsecode, response);
                }
            }//Upload OK
        }//While loop
        //Clean up curl
        curl_easy_cleanup(curl);
    }
    //Clean up curl completely
    curl_global_cleanup();
    return 1;
}

size_t write_callback_func(char *buffer, size_t size, size_t nmemb, void *userp)
{
    puts("write_callback_func()");
    char **response_ptr = (char**)userp;
    *response_ptr = strndup(buffer, (size_t)(size *nmemb));
    return size * nmemb;
}

[C/C++,Qt] BlackBerry 10 native Dev Startup topic

24-01-2013 discussie 1
(Dit is een openingspost, is de bedoeling het wat op te fleuren in de nabije toekomst met wat mooie plaatjes en voorbeelden)

Ikzelf heb geen probleem met het ontwikkelen voor BlackBerry 10, mar wil met deze openingspost mense de gelegenheid geven BlackBerry 10 te verkennen en ermee te starten en hun problemen in dit topic naar voren te brengen zodat we elkaar kunnen helpen.

Met de introductie van het BlackBerry 10 platform gaat RIM een compleet nieuwe kant op en breekt met het oude Java 2 Mobile Edition platform van BlackBerry 4,5,6,7 nu BBOS genoemd door RIM.

BlackBerry 10 draait op QNX os een Unix microkernel POSIX OS, die gebruikt om real-time systemen mee te draaien die 24/7 draaien en nooit een kernel crash hebben

Voor meer informatie over QNX - http://www.qnx.com/

De native programeer taal voor BlackBerry 10 is C/C++ en de ontwikkelomgeving is een eclipse client genaamd Momentics (welke ook al gebruikt werd voor ontwikkelen op het QNX platform)
http://developer.blackberry.com/native/

BlackBerry 10 heeft tevens ook een UI framework, welke direct uit C/C++ kan worden gebruikt of in combinatie met Qt en QML gebruikt kan worden.

Om het developers makkelijker te maken heeft BlackBerry 10 de Qt libraries geïmplementeerd.
Qt is een C/C++ library framework om een hoop zaken makkelijk te maken voor developers, zodat ze niet alleen maar low-level hardware code hoeven te kloppen. Het heeft datamodelen, netwerk libraries en ondersteund QML (Qt Markup Language) dat gebruikt kan worden om UI's mee te maken.
Qt is gebruikt op Nokia Symbian toestellen en is ook geimplementeerd in vele Linus varianten waarvan Ubuntu wel de grootste is.

Qt: http://qt.digia.com/
Qt Organisatie: http://qt-project.org/

Het Cascades UI framework kan je in de Momentics IDE gelijk met grafische preview gebruiken als je met QML werkt als je Cascades vanuit C/C++ gebruikt is er geen preview mogelijkheid.
https://developer.blackberry.com/cascades/

Het Cascades UI framework, draait constant op 60fps en elk element op het scherm is standaard mogelijk om te animeren ( roteren, schalen, bewegen, etc.)

RIM heeft van BlackBerry 10 een open standaarden (OpenGL ES, OpenAL, SQLlite) en open source platform gemaakt en zeer veel open source libraries en Platformen om bvb het maken van games te vereenvoudigen (Marmalade, Unity, GamePlay)
https://github.com/blackberry

Voorbeeld code:
Cascade
https://developer.blackberry.com/cascades/sampleapps/
https://github.com/blackberry/Cascades-Community-Samples

C/C++
http://developer.blackberry.com/native/sampleapps/bb10/
https://github.com/blackberry/Core-Native-Community-Samples

Voor nu een eerste verkenning van het platform.

Voor hulp van mede BlackBerry ontwikkelaars check http://www.bbdevgroup.nl
Een korte presentatie voor Native BlackBerry Development: http://www.slideshare.net...L/bb10-native-development

Alvast hel veel succes met het ontwikkelen van je eerste BlackBerry 10 App!

[C/C++] for loop VS while loop i.c.m multidimensionale array

22-01-2013 discussie 16
Hoi, ik heb een vraag:

Het is normaal gesproken zo dat als je door een multidimensionale array wilt gaan dan neem je een for loop.

Zoals het volgende:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const char * array[3][3] = {
        {"str1", "str1", "str1"},
        {"str2","str2", "str2"},
        {"str3","str3","str3"}
};

int main() {
    int i, j;

    for(i = 0; i < 3; i++) {
        for(j = 0; j < 3; j++) {
            printf("%s ", array[i][j]);
        }
    }

    return 0;
}
Output: str1 str1 str1 str2 str2 str2 str3 str3 str3

Echter wil ik het met een while loop doen. En dan krijg ik dit:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const char * array[3][3] = {
        {"str1", "str1", "str1"},
        {"str2","str2", "str2"},
        {"str3","str3","str3"}
};

int main() {
    int i = 0;
    int j = 0;

    while(i < 3) {
        while(j < 3) {
            printf("%s ", array[i][j]);
            j++;
        }
        i++;
    }

    return 0;
}
Output: str1 str1 str1

Dit doe ik met GCC 4.7.2. Is dit een bug of toch een standaard die ik over het hoofd zie? Of doe ik iets verkeert?

[C]C file corrupt

24-12-2012 discussie 4
Hallo iedereen,

Ik had een paar weken geleden een c-programma geschreven voor de raspberry pi. Ik heb deze code met een gewone tekstverwerker geschreven namelijk Kate. Ik doe deze vandaag terug open en ik zie een file vol rare tekens.


picture hosting

Heeft iemand een idee of ik deze gegevens nog terug kan recuperen of is deze data onherroepelijk verloren?

Alvast bedankt

C/GTK/FreeBSD - waar vind ik de locatie van de te openen dir

22-12-2012 discussie 3
Hallo,

Ik ben aan het knoeien met een stuk software uit de FreeBSD ports: x11/libfm. Dit is de ondersteunende library van de PCmanfm filemanager.
Een leuke eigenschap van PCmanfm is dat ie ook in "desktop-mode" kan draaien, dwz hij kan de X.org/openbox desktop hetzelfde behandelen als een folder. Je kan bestanden en directories slepen of aanmaken en er is een programmeerbaar right-click menu.
Wat ik nu wil (het is vergezocht maar ik doe een poging) is die PCmanfm blijven gebruiken maar alleen voor die desktop-mode. De filemanager x11-fm/xfe moet de normale vensters gaan verzorgen.

Het probleem is dus dat PCmanfm zelf xfe moet opstarten als er op een desktop directory wordt geklikt. Oorspronkelijk startte hij een fork van zichzelf op in een nieuw venster met de betreffende directory.

In de libfm source heb ik het stukje code daarvoor gevonden:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // deel van bestand fm-file-launcher.c if(folders) { folders = g_list_reverse(folders); if(launcher->open_folder) { launcher->open_folder(ctx, folders, user_data, &err); if(err) { if(launcher->error) launcher->error(ctx, err, user_data); g_error_free(err); err = NULL; } } g_list_free(folders); } return TRUE;
Hier wordt een nieuw pcmanfm venster gestart in de directory die waarschijnlijk in de "folders" parameter zit bij de aanroep launcher->open_folder(ctx, folders, user_data, &err);
Met de g_debug() functie kan ik tussentijdse info naar stdout sturen en met system() kan ik xfe opstarten vanuit een C-programma.

Eerste aanpassing:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 if(folders) { folders = g_list_reverse(folders); if(launcher->open_folder) { // we hebben hier dus de die directory locatie nodig. Xfe opent zo altijd // in de directory van waaruit X.org is gestart. // call naar pcmanfm alvast vervangen met kaal shellcommando voor xfe // launcher->open_folder(ctx, folders, user_data, &err); system ("/usr/local/bin/xfe"); // proberen met g_debug de benodigde info op stdout te krijgen (tevergeefs, dit is niet leesbaar): g_debug("ctx: %s", ctx); g_debug("folders: %s", folders); g_debug("user_data: %s", user_data); if(err) { if(launcher->error) launcher->error(ctx, err, user_data); g_error_free(err); err = NULL; } } g_list_free(folders); } return TRUE;
De console output daarvan na een run:
(onderaan de g_debug output, die missende icons zijn niet van belang.)
code:
1 2 3 4 5 6 7 ** (pcmanfm:11606): DEBUG: adding new FmBackgroundCache for /usr/MBSD/wallpapers/freebsd.jpg ** (pcmanfm:11606): DEBUG: unable to load icon . GThemedIcon text-plain gnome-mime-text-plain text-x-generic application-x-executable ** (pcmanfm:11606): DEBUG: unable to load icon . GThemedIcon folder inode-directory gnome-mime-inode-directory inode-x-generic ** (pcmanfm:11606): DEBUG: unable to load icon . GThemedIcon folder inode-directory gnome-mime-inode-directory inode-x-generic ** (pcmanfm:11606): DEBUG: ctx: ** (pcmanfm:11606): DEBUG: folders: \xb0\xe0D\u0007\u0008 ** (pcmanfm:11606): DEBUG: user_data: \xa0\x80G\u0007\u0008
Wat ik nou niet voor elkaar krijg is die directorynaam leesbaar maken. De bedoeling is dat die system() aanroep een string krijgt als "/usr/local/bin/xfe <pad>"
Greppen naar "launcher" en "open_folders" in andere libfm source bestanden levert een hoop hits op, maar ik kan er niet achter komen hoe die data in (volgens mij) de "folders" parameter eruit ziet om dat vervolgens in een normale string te krijgen.
Ergens heb ik het idee dat ik een goeie C-GUI nodig heb die types en structs e.d. automatisch erbij zoekt. Tot nu toe ben ik alleen in terminals bezig. Heeft er iemand goeie raad m.b.t. hoe nu verder te gaan?

cluster vinden in een 2d array

07-12-2012 discussie 1
hallo allemaal,

voor een project van de uni heb ik (o.a.) een algorithme in c nodig om een cluster te detecteren in een 2d array. Ik weet dat zoiets bestaat maar kan maar niet op de naam komen. ik heb op google gezocht naar dingen als find a cluster in an 2d array maar kan het niet vinden. kan iemand mij hier op weg helpen? Geen codes dus, gewoon een linkje naar dit algorithme. alvast bedankt!

C4Droid Android

12-10-2012 discussie 0
Iemand ervaring met Google Play: C4droid (C/C++ compiler) op android?
De compiler kan (oa) met Qt kan werken en .apk's exporteren.
Ik heb de compiler gekocht maar ben een n00b op android, geen zin om de officiele android sdk te installeren en java te gaan doen.
Ik wil wat van m'n desktop projecten porten en daarvoor Qt / C4Droid gebruiken.
Ik heb al goede resulaten bereikt, ik heb een grote library met astronomische rekenroutines kunnen combineren met het Qt voorbeeld prog van een tekstverwerkertje wat bij de examples van C4Droid staat, en heb dus nu een .apk met dat tekstverwerkertje en die reken-lib werkend erin. De weg staat nu open om de rest van dat project te gaan porten.

Alleen kan ik weinig info vinden, hoe pak je dingen aan, in hoeverrre kun je gebruik maken van Qt Mobile functies e.d, hoe kun je grafisch het best aanpakken etc etc.
Daarom m'n vraag, mensen met ervaring hiermee? Ik denk dat het niet erg populair is en dat is jammer want ik vind het wel veelbelovend.

[C/C++] Loop over volledige range van datatype

29-08-2012 discussie 79
Tijdens het schrijven van een vrij simpel programma in C++ liep ik net tegen een voor mij nieuwe situatie aan, die ik het best kan illustreren met een heel kort (niet-representatief) codefragment:
C++:
1
2
3
4
5
6
7
#include <stdint.h>

int main(int argc, char** argv) {
  for (uint8_t index = 0; index <= UINT8_MAX; index++) {
    processUInt8(index);
  }
}
De bovenstaande code is een oneindige loop, omdat 'index' nooit (UINT8_MAX + 1) kan worden en wrapt voordat de for-test 'false' kan geven. Is er een manier om een loop te schrijven die alle waarden van een datatype langsloopt en een index-variabele heeft van het datatype zelf?

Voor zover ik kan nagaan, zou een while of do/while loop dezelfde problemen houden en de enige oplossing die ik kan bedenken is om van 'index' een ander datatype zoals uint16_t of uint32_t te maken.

Omdat ik eigenlijk wil voorkomen dat ik veel heen-en-weer ga casten tussen kleinere en grote datatypes, vroeg ik me af of er een leesbare en simpele oplossing voor dit probleem is? Zoeken op termen als 'C++ loop over full range of data type' levert niet zo snel wat bruikbaars op bij mij.

[C] Statement has no effect

25-07-2012 discussie 9
Sinds dat ik van Eclipse Galileo naar Juno ben gegaan loop ik tegen een probleem aan.

Het begint met het aanroepen van een macro welke weer een andere functie aanroept:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 stap 1: return (MODEM_CMD("test",1000) == MOD_RESP_OK); stap 2: #define MODEM_CMD(str,delay) modem_cmd(PSTR(str),delay) stap 3: MODEM_RESP modem_cmd(const char * cmd, uint16 delay) { printm("AT"); printm_np(cmd); printm("\r"); return (modem_rec_resp(delay)); }
Het heeft altijd gewerkt en werkt ook nog steeds. Alleen krijg ik sinds de update naar Juno de melding "Statement has no effect" bij stap 1.

De code heb ik nu zo gemaakt dat de macro er tussen uit is:
code:
1 2 3 4 5 6 7 8 9 10 11 stap 1: return (modem_cmd(PSTR("test"),1000) == MOD_RESP_OK); stap 2: MODEM_RESP modem_cmd(const char * cmd, uint16 delay) { printm("AT"); printm_np(cmd); printm("\r"); return (modem_rec_resp(delay)); }
Dit werkt net zo goed, alleen nu krijg ik dus de melding op PSTR("test"), "Statement has no effect". In eerste instantie dacht ik dat het probleem iets was met de return type maar het lijkt hem aan PSTR() te liggen.

Heeft iemand enig idee waarom het werkte en nog steeds werkt maar in Juno warnings oplevert en in Galileo niet?

C bestanden van externe library toevoegen in Eclipse

21-07-2012 discussie 1
Ik wil een stuk code compileren voor een ARM Cortex-M4. Daarvoor moet ik C bestanden uit een externe library meecompileren. In een makefile ziet dat er zo uit:
code:
1 SRC+=stm32f4xx_gpio.c
Hoe kan ik dit netjes doen in Eclipse?

pointer functies in c, i don't get it!

26-06-2012 discussie 7
Hoi Allen,

Ik ben mezelf c aan het leren, maar kom niet helemaal uit functies die met pointers omgaan.
Na de nodige tutorials gelezen te hebben en youtube filmpjes bekeken te hebben dacht ik het een heel eind te begrijpen, maar toch kom ik er niet helemaal uit.

Zou iemand mij misschien een klein stukje uitleg kunnen geven over het onderstaande?
Mijn dank is groot!
btw: het is voor een PIC microcontroller projectje en de compiler welke ik gebruik is de light versie van High Tech C v 9.81.

Ik zou graag een string willen "parsen" naar 2 verschillende strings, een voor en een na een speciaal teken, zoals:
char string[] = "This is our # test string";
het doel is dus om 2 strings over te houden met
char a[] = "This is our "
char b[] = " test string"

Nu ben ik hiervoor een beetje voor aan het experimenteren met strchr, de functie die voor ons het speciale teken opzoekt.

Als ik onderstaande code uitvoer:
C:
1
2
3
4
5
6
      char string[] = "This is our # test string";
      char *p = strchr(string, '#');

      printf("pointer contains: %s \r\n", p);
      printf("pointer has a value of: %c \r\n", p);
      printf("pointer points to adress value: %i \r\n", &p);
Dan krijg ik terug:

pointer contains: # test string
pointer has a value of: ,
pointer points to adress value: 78

Nou de bovenste snap ik, die laat de string zien vanaf de waarde van de pointer van het # teken.
Alleen snap ik de tweede niet. Deze laat met %i de waarde 44 zien, en met de %c de komma.
Nu is in de ascii tabel snel genoeg opgezocht dat de , inderdaad de decimale waarde van 44 heeft; Maar wat ik niet begrijp is waar deze waarde 44 vandaan komt? Kan iemand mij dit uitleggen zodat ik weer verder kan puzzelen?

Alvast bedankt!
Gr. Sander.

Edit: code blok toegevoegd

Basis recursie in C breinbreker

31-05-2012 discussie 13
Dus ik had vandaag examen C en ik moest zeggen wat deze recursie functie teruggaf:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <stdio.h> #include <stdlib.h> void recurse(int n){ if(n==0){ return; } recurse(n-1); printf("\n recurse %d ", n); recurse(n-1); } int main(int argc, char**argv) { recurse(3); return 0; }
En dat kwam uit op 1 2 1 3 1 2 1
Maar ik kan niet goed begrijpen wat er zich op de stack afspeelt. Ik heb heel veel gezocht en het zelf proberen begrijpen, maar ik breek mijn kop er echt over!

Ik weet dat tweakers geen online leerkracht is, maar als iemand mij zou kunnen vertellen waarom dit gebeurt en wat er zich op de stack afspeelt bent u hartelijk bedankt!

Gal22V10 programmeren

14-05-2012 discussie 8
in een donker verleden heb ik op mijn opleiding de GAL22V10 gebruikt om te programmeren in C.

Ik kan me niet herinneren welke software we gebruikten, maar ik heb op ebay een Genius G540 programmer besteld, maar de software daarbij is half chinees en brak; probeer ik de originele software online te downloaden; loopt de laatste versie telkens vast/start niet.

Na lange, lange zoektoch met kennis ver weggezakt probeer ik zowel de juiste compiler/program software te vinden voor C alsmede ook goede software wat die G540 kan aansturen om de .hex files in de Gal te laden.

Wat is een compiler die ik kan gebruiken; ik heb er verscheidene geprobeert (wincupl; non 64 bit....Pelles C; alleen windows georienteerd) alsmede de nieuste drivers van Genius, maar die loopt vast .

Kunnen jullie me op weg helpen om een goede C-compiler/programmeer software te vinden (voor simpele state-retoriek) en eventueel een alternatief voor die brakke chinese software (als dat kan tenminste).

Jaja. fpga's zijn beter, maar ik had nog e.e.a. liggen en wou dit graag even oppikken en wil de 22v10's veel gaan inzetten in hobby projectjes.

[C/Win32] libdwmapi.a vinden in x86-smaak

08-05-2012 discussie 5
De titel zegt wel zo'n beetje genoeg: ik krijg het niet echt voor elkaar om de x86-versie van libdwmapi.a te vinden. Elke GCC-port levert alleen maar de x64-versie van deze library, want een tikkie vervelend is.

Wat ik tot nu toe heb geprobeerd:Stiekem toch de x64-versie meegeven aan de linker. Dit levert 'undefined reference to foo' op. De Microsoft-versies (dwmapi.lib) proberen. Het programma linkt wel, maar wil daarna niet starten. Dit is vaag, want MinGW ondersteunt officieel wel MSVC-libraries (.lib). Werkt blijkbaar niet altijd. Met reimp/dlltool (http://code.google.com/p/lib2a/) geprobeerd de .lib (die uit de Windows SDK komt overigens) te converteren naar een .a-bestand. Het lijkt allemaal goed te gaan, maar nog steeds verwijzen de headers volgens de linker naar niet-bestaande functies. Een rijtje GCC-ports afgezocht naar libdwmapi.a (x86). TDM-GCC heeft 'em niet, MinGW64 niet en MinGW(32) ook niet. ...Heeft iemand enig idee hoe ik die dingen verder zelf kan maken ofzo? Ik bedoel, de mensen bij TDM-GCC bijvoorbeeld moeten toch ook ergens mee beginnen (met dwmapi.lib bijvoorbeeld).

En ehm, voor de duidelijkheid: zonder -m32 (implies x64) compilen en zelf libdwmapi.a (x64) aanwijzen werkt perfect.
Resultaten per pagina: 25 | 50 | 100
1 2 3 4 5


Huawei Nexus 6P Apple iPad Pro WiFi FIFA 16 Samsung Galaxy S7 Fallout 4 Apple iPhone 6C Athom Homey LG G5

© 1998 - 2016 de Persgroep Online Services B.V. Tweakers vormt samen met o.a. Autotrack en Carsom.nl de Persgroep Online Services B.V. Hosting door True