Probleme mit Serverprozess und/oder Struktur
-
Hallo zusammen und ein gesundes neues Jahr,
ich schreibe gerade an einem Programm für das Raspberry Pi (RbP), um zu Hause meine Funksteckdosen steuern zu können:
librsswitch.c
/** * Configure struct for the PT2260 encoder * @param pt2260 Pointer to a pt2260 instance */ int pt2260_init(Encoder *pt2260) { if(!bcm2835_init()) { fputs("Cannot init bcm2835\n", stdout); return -1; } /* Set the pin to be an output */ bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP); char *groups[] = {"1FFF", "F1FF", "FF1F", "FFF1"}; char *sockets[] = {"1FF0", "F1F0", "FF10"}; char *data[] = {"0001", "0010"}; int i; /* Four possible switch groups */ pt2260->ngroups = 4; pt2260->groups = (char **)malloc(pt2260->ngroups * sizeof(char *)); if (pt2260->groups == NULL) { fputs("Error: Cannot malloc\n", stdout); return -1; } /* Three possible switches per group */ pt2260->nsockets = 3; pt2260->sockets = (char **)malloc(pt2260->nsockets * sizeof(char *)); if (pt2260->sockets == NULL) { fputs("Error: Cannot malloc\n", stdout); return -1; } /* Data is either "On" or "Off" */ pt2260->ndata = 2; pt2260->data = (char **)malloc(pt2260->ndata * sizeof(char *)); if (pt2260->data == NULL) { fputs("Error: Cannot malloc\n", stdout); return -1; } for (i = 0; i < pt2260->ngroups; i++) { strcpy((char *)&pt2260->groups[i], (char *)&groups[i]); } #ifdef DEBUG puts("Going to crash now"); for (i = 0; i < pt2260->ngroups; i++) { printf("DBG: %s\n", pt2260->groups[i]); } #endif for (i = 0; i < pt2260->nsockets; i++) { strcpy((char *)&pt2260->sockets[i], (char *)&sockets[i]); } for (i = 0; i < pt2260->ndata; i++) { strcpy((char *)&pt2260->data[i], (char *)&data[i]); } return 0; } int socket_send(uint group, uint socket, uint data) { Encoder pt2260; pt2260_init(&pt2260); #ifdef DEBUG puts("DBG: Done pt2260_init()"); #endif pt2260_ctrl(&pt2260, group, socket, data); return 0; }
Für den ersten Test habe ich ein Programm send.c geschrieben, das die Funktionalität prüfen soll:
send.c
#include "rsswitch.h" int main(void) { /* Group B, Switch 1, On */ socket_send(1, 0, 1); return 0; }
$ gcc -Wall -DDEBUG -o send send.c librsswitch.c -l rt -l bcm2835
$ sudo ./send
Going to crash now
DBG: 1FFF
DBG: F1FF
DBG: FF1F
DBG: FFF1
DBG: Done pt2260_init()Das ganze funktioniert prinzipiell, ich kann die Steckdose damit ein- und ausschalten. Hier zum eigentlichen Problem:
Ich möchte das Ganze nun in eine Server-Applikation einbinden, welche auf dem RbP läuft und Befehle über das Netzwerk entgegennimmt:
mrfbd.c
while(1) { connfd = accept(listenfd, (struct sockaddr*)&cli_addr, &cli_len); /* Log clients IP address. */ inet_ntop(AF_INET, &cli_addr.sin_addr, cli_ipaddr, sizeof(cli_addr)); syslog(LOG_NOTICE, "Client from %s connected.", cli_ipaddr); while ( (n = read(connfd, recbuf, sizeof(recbuf)-1)) > 0) { recbuf[n] = 0; if (recbuf[0] == '0') { ... } else if (recbuf[0] == '1') { ... } else if (recbuf[0] == '2') { ... } else if (recbuf[0] == '3') { syslog(LOG_NOTICE, "RSS Control"); socket_send(1, 0, 1); }
$ gcc -Wall -DDEBUG -o mrfbd mrfbd.c librsswitch.c -l rt -l bcm2835
$ sudo ./mrfbd
Going to crash nowWenn ich jetzt mit einem Client '3' an das RbP schicke, dann beendet sich der Serverprozess ohne Fehlermeldung.
Er scheint beim Zugriff auf pt2260->groups[i] abzustürzen.
Kann mir jemand sagen warum?
Vielen Dank im Voraus.
-
Was sagt der Compiler denn, wenn du sämtliche Casts in
pt2260_init
weglässt? Die sind nämlich alle unnötig oder falsch.
-
TyRoXx schrieb:
Was sagt der Compiler denn, wenn du sämtliche Casts in
pt2260_init
weglässt? Die sind nämlich alle unnötig oder falsch.Hallo TyRoXx,
schonmal vielen Dank für deine Antwort! Ich habe alle Casts weggelassen, hier der Compiler Output:
librsswitch.c: In function ‘pt2260_init’:
librsswitch.c:131:3: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
In file included from rsswitch.h:3:0,
from librsswitch.c:1:
/usr/include/string.h:125:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
librsswitch.c:131:3: warning: passing argument 2 of ‘strcpy’ from incompatible pointer type [enabled by default]
In file included from rsswitch.h:3:0,
from librsswitch.c:1:
/usr/include/string.h:125:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char **’
librsswitch.c:141:3: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
In file included from rsswitch.h:3:0,
from librsswitch.c:1:
/usr/include/string.h:125:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
librsswitch.c:141:3: warning: passing argument 2 of ‘strcpy’ from incompatible pointer type [enabled by default]
In file included from rsswitch.h:3:0,
from librsswitch.c:1:
/usr/include/string.h:125:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char **’
librsswitch.c:145:3: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
In file included from rsswitch.h:3:0,
from librsswitch.c:1:
/usr/include/string.h:125:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
librsswitch.c:145:3: warning: passing argument 2 of ‘strcpy’ from incompatible pointer type [enabled by default]
In file included from rsswitch.h:3:0,
from librsswitch.c:1:
/usr/include/string.h:125:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char **’Hier noch die Deklaration des structs in der Datei rsswitch.h:
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <bcm2835.h> typedef struct{ char **groups; uint ngroups; char **sockets; uint nsockets; char **data; uint ndata; uint pulse_len; } Encoder;
Leider weiß ich mit den Compilerausgaben nicht wirklich etwas anzufangen.
**
char groups;Dann ist doch pt2260->groups[i] vom Typ **Char ***, oder?
-
Nochmal danke, TyRoXx,
du bist mein Held!