Thunderbird3004 Geschrieben 4. Juni 2008 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]); }
Klotzkopp Geschrieben 4. Juni 2008 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.
Thunderbird3004 Geschrieben 4. Juni 2008 Autor 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....
Klotzkopp Geschrieben 4. Juni 2008 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
Thunderbird3004 Geschrieben 4. Juni 2008 Autor Geschrieben 4. Juni 2008 Hmm, ne hat leider keinen Erfolg gebracht ....die Console beendet sich an der gleichen Stelle
Klotzkopp Geschrieben 4. Juni 2008 Geschrieben 4. Juni 2008 Zeig bitte mal den neuen Code. Wenn möglich, mit Code-Tags.
Thunderbird3004 Geschrieben 4. Juni 2008 Autor 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(); }
TDM Geschrieben 4. Juni 2008 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
Klotzkopp Geschrieben 4. Juni 2008 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.
TDM Geschrieben 4. Juni 2008 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:
Thunderbird3004 Geschrieben 4. Juni 2008 Autor Geschrieben 4. Juni 2008 Ok.....vielen Dank schonmal ! Und im Klartext, wie soll ich jetzt am Besten vorgehen bzw. welche Änderungen muss ich vornehmen?
Klotzkopp Geschrieben 4. Juni 2008 Geschrieben 4. Juni 2008 Du musst die wait-funktion am Ende deiner main-funktion aufrufen.
Thunderbird3004 Geschrieben 4. Juni 2008 Autor 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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden