Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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]);

}

Geschrieben

"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.

Geschrieben

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....

Geschrieben
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 ;)

Geschrieben

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();

}

Geschrieben (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 von TDM
Geschrieben
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:

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...