Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Bernhard Guillon schrieb: On 31.08.2010 12:59, lano wrote: Zum Schluss, punkte 3 und 4, musste ich noch recht kämpfen, denn einen string zusammensetzen ist in c anscheint wieder was ganz anderes als in perl. mit url = server + datei; funktioniert es jedenfalls nicht. ich bewerkstellige das nun so: char url[300]; strcpy(url, quotenpage); strcat(url, ?user=); strcat(url, user); strcat(url, channel=); strcat(url, channel); Ja weil C keine Strings kennt. Wenn du + bei Pointern verwendest rechnest du Adressen zusammen. Warscheinlich kommt dabei keine brauchbare heraus :) Du solltest den Speicher hier umbedingt ausrechnen und mit malloc reservieren oder aber überprüfen ob der Puffer groß genug ist um beide Strings aufzunehmen. Wenn die beiden Strings zusammen größer als 300 werden hast du sonst einen Buffer Overflow. strnFOO ist dafür besser geeignet, da z.B. strcpy einfach so lange in den Speicher schreibt bis ein Terminierungszeichen \0 kommt strncpy aber nur maximal so lange wie du angibst. Ich hab einfach mal 300 angegeben damits nicht zum overflow kommt, muss ich noch anpassen, 300 wirds nie, ohne gezählt zu haben schätz ich eher so auf 50 Libcurl ist zwar schon ein bisschen größer als alles selber zu schreiben aber dafür sollte es machen was du willst. Du kannst es statisch linken dann hast du es beim cross compiling einfacher. Was für eine Toolchain verwendest du für die Dreambox? Das mit dem wget ist sonst auch nicht so schlimm. Toolchain ? keine ahnung, ich hab auch ne Dbox keine dreambox. ich hab mir nen script gebastelt was mir alles erstellt was ich brauche. Da werden die sourcen gepatcht und meine tools und plugins mit eingebaut, sobald die buildumgebeung steht kann ich dann einfach im cdk verzeichniss mit make mein tool/plugin name kompilieren, das find ich schon recht einfach. -Sven- PS: bisschen verspätet jetzt die Antwort, erster versuch war mit ner anderen email addy ;) -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Hi Lano, schade dass ich deine Mails erst jetzt gesehen habe. Schau mal in unserem Wiki nach: http://www.pug.org/mediawiki/index.php/Einf%C3%BChrung_in_die_Netzwerkprogrammierung Zu deiner Aufgabe: Eigendlich geht es insgesamt nur darum 1. eine datei vom einem http-server laden 2. das was in der datei steht in eine variable stecken 2. die mac in eine variable bekommen 3. daraus eine url basteln 4. die url an den http-server senden Den 2. Punkt 2 (;-)) hast du ja jetzt. Punkt 1 hänge ich dir hier dran und für die Punkte 3 und 4 müssten wir wissen wie die URL aussehen soll. Gruß Laurence zu 2.: --- #include sys/socket.h #include netinet/in.h #include errno.h #include netdb.h extern int h_errno; #include arpa/inet.h #include stdio.h #define MAX_STRING_SIZE 2048 int main (int argc, char ** argv) { int fd; struct sockaddr_in remote; char server_addr[16], server_port[6], server_ip[16]; struct hostent * server_entry; int slen; char string[MAX_STRING_SIZE]; char returnchar[1]; if (argc3) { printf(too few arguments\n); printf(Usage: %s server port\n\n, argv[0]); exit(1); } strcpy(server_addr, argv[1]); // get ip address to server name if ((server_entry=gethostbyname(server_addr)) == NULL) { printf(gethostbyname failed\n); exit(h_errno); } strcpy(server_port, argv[2]); strcpy(server_ip, inet_ntoa(*(struct in_addr*)server_entry-h_addr_list[0])); printf(connecting to %s (%s) on port %s\n, server_addr, server_ip, server_port); // open tcp socket if ((fd=socket(AF_INET, SOCK_STREAM, 0)) 0) { perror(socket error); exit(errno); } // fill structure remote with remote address remote.sin_family=AF_INET; remote.sin_port=htons(atoi(server_port)); remote.sin_addr.s_addr=inet_addr(server_ip); memset(remote.sin_zero, 0, sizeof(remote.sin_zero)); // connect to server remote if (connect(fd, (struct sockaddr*)remote, sizeof(remote)) 0) { perror(connect error); exit(errno); } printf(established!\n); // send chars to server strcpy(string, GET /index.html\n); slen=strlen(string)+1; printf(Sending %d chars\n, slen); write(fd, string, slen); // receive answer from server printf(Server answered: \n); while((read(fd, returnchar, 1))0) { printf(%s, returnchar); } close(fd); } --- On 08/31/2010 03:00 AM, lano wrote: Bernhard Guillon schrieb: Gruß Bernhard Boah, so, grad in dieser Minute geschafft. Kanal: 2718f001d176 Mac: 00:50:9c:15:c8:8b War das ne schwere geburt. unter anwendung von sprintf. Jetzt werd ich erstma ausschalfen. Vielen vielen dank für deine/eure bemühungen. Nathanael will ich ja nicht vergessen. so denn -Sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org signature.asc Description: OpenPGP digital signature -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Hallo Sven, 2010/8/29 lano mail4l...@web.de: Hallo auch, ich hab mal eine Frage zur Programmierung in c. Dazu muss ich erwähnen das ich überhaupt keinen schimmer davon habe, also komplett null. Scriptsprachen wie shell oder perl bereiten mir da weitaus weniger probleme. Schön, dass du Dich an eine Programmiersprache wagst. Erweitert den (Informatik-) Horizont :-)) Du hast bisher nichts über Deine Programmierumgebung geschrieben. Falls Du nicht von Dir selbst aus bei einfachen Tools wie einem Editor und gcc bleiben möchtest, kann ich dir nur empfehlen, eine IDE zu verwenden. Unter Linux müsstest Du da leicht fündig werden, das Angebot ist sehr groß! Um nur einige zu nennen: KDevelop, Eclipse oder Netbeans (auch wenn in Java geschrieben, gibt es wohl auch Module, um in C zu programmieren und vor allem zu gebuggen). Hier mal Links dazu: http://linuxmafia.com/faq/Devtools/ides.html http://en.wikipedia.org/wiki/Comparison_of_integrated_development_environments Dein allergrößter Vorteil dürfte der Debugger sein, mit dem Du Dein Programm besser verstehen soltlest. Just my 2 cents, Grüsse und viel Spass Markus -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Laurence Tonke schrieb: Hi Lano, schade dass ich deine Mails erst jetzt gesehen habe. Schau mal in unserem Wiki nach: http://www.pug.org/mediawiki/index.php/Einf%C3%BChrung_in_die_Netzwerkprogrammierung Zu deiner Aufgabe: Eigendlich geht es insgesamt nur darum 1. eine datei vom einem http-server laden 2. das was in der datei steht in eine variable stecken 2. die mac in eine variable bekommen 3. daraus eine url basteln 4. die url an den http-server senden Den 2. Punkt 2 (;-)) hast du ja jetzt. Punkt 1 hänge ich dir hier dran und für die Punkte 3 und 4 müssten wir wissen wie die URL aussehen soll. Gruß Laurence Moin, mittlerweile hab ich alle Punkte zusammen. Es funktioniert alles so wie es soll. Ist ja lieb gemeint, nur ist der womögliche Lerneffekt bei nem kompletten code gleich null, bzw schult es womöglich nur die copy n past funktion ;) Die beherrsche ich allerdings schon seit Jahren in vollendeter Perfektion :) Zum Schluss, punkte 3 und 4, musste ich noch recht kämpfen, denn einen string zusammensetzen ist in c anscheint wieder was ganz anderes als in perl. mit url = server + datei; funktioniert es jedenfalls nicht. ich bewerkstellige das nun so: char url[300]; strcpy(url, quotenpage); strcat(url, ?user=); strcat(url, user); strcat(url, channel=); strcat(url, channel); jetzt müssen nur noch einige feinheiten rein, da bin ich aber erstmal am überlegen wie es am cleversten wäre. die datei vom server holen und die url an den server senden mache ich mit ein und der selben funktion. HTTP_downloadFile( quotenserver, 80, url, /dev/null, 0, 1); die Funktion macht im Moment allerdings nix anderes als wget mit den ensprechenden parametern aufzurufen. Interessant wäre es ob es zb. mit deiner Funktion Ressourcen schonender wäre. (im gegensatz zum shell script frist das c progämmchen so gut wie nix) Allerdings wollt ich a) weder das rad ständig neu erfinden b) sollte das programm so klein wie möglich sein, mir stehen nur 556kb flash zur verfügung, von denen ich möglichst so wenig wie möglich benutzen sollte. im moment ist das programm ca 13 kb groß gestiped sinds nur noch 5,8kb :) Werd mich jetzt erstmal im buchladen einnisten und schaun ob ich da ne passende Lektüre für mich finde. so denn -Sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
On 08/31/2010 12:59 PM, lano wrote: Laurence Tonke schrieb: Hi Lano, schade dass ich deine Mails erst jetzt gesehen habe. Schau mal in unserem Wiki nach: http://www.pug.org/mediawiki/index.php/Einf%C3%BChrung_in_die_Netzwerkprogrammierung [...] Moin, mittlerweile hab ich alle Punkte zusammen. Es funktioniert alles so wie es soll. Ist ja lieb gemeint, nur ist der womögliche Lerneffekt bei nem kompletten code gleich null, bzw schult es womöglich nur die copy n past funktion ;) Die beherrsche ich allerdings schon seit Jahren in vollendeter Perfektion :) Deshalb der Link auf das Wiki, da sollte genügend Erklärung dabei sein ;-) Gruß Laurence signature.asc Description: OpenPGP digital signature -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Markus Wolf schrieb: Hallo Sven, 2010/8/29 lano mail4l...@web.de: Hallo auch, ich hab mal eine Frage zur Programmierung in c. Dazu muss ich erwähnen das ich überhaupt keinen schimmer davon habe, also komplett null. Scriptsprachen wie shell oder perl bereiten mir da weitaus weniger probleme. Schön, dass du Dich an eine Programmiersprache wagst. Erweitert den (Informatik-) Horizont :-)) *g*, grad befürchte ich das ich anfange c noch mehr zu hassen als microsoft Du hast bisher nichts über Deine Programmierumgebung geschrieben. Falls Du nicht von Dir selbst aus bei einfachen Tools wie einem Editor und gcc bleiben möchtest, kann ich dir nur empfehlen, eine IDE zu verwenden. ich sach mal so, ide ist ja sicher schön, nur denk ich nimmt mir das nicht allzuviel ab, bzw die grundlagen muss ich so oder so können, da verwirrt mich ne ide mit hunderten von einstellungsmöglichkeiten womöglich nur noch. bisher reicht mir mcedit als editor, syntax highliting und gut. Unter Linux müsstest Du da leicht fündig werden, das Angebot ist sehr groß! Um nur einige zu nennen: KDevelop, Eclipse oder Netbeans (auch wenn in Java geschrieben, gibt es wohl auch Module, um in C zu programmieren und vor allem zu gebuggen). Hier mal Links dazu: KDevelop hab ich mir schon mal angeschaut, kann auch mit perl und qt4 um. Allerdings find ich bei perl einen einfachen editor besser und bei qt4 den qt-designer in verbindung mit einem editor. für riesen projekte sieht das sicher wieder anders aus. http://linuxmafia.com/faq/Devtools/ides.html http://en.wikipedia.org/wiki/Comparison_of_integrated_development_environments Dein allergrößter Vorteil dürfte der Debugger sein, mit dem Du Dein Programm besser verstehen soltlest. ma schaun obs bei mir was bringt, ich schein da eine gewisse lernresistenz aufzuweisen ;) so denn -sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Laurence Tonke schrieb: On 08/31/2010 12:59 PM, lano wrote: Laurence Tonke schrieb: Deshalb der Link auf das Wiki, da sollte genügend Erklärung dabei sein ;-) Oh, ja cool, hatte noch garnicht draufgeschaut, mir fällt aber schon was ein was ich damit machen könnte. allerdings werd ich erstmal nen bisschen üben, das wenigstens ne halle welt anwendung auf anhib funktioniert. Ideen für programme hätt ich genug, könnt ich ne ganze firma mit beschäftigen, hapert nur an der umsetzung :) so denn -sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Nathanael Schweers schrieb: In perl ist ein string ein scalar, in C nicht. C kennt keinen eigenen typ für strings, sondern strings sind einfach nur Arrays (listen) von chars. Um das Ende zu markieren bekommt das letzte Element den wert 0 (== '\0'). Das ist nicht das Zeichen '0'! Wenn du nun nen string hast und return Text; schreibst ist damit die Adresse des ersten Elements des Arrays gemeint. Darum brauchst du auch einen char * als Rückgabewert, sonst bekommst du bloß ein Zeichen (und einen Kompilerfehler). Da du kein Array zurückgeben kannst, sondern nur die Anfangsadresse dessen musst du auch vorher das Array an einer Stelle ablegen die beim verlassen der Funktion nicht ungültig wird. Alle lokalen Variablen werden ja schließlich wieder freigegeben - und damit eben auch die Variable Text. Ich schreib mal ein kleines bisschen code hier hin (und verzichte mal um die Verwirrung niedrig zu halten absichtlich auf Fehlerbehandlung): char *buffer=malloc(BUFSIZE+1); /* +1 für das 0-byte am ende */ ich hab nun folgendes was auch funktioniert: char *read_file(char *file_name) { FILE *datei; char *buffer=malloc(BUFSIZE+1); buffer[0]=0; if( (datei=fopen(file_name,r)) == NULL) { fprintf(stderr,Kann %s nicht oeffnen\n,file_name); return EXIT_FAILURE; } fgets(buffer,BUFSIZE,datei); return buffer; } geh ich jetzt recht in der annahme das ein free(buffer) nach dem aufrufen der funktion den speicher dann wieder frei gibt? ca so: printf(Kanal: %s, read_file(/tmp/currentChannel)); free(buffer); -Sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Moin, könnt mir nochmal jemand erklärend helfen, ich dreh hier auf kurz oder lang durch. Da denkste da haste was verstanden, nix ist, und try`n error nervt langsam. *---net.c--* #include stdio.h #include string.h #include net/if.h #include netinet/in.h #include sys/ioctl.h #define BUFSIZE 60 unsigned char *get_mac(void) { int sd; struct ifreq ifr; char *buffer=malloc(BUFSIZE+1); buffer[0]=0; sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sd 0) { perror(socket); exit(1); } strncpy(ifr.ifr_name, eth0, IFNAMSIZ); if (ioctl(sd, SIOCGIFHWADDR, ifr) 0) { perror(ioctl SIOCGIFHWADDR); exit(1); } buffer = (unsigned char *) ifr.ifr_hwaddr.sa_data; //printf(%02x:%02x:%02x:%02x:%02x:%02x\n, buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]); *--- Wenn ich printf auskommentiere wird die mac auch angezeigt--* return buffer; } *--net.h--* #ifndef __NET_H__ #define __NET_H__ unsigned char *get_mac(void); #endif *---main.c--* #include net.h char *buffer; int main(int argc, char **argv) { printf(Mac: %s\n, get_mac()); free(buffer); return 0; } Was mach ich da wieder fürn blödsinn? Buch lesen ist ja ganz nett, aber nen buch kann ich keine fragen stellen. Das deprimiert dermaßen, hab langsam echt kein bock mehr. trotzdem vielen dank für eure hilfe und die bemühungen. -Sven- --- der sich jetzt erstmal abreagieren muss -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Moin, könnt mir nochmal jemand erklärend helfen, ich dreh hier auf kurz oder lang durch. Da denkste da haste was verstanden, nix ist, und try`n error nervt langsam. *---net.c--* #include stdio.h #include string.h #include net/if.h #include netinet/in.h #include sys/ioctl.h #define BUFSIZE 60 unsigned char *get_mac(void) { int sd; struct ifreq ifr; char *buffer=malloc(BUFSIZE+1); buffer[0]=0; sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sd 0) { perror(socket); exit(1); } strncpy(ifr.ifr_name, eth0, IFNAMSIZ); if (ioctl(sd, SIOCGIFHWADDR, ifr) 0) { perror(ioctl SIOCGIFHWADDR); exit(1); } buffer = (unsigned char *) ifr.ifr_hwaddr.sa_data; //printf(%02x:%02x:%02x:%02x:%02x:%02x\n, buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]); *--- Wenn ich printf auskommentiere wird die mac auch angezeigt--* return buffer; } *--net.h--* #ifndef __NET_H__ #define __NET_H__ unsigned char *get_mac(void); #endif *---main.c--* #include net.h char *buffer; int main(int argc, char **argv) { printf(Mac: %s\n, get_mac()); free(buffer); return 0; } Was mach ich da wieder fürn blödsinn? Buch lesen ist ja ganz nett, aber nen buch kann ich keine fragen stellen. Das deprimiert dermaßen, hab langsam echt kein bock mehr. trotzdem vielen dank für eure hilfe und die bemühungen. -Sven- --- der sich jetzt erstmal abreagieren muss -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Nathanael Schweers schrieb: On Mon, 30 Aug 2010 14:36:09 +0200 lano mail4l...@web.de wrote: *---net.c--* #include stdio.h #include string.h #include net/if.h #include netinet/in.h #include sys/ioctl.h #define BUFSIZE 60 unsigned char *get_mac(void) { int sd; struct ifreq ifr; char *buffer=malloc(BUFSIZE+1); buffer[0]=0; sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sd 0) { perror(socket); exit(1); } strncpy(ifr.ifr_name, eth0, IFNAMSIZ); if (ioctl(sd, SIOCGIFHWADDR, ifr) 0) { perror(ioctl SIOCGIFHWADDR); exit(1); } buffer = (unsigned char *) ifr.ifr_hwaddr.sa_data; //printf(%02x:%02x:%02x:%02x:%02x:%02x\n, buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]); *--- Wenn ich printf auskommentiere wird die mac auch angezeigt--* return buffer; } *--net.h--* #ifndef __NET_H__ #define __NET_H__ unsigned char *get_mac(void); #endif *---main.c--* #include net.h char *buffer; int main(int argc, char **argv) { printf(Mac: %s\n, get_mac()); free(buffer); return 0; } Ich hab ehrlich gesagt Sowas noch nie gemacht, aber ... was genau ist denn da dein Problem? ich erhalte als ausgabe: Kanal: 2718f001d176 Mac: Wie gesagt der Kanal ist richtig, das funktioniert. Nur die Mac wird nicht angezeigt. Wenn ich bei printf nicht %s sondern %x angebe bekomme ich: Kanal: 2718f001d176 Mac: 7df2 Meine vermutung, jetzt erhalte ich nur die adresse des speicherbereichs bei %c Kanal: 2718f001d176 Mac: � Problem ist das ich gern ein char string zurück gegeben haben möchte, im grunde das selbe wie bei read_file, was wir ja schon hatten, also vermute ich den fehler bei return in der funktion get_mac. voher hab ich ja: buffer = (unsigned char *) ifr.ifr_hwaddr.sa_data; erstens weis ich nicht was das mit sein soll, ich hab auch schon versucht: return ifr.ifr_hwaddr.sa_data; anzugeben, funktioniert aber auch nicht. in buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5] steht jedenfalls die mac drin. wenn in der funktion get_mac printf(%02x:%02x:%02x:%02x:%02x:%02x\n, buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]); auskommentiere wird sie auch ausgegeben. Ich bekomm es aber nicht hin das ich sie in der main funktion angezeigt bekomme. -sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
On 30.08.2010 15:59, lano wrote: Nathanael Schweers schrieb: On Mon, 30 Aug 2010 14:36:09 +0200 lano mail4l...@web.de wrote: *---net.c--* #include stdio.h #include string.h #include net/if.h #include netinet/in.h #include sys/ioctl.h #define BUFSIZE 60 unsigned char *get_mac(void) { int sd; struct ifreq ifr; struct ifreq ifr; ist lokal da du es innerhalb von get_mac definiert hast buffer = (unsigned char *) ifr.ifr_hwaddr.sa_data; Hier setzt du den Wert von deinem buffer auf die Adresse von ifr das ja lokal ist. angezeigt--* return buffer; Hier gibst du einen Pointer zurück der als Wert eine Adresse auf eine lokale Variable hat. Da das die Adresse von einer lokalen Variable ist kannst du außerhalb nichts mit der Adresse anfangen die in dem zurückgegebenen Pointer steht. Das liegt daran, dass Variablen die in Funktionen definiert werden auf dem Stack liegen und der Speicherbereich auf den der Pointer zeigt nach dem Aufruf undefiniert ist. Bücher vermitteln Grundlagen und sind meistens recht gut aufgebaut. Wenn du lieber mit Code spielst, was auch sehr wichtig ist um eine Programmiersprache zu lernen, solltest du dennoch vieleicht mit einfachen Programmen beginnen die gewisse C eigenheiten vermitteln. Hoffentlich klinge ich jetzt nicht wie ein Oberlehrer oder sowas - ist nicht meine Absicht! Scheib dir z.B. ein Programm in dem du die Gültigkeit von Variablen (lokal/global) ausprobierst. Aanschließend noch eins in dem du call by value und call by reference verwendest. Irgendwas mit Pointer Arithmetic z.B. ein char Array damit zu kopieren ist warscheinlich auch nützlich. Danach hast du es leichter und bist bei größeren Programmen nicht gefrustet :) Viel Spaß weiterhin Bernhard -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Bernhard Guillon schrieb: On 30.08.2010 15:59, lano wrote: Nathanael Schweers schrieb: On Mon, 30 Aug 2010 14:36:09 +0200 lano mail4l...@web.de wrote: *---net.c--* #include stdio.h #include string.h #include net/if.h #include netinet/in.h #include sys/ioctl.h #define BUFSIZE 60 unsigned char *get_mac(void) { int sd; struct ifreq ifr; struct ifreq ifr; ist lokal da du es innerhalb von get_mac definiert hast buffer = (unsigned char *) ifr.ifr_hwaddr.sa_data; Hier setzt du den Wert von deinem buffer auf die Adresse von ifr das ja lokal ist. angezeigt--* return buffer; Hier gibst du einen Pointer zurück der als Wert eine Adresse auf eine lokale Variable hat. Ok, soweit kann ich dir folgen. Jetzt würde ich denken, schreibe ich struct ifreq ifr; außerhalb der funktion dann wäre es ja global. tuts aber auch nicht. Laut Buch und google handelt es sich wohl um eine Struktur. ifr.ifr_hwaddr.sa_data; müsste dann nicht irgendwo etwas wie: struct ifreq { char ifr_hwaddr; }; struct ifreq ifr; stehn? aber was hatt es dann mit sa_data auf sich? Da das die Adresse von einer lokalen Variable ist kannst du außerhalb nichts mit der Adresse anfangen die in dem zurückgegebenen Pointer steht. Soweit hab ichs gerafft Bücher vermitteln Grundlagen und sind meistens recht gut aufgebaut. Wenn du lieber mit Code spielst, was auch sehr wichtig ist um eine Programmiersprache zu lernen, solltest du dennoch vieleicht mit einfachen Programmen beginnen die gewisse C eigenheiten vermitteln. *g* ich hab schon eine woche gebraucht bis Hallo Welt funktioniert hat. Eigendlich geht es insgesamt nur darum 1. eine datei vom einem http-server laden 2. das was in der datei steht in eine variable stecken 2. die mac in eine variable bekommen 3. daraus eine url basteln 4. die url an den http-server senden das ganze hab ich schon mit einem shell script getestet, dafür hab ich 15min gebraucht. problem, das script frist zuviel power. Also hab ich gedacht, versuchstes mal mit c. Eigentlich hatt ich gedacht wäre das schon eine einfache sache, das es so kommt konnt ich ja nicht ahnen. Hoffentlich klinge ich jetzt nicht wie ein Oberlehrer oder sowas - ist nicht meine Absicht! Nö klingste nicht. Scheib dir z.B. ein Programm in dem du die Gültigkeit von Variablen (lokal/global) ausprobierst. Aanschließend noch eins in dem du call by value und call by reference verwendest. Irgendwas mit Pointer Arithmetic z.B. ein char Array damit zu kopieren ist warscheinlich auch nützlich. wenn ich mit dem jetzt irgendwie durch bin und mal wieder nen paar nächte/wochen zeit habe, werd ichs mal versuchen, erstmal brauch ich nen gutes buch in papierform, da werd ich morgen mal schaun. Danach hast du es leichter und bist bei größeren Programmen nicht gefrustet :) An größere sachen denk ich erstmal garnicht ;) Viel Spaß weiterhin Bernhard Danke -Sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Bernhard Guillon schrieb: On 30.08.2010 18:44, lano wrote: Ok, soweit kann ich dir folgen. Jetzt würde ich denken, schreibe ich struct ifreq ifr; außerhalb der funktion dann wäre es ja global. tuts aber auch nicht. Globale Variablen sind an sich keine gute Idee... Hier etwas das bei deinem Beispiel besser geeignet ist: Da malloc Speicher vom Heap reserviert ist er nach dem Funktionsaufruf noch vorhanden. Du kannst die MAC in den von dir reservierten Speicherbereich schreiben/kopieren. Meistens macht man aber call by reference. Deswegen meinte ich ja es ist eine gute Idee die zwei Varianten call by reference und call by value mal genauer zu untersuchen :) Laut Buch und google handelt es sich wohl um eine Struktur. ifr.ifr_hwaddr.sa_data; müsste dann nicht irgendwo etwas wie: struct ifreq { char ifr_hwaddr; }; struct ifreq ifr; stehn? aber was hatt es dann mit sa_data auf sich? Such mal in den Includes, die du angegeben hast danach dort sind die ganzen Sachen deklariert. Ah ja da war ja noch was mit, naja Bäume und Wald und so ; Warscheinlich hast du für das Shellskript curl verwendet? Wenn ja solltest du dich recht schnell mit libcurl [1] zurecht finden. Hier ist ein Beispiel dazu [2]. Das ganze soll auf der Dbox2 laufen, nem ppc mit 66MHz, da die Box aber schon genug aufgaben hat, zb das TV-Bild anzeigen, ist das schlecht wenn ich ne ganze reihe systembefehle brauche. Die Box hat nur ne bussybox, also nur recht wenig befehle. ich habs so gelöst: #!/bin/sh User=`ifconfig | grep HWaddr` User=`echo $User | { read first zwei drei vier rest ; echo $rest; }` Mac besorgen CurrentChannel=`pzapit -gi` CurrentChannel=`echo $CurrentChannel | { read first rest ; echo $first; }` Aktuellen Kanal holen, kann man auch vom http localhost beziehen if [ $CurrentChannel = ]; then CurrentChannel=standby fi Wenn kein Kanal, dann ist die Box im standby wget -q -O /dev/null http://xyz.dyndns.info/index.php?channel=$CurrentChanneluser=$User; Daten an Server Senden sleep 59 exec $0 Sich selber neu starten exit 0 Was genau braucht bei dem Skript eigentlich so viel Power? Von der Beschreibung her sollte es länger dauern die Seite vom Server zu bekommen bzw die da hin zu schicken. Das wird mit C auch nicht schneller. Vieleicht kann man auch nur einen speziellen Teil des Skriptes optimieren, statt das ganze in C zu schreiben. Naja könnt man sicher, das ist jetzt mal ne verkürzte fassung, wenn der kanal sich zb nicht geändert hat, sendet er auch nix an den server, es sei denn der kanal bleibt bei 5 scriptdurchläufen gleich. Dazu leg ich dann noch ne tmp datei an wo ich mir den letzten kanal merke. der wird dann verglichen, da das dann insgesamt viele systemaufrufe sind, dacht ich das könnt ich mir in c in ner variablen merken, dann sind die sachen schonmal im ram bereich und der zugriff schneller. Hinzu kommt das ich eigentlich dachte ich könnt doch nochmal nen bisschen mit c üben. Mich ärgert das schon das ich das früher nicht gelernt hab, im gunde könnt man damit schöne sachen machen, wenn man denn nicht grade meinen kopf auf den schultern trägt ;) Ich wette du schreibst sowas in 20 min, beim kaffee trinken nebenbei, ich sitz da nun schon ne woche dran, nacht für nacht und den halben tag ;) Gruß Bernhard -Sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Bernhard Guillon schrieb: Gruß Bernhard Boah, so, grad in dieser Minute geschafft. Kanal: 2718f001d176 Mac: 00:50:9c:15:c8:8b War das ne schwere geburt. unter anwendung von sprintf. Jetzt werd ich erstma ausschalfen. Vielen vielen dank für deine/eure bemühungen. Nathanael will ich ja nicht vergessen. so denn -Sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Bernhard Guillon schrieb: On 29.08.2010 02:59, lano wrote: nun möchte ich von einem weiteren main.c die funktion print_hallo nutzen. Wie funktioniert das. Die main darf es nur einmal geben deswegen ist sie hier auskommentiert ;) Ahhhsoo, hätte gedacht das er sich nur die funktionen raussucht die er braucht und den rest ignoriert. Compilieren mit: gcc -o net main.c net.c Funktioniert, danke. der tip mit der main funktion hats glaub ich rausgehaun, hab schon soviel versucht. Wenn was unklar ist sag bescheid. Das werd ich tun, jetzt probiere ich erstmal nen bisschen weiter rum ;) -Sven- PS: | C Programieren von Anfang an vom rororo Verlag. wusste garnicht das der Verlag solche bücher hat, hab gedacht da gibts nur sowas wie 5 freunde, kenn da nur kinderbücher von. werd das nächste mal im buchladen nen blick drauf werfen. Ich hab mir mal ohne c zu c++ von Peter P. Bothner und Wolf-Michael Kähler gekauft, das ist aber so hochgestochen sachlich geschieben das ich das nicht verstehe, es ist auch nur ein programm was im laufe des buches erweitert wird, ohne bsp. dazwischen, ist natürlich doof wenn man den anfang schon nicht versteht. werd mir das online buch mal anschaun so denn -Sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Bernhard Guillon schrieb: Wenn was unklar ist sag bescheid. bescheid. Ich wollt nun, nachdem das mit hallo welt so gut geklappt hat eine datei auslesen. google an und ein beispiel genommen. wieder eine extra datei genommen file.c und file.h *---file.h---* #ifndef FILE_H // #define FILE_H // definiere char read_file(char *file_name); //Prototyp von deiner Funktion #endif //ende der Bedingung *file.c* #include stdio.h #include stdlib.h #include file.h int f; char Text[600]; char read_file(char *file_name) { f = fopen(file_name,r); while( fgets(Text, sizeof(Text), f) !=0 ) fclose(file_name); return Text; } *---main.c---* #include stdio.h #include plugin.h #include http.h // HTTP Client #include file.h // Liest eine Datei char channel[30]; // Starten des Plugins void plugin_exec(PluginParam *par) { // Aktuellen Kanal holen und speichern HTTP_downloadFile(localhost, 80, /control/getonidsid, /tmp/currentChannel, 0, 1); //read_file(/tmp/currentChannel); printf(Kanal: %c\n, read_file(/tmp/currentChannel)); return; } *ENDE* Das mit HTTP_downloadFile funktioniert wunderbar, also wurde ich ein wenig übermütig, datei lesen klappt nicht. bei der printf Anweisung, wofür ist %s %c %l und was weis ich was es da noch gibt, habs erst mit %s versucht, dann hab ich gedacht ok ist ja nen char versuchstes mit %c :) meine mal gelesen zu haben das void nix zurück gibt, int ne zahl, und char nen zeichen. Perl ist wesendlich einfacher :) -Sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
Re: [PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Nathanael Schweers schrieb: int f; /* du brauchst kein int, sondern ein (FILE *). int ist für file deskriptoren, fgets und fopen aber benutzen zeiger auf FILE (ist ein wrapper um filedeskriptoren, da ist sogar ein puffer mit drin). */ Ah ja, macht sinn. Das mit * zeigt dann auf eine adresse wo die daten dann abgelegt sind, wobei mich bei einer variablen die adresse ja nicht interessiert. in perl hätt ich ja ein filehandle, von daher versteh ich schon warum int völlig falsch ist. Hab ich das halbwegs richtig verstanden? char Text[600]; char read_file(char *file_name) { /* du willst vermutlich nicht char, sondern char * zurückgeben*/ hier im grunde das selbe, das was die funktion zurück gibt wird in der adresse xy gespeichert, ich will also nur die adresse wissen wo ich dann die daten finde. warum das so ist ist mir zwar völlig unklar, ich nehms aber mal so hin. f = fopen(file_name,r); while( fgets(Text, sizeof(Text), f) !=0 ) /* was machst du da? das sieht so aus als würdest du solange fgets !=0 zurückgibt die datei schließen, und das ganze auch noch in den immer gleichen puffer schreiben (die alten daten gehen also verloren). */ Mein got ja, jetzt raff ichs aber erst, das fclose(file_name) gehört ja noch zur while schleife. ; hab ich völlig übersehn. fclose(file_name); return Text; /* return Text; wird vermutlich nichtmal übersetzt, da von (char *) nach char konvertiert wird. */ Das versteh ich nun nicht mehr, mal angenommen ich scheibe die daten in Text, geb ich dann mit return Text nicht die daten wieder aus? müsst ich *Text zurück geben, also die adresse wo die daten liegen? in perl kann ich einfach: $text = hallo; return $text; machen, und die funktion gibt hallo zurück bei der printf Anweisung, wofür ist %s %c %l und was weis ich was es da noch gibt, habs erst mit %s versucht, dann hab ich gedacht ok ist ja nen char versuchstes mit %c :) siehe man 3 printf oder man 3p printf dazu. %s sagt printf dass hier ein string reinkommt. %c ein zeichen, %l steht für long. Davon gibt's ne menge mehr, z.b. auch für floating point. Ok, hab ich kapiert. Perl ist wesendlich einfacher :) Perl ist auf ne andere art obskur ;) Hmm, ich komm da eigendlich gut mit zurecht. Aber stimmt schon, C ist für neulinge nicht gerade einfach, und ich finde dass die standard bibliothek es einem neuling nicht gerade einfacher macht. Ich hatte c mal in der berufsschule, ist schon 15 Jahre her, das sah dann so aus das der Lehrer die Tafel in 5 min vollgeschrieben hat, ich war noch halbwegs interessiert aber all meine fragen konnt er mir nicht beantworten, weil das so ist war seine standard Antwort, warum konnt er mir in keinem fall erklären, nach 6 Monaten hab ich aufgegeben zu fragen und wie alle anderen gewartet bis ich den lösungszettel bekomme und hab einfach abgeschrieben. Ich hoffe dass Ich dich nicht zu sehr verwirrt habe. Geht so ;) ich hoffe ihr habt was zum lachen, weil ich mich so schwer tue. :) -sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org
[PUG] OT: c Programmierung für ganz anfängl iche Anfänger
Hallo auch, ich hab mal eine Frage zur Programmierung in c. Dazu muss ich erwähnen das ich überhaupt keinen schimmer davon habe, also komplett null. Scriptsprachen wie shell oder perl bereiten mir da weitaus weniger probleme. hinzu kommt das was ich im netz so finde, versteh ich nicht wirklich, da scheint man immer ein gewisses grundwissen mit bringen zu müssen. Über c Hab ich auch nur ein Buch und das ist für Leute geschrieben die schon das fünfte Studium beendet haben, da versteh ich noch nichtmal das Vorwort. zu meiner Frage: Ich hab ein simples programm: --- net.c #include stdio.h #include stdlib.h int print_hallo() { printf(Hallo Welt\n); return 0; } int main() { print_hallo(); return 0; nun möchte ich von einem weiteren main.c die funktion print_hallo nutzen. Wie funktioniert das. Ich hab schon 2 nächte nach try'n'error halb google durch, aber ich komm nicht da hinter. Könnte mir da jemand freundlicher weise erklären wie das funktioniert, aber bitte ganz ganz einfach. Ein ganz ganz einfaches beispiel wäre nett von dem ich mir das prinzip abschaun kann und dann darauf aufbaun. vielen dank schonmal für die mühe so denn -Sven- -- PUG - Penguin User Group Wiesbaden - http://www.pug.org