Veröffentlicht 4. Juni 200817 j Hallo zusammen, ich habe ein kleines Problem. Um eine meiner Noten in der Berufsschule zu verbessern habe ich ein freiwilliges Projekt zur Berechnung der Netz- und Broadcastadresse an Hand einer IP und einer Subnetmask angenommen. Das Programm lief gestern auch, aber als ich heute nochmal was nachsehen wollte hauts mich andauernd nach der Eingabe der "Anzahl der Subnetbits" raus......Ich weiß nich ob ich einfach nur zu lange über dem Code hänge sodass ich keine Fehler finde oder obs an was anderem lieg !!! Vll. kann mir ja jemand von euch helfen pls #include <stdio.h> #include <math.h> #define ZWEI_HOCH32 1<<32 #define ZWEI_HOCH24 1<<24 #define ZWEI_HOCH16 1<<16 #define ZWEI_HOCH8 1<<8 #define ZWEI_HOCH0 1<<0 main(){ printf ("\n\n\n"); printf ("*********************************************\n"); printf ("* *\n"); printf ("* Broadcast, Netzadressenrechner *\n"); printf ("* v. 1.0 *\n"); printf ("* *\n"); printf ("*********************************************\n"); int numSubNetBits, i; int ipaddrokt[4]; int netaddrokt[4]; int bcastaddrokt[4]; unsigned long ip=0,netmask=0, netaddr=0, bcastaddr=0, helpmask=0; printf ("Bitte Oktetten 1-4 der IP Eingeben: \n"); scanf ("%d.%d.%d.%d", &ipaddrokt[3], &ipaddrokt[2], &ipaddrokt[1], &ipaddrokt[0]); ip = (ipaddrokt[3] * ZWEI_HOCH24) + (ipaddrokt[2] * ZWEI_HOCH16) + (ipaddrokt[1] * ZWEI_HOCH8) + (ipaddrokt[0] * ZWEI_HOCH0); printf ("\n\n"); printf ("\n\n"); printf ("Bitte die Anzahl der Subnetbits eingeben, z.B.'32': \n"); scanf ("%d", &numSubNetBits); printf ("\n\n\n"); /* Aus der Anzahl der Subnetbits berechnen wir die Netzwerkmaske als ulong */ for (i = 32 - numSubNetBits; i < 32; i++) { netmask += 1 << i; } netaddr = ip & netmask; /* Extrahieren der einzelnen Oktette durch AND mit passender Maske. * Bsp.: 10110100.00101100.11110010.10010100 & 000000000.11111111.00000000.00000000 * liefert 00000000.00101100.00000000.00000000. * danach 16mal rechtsschieben und das Oktett ist an der richtigen Stelle. */ netaddrokt[0] = netaddr & ZWEI_HOCH8; netaddrokt[1] = (netaddr & 65280) >> 8; netaddrokt[2] = (netaddr & 16711680) >> 16; netaddrokt[3] = (netaddr & 4278190080u) >> 24; printf ("Die Netzadresse lautet: %d.%d.%d.%d\n", netaddrokt[3], netaddrokt[2], netaddrokt[1], netaddrokt[0]); /* Um die Broadcastadresse zu erhalten, zuerst die netmask invertieren, dann * mit der IP-Adresse verodern. */ helpmask = netmask ^ ((255*ZWEI_HOCH24) + (255*ZWEI_HOCH16) + (255*ZWEI_HOCH8) + 255); bcastaddr = helpmask | ip; /* Die Broadcasraddresse im ulong Format in die einzelnen Oktette aufspalten. */ bcastaddrokt[0] = bcastaddr & 255; bcastaddrokt[1] = (bcastaddr & 65280) >> 8; bcastaddrokt[2] = (bcastaddr & 16711680) >> 16; bcastaddrokt[3] = (bcastaddr & 4278190080u) >> 24; printf ("Die Broadcastadresse lautet: %d.%d.%d.%d\n\n", bcastaddrokt[3], bcastaddrokt[2], bcastaddrokt[1], bcastaddrokt[0]); }
4. Juni 200817 j "hauts mich raus" ist keine ausreichende Fehlerbeschreibung. Was ist das beobachtete, was das gewünschte Verhalten? Es muss übrigens "int main" heißen. Und ich empfehle dir dringend, die #define-Ausdrücke zu klammern, sonst gibt es lustige Effekte, wenn du die mal mit anderen Operatoren als & und | benutzt.
4. Juni 200817 j Hast du wohl rech ;-) War wirklich nich sehr genau !!! Also ich compiliere das Programm und führe es dann aus. Alles noch ohne Fehler. Die 1. Ausgabe und die Aufforderung zur Eingabe der einzelnen Oktetten erscheint. Die 4 Oktetten werden eingegeben und mit "Enter" bestätigt. Anschließend erscheint die Aufforderung zur Eingabe der Subnetbits. Nachdem ich diese dann eingebe und mit "Enter" bestätige schließt sich meine console ohne Fehlermeldung. Auch mit eingeschaltetem Debugging konnte ich nichts herausfinden ..... Habe die #define-Ausdrücke soeben geklammert und auch "main()" in "int main()" geändert, allerdings immer noch der gleich Effekt. Danke schonmal für deine Hilfe....
4. Juni 200817 j Nachdem ich diese dann eingebe und mit "Enter" bestätige schließt sich meine console ohne Fehlermeldung. Das ist das normale Verhalten. Die Konsole wurde eigens für das Programm geöffnet, und schließt sich daher, wenn das Programm beendet ist. Wie du das verhindern kannst, findest du hier. Und wer jetzt mit system("pause") um die Ecke kommt, bekommt Ärger
4. Juni 200817 j Hmm, ne hat leider keinen Erfolg gebracht ....die Console beendet sich an der gleichen Stelle
4. Juni 200817 j Hier mal der Code..... habe aber die Klammern der #define-Ausdrücke nochmal entfernt um auzuschließen das ich mir dadurch nen Fehler einbaue .... #include <stdio.h> #include <math.h> #define ZWEI_HOCH32 1<<32 #define ZWEI_HOCH24 1<<24 #define ZWEI_HOCH16 1<<16 #define ZWEI_HOCH8 1<<8 #define ZWEI_HOCH0 1<<0 int main(){ printf ("\n\n\n"); printf ("*********************************************\n"); printf ("* *\n"); printf ("* Broadcast, Netzadressenrechner *\n"); printf ("* v. 1.0 *\n"); printf ("* *\n"); printf ("*********************************************\n"); int numSubNetBits, i; int ipaddrokt[4]; int netaddrokt[4]; int bcastaddrokt[4]; unsigned long ip=0,netmask=0, netaddr=0, bcastaddr=0, helpmask=0; printf ("Bitte Oktetten 1-4 der IP Eingeben: \n"); scanf ("%d.%d.%d.%d", &ipaddrokt[3], &ipaddrokt[2], &ipaddrokt[1], &ipaddrokt[0]); ip = (ipaddrokt[3] * ZWEI_HOCH24) + (ipaddrokt[2] * ZWEI_HOCH16) + (ipaddrokt[1] * ZWEI_HOCH8) + (ipaddrokt[0] * ZWEI_HOCH0); printf ("\n\n"); printf ("\n\n"); printf ("Bitte die Anzahl der Subnetbits eingeben, z.B.'32': \n"); scanf ("%d", &numSubNetBits); printf ("\n\n\n"); printf ("1kajer"); /* Aus der Anzahl der Subnetbits berechnen wir die Netzwerkmaske als ulong */ for (i = 32 - numSubNetBits; i < 32; i++) { netmask += 1 << i; } netaddr = ip & netmask; /* Extrahieren der einzelnen Oktette durch AND mit passender Maske. * Bsp.: 10110100.00101100.11110010.10010100 & 000000000.11111111.00000000.00000000 * liefert 00000000.00101100.00000000.00000000. * danach 16mal rechtsschieben und das Oktett ist an der richtigen Stelle. */ netaddrokt[0] = netaddr & ZWEI_HOCH8; netaddrokt[1] = (netaddr & 65280) >> 8; netaddrokt[2] = (netaddr & 16711680) >> 16; netaddrokt[3] = (netaddr & 4278190080u) >> 24; printf ("Die Netzadresse lautet: %d.%d.%d.%d\n", netaddrokt[3], netaddrokt[2], netaddrokt[1], netaddrokt[0]); /* Um die Broadcastadresse zu erhalten, zuerst die netmask invertieren, dann * mit der IP-Adresse verodern. */ helpmask = netmask ^ ((255*ZWEI_HOCH24) + (255*ZWEI_HOCH16) + (255*ZWEI_HOCH8) + 255); bcastaddr = helpmask | ip; /* Die Broadcasraddresse im ulong Format in die einzelnen Oktette aufspalten. */ bcastaddrokt[0] = bcastaddr & 255; bcastaddrokt[1] = (bcastaddr & 65280) >> 8; bcastaddrokt[2] = (bcastaddr & 16711680) >> 16; bcastaddrokt[3] = (bcastaddr & 4278190080u) >> 24; printf ("Die Broadcastadresse lautet: %d.%d.%d.%d\n\n", bcastaddrokt[3], bcastaddrokt[2], bcastaddrokt[1], bcastaddrokt[0]); } void wait () { setvbuf(stdin,NULL,_IONBF,0); setvbuf(stdin,NULL,_IOFBF,BUFSIZ); getchar(); }
4. Juni 200817 j Wie du das verhindern kannst, findest du hier. Das erklärt's aber nur mit cin/cout. Nenn mich altmodisch, aber ich würde nicht empfehlen C-Funktionen (printf/scanf) mit ostreams zu mischen. Natürlich nur der Übersichtlichkeit halber, programmtechnisch hat das keinen Einfluss. Hier lieber getchar(). Editerle: Sieht schon ok aus, aber das müsstest du natürlich noch in der Main aufrufen, wobei ein einfacher Funktionsaufruf von getchar() hier eigentlich reichen würde. Bearbeitet 4. Juni 200817 j von TDM
4. Juni 200817 j Das erklärt's aber nur mit cin/cout.Nein, da steht auch eine C-Version. Hier lieber getchar().getchar wartet aber nicht, wenn noch Zeichen im Eingabepuffer hängen.
4. Juni 200817 j Nein, da steht auch eine C-Version. Asche auf mein Haupt, ich sollte mir angewöhnen alles zu lesen - tut mir leid. getchar wartet aber nicht, wenn noch Zeichen im Eingabepuffer hängen. Dann halt doch lieber vorher leeren. :floet:
4. Juni 200817 j Ok.....vielen Dank schonmal ! Und im Klartext, wie soll ich jetzt am Besten vorgehen bzw. welche Änderungen muss ich vornehmen?
4. Juni 200817 j Wie mach ich das noch gleich ? Ich steh heute sowas von aufm Schlauch ...:upps Edit: Habs hinbekommen ....trotzdem danke für eure Hilfe !!! Bearbeitet 4. Juni 200817 j von Thunderbird3004
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.