Thunderbird3004 Geschrieben 4. Juni 2008 Teilen Geschrieben 4. Juni 2008 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]); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Juni 2008 Teilen Geschrieben 4. Juni 2008 "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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thunderbird3004 Geschrieben 4. Juni 2008 Autor Teilen Geschrieben 4. Juni 2008 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.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Juni 2008 Teilen Geschrieben 4. Juni 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thunderbird3004 Geschrieben 4. Juni 2008 Autor Teilen Geschrieben 4. Juni 2008 Hmm, ne hat leider keinen Erfolg gebracht ....die Console beendet sich an der gleichen Stelle Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Juni 2008 Teilen Geschrieben 4. Juni 2008 Zeig bitte mal den neuen Code. Wenn möglich, mit Code-Tags. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thunderbird3004 Geschrieben 4. Juni 2008 Autor Teilen Geschrieben 4. Juni 2008 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(); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Juni 2008 Teilen Geschrieben 4. Juni 2008 (bearbeitet) 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 2008 von TDM Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Juni 2008 Teilen Geschrieben 4. Juni 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Juni 2008 Teilen Geschrieben 4. Juni 2008 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: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thunderbird3004 Geschrieben 4. Juni 2008 Autor Teilen Geschrieben 4. Juni 2008 Ok.....vielen Dank schonmal ! Und im Klartext, wie soll ich jetzt am Besten vorgehen bzw. welche Änderungen muss ich vornehmen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Juni 2008 Teilen Geschrieben 4. Juni 2008 Du musst die wait-funktion am Ende deiner main-funktion aufrufen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thunderbird3004 Geschrieben 4. Juni 2008 Autor Teilen Geschrieben 4. Juni 2008 (bearbeitet) 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 2008 von Thunderbird3004 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.