Zeiger und String's bei Visual C++ 2005
-
Hallo alle zusammen,
hab arge Probleme die ZEIGER und STRING Funktionen zu verstehen...
wäre cool, wenn ihr mir da helfen könntet (evt. sogar mit kleinen Peispiel Programme. Da meist en kleines Beispiel dem Verständnis es zu verstehen arg hilft.)Wenn ihr ein Buch empfehlen könntet wäre ich auch sehr dankbar.
War vor kurzem in einer Bücherei. Jedoch war es entweder nur sehr unverständlich beschrieben oder es war der neue Standard schon eingeführt.
Wobei ich wieder nur bahnhof verstand.Naja, auch egal....
Vielen Dank schon mal im vorraus.
MFG
Chaos5
-
Hallo
Was meinst du mit Zeiger- und stringfunktionen? Was meinst du mit string (char* oder std::string?)
chrische
-
Chaos5 schrieb:
Hallo alle zusammen,
hab arge Probleme die ZEIGER und STRING Funktionen zu verstehen...
wäre cool, wenn ihr mir da helfen könntet (evt. sogar mit kleinen Peispiel Programme. Da meist en kleines Beispiel dem Verständnis es zu verstehen arg hilft.)Nenn doch ein Beispiel was du nicht verstehst dann kann mans besser erklären. Und was verstehst du unter einer String Funktion? Mach also wie gesagt ein Beispiel

Chaos5 schrieb:
Vielen Dank schon mal im v******.

Gruß Patrick
-
Die soll benotet werden jedoch bevor ich das ganze net schnalle, kann ich's leider nicht ausfüllen.
Aber somit wisst ihr, mit welchen Funktionen ich zu tun hab...
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>struct IP
{
//Speicherung für Dezimale Darstellung (192.1.1.1)
int dez_okt1,dez_okt2,dez_okt3,dez_okt4;
int bin_okt1[8],bin_okt2[8],bin_okt3[8],bin_okt4[8];
};struct Subnetz
{
IP ip;
//IP subnetzmaske;
char klasse;
int anzahl_Rechner_Subnetz;
};struct Netz
{
IP ip;
IP subnetzmaske;
int EntlehnteBits;
char klasse;
int anzahl_Subnetze;
int anzahl_Rechner_gesamt;
Subnetz subnetze[256];
};//Wandelt eine Dezimalzahl in ein 8 Bit Binärfeld um!!
void dezi_to_bin(int dezimalzahl, int *binaer_feld)
{
int modrest=0, divisionsrest, i;
//Initialisierung
for (i=0;i<=7;i++)
{
binaer_feld[i] = 0;
}
divisionsrest = dezimalzahl;
i=7;
do
{
modrest=divisionsrest%2;
binaer_feld[i]=modrest;
divisionsrest=divisionsrest/2;
i--;
}
while(divisionsrest != 0);
}//Hilfsfunktion zum Rechnen mit Exponenten
int exponent(int basis, int exponent)
{
int ergebnis;
ergebnis=basis;
if(exponent==0)
{
ergebnis=1;
}else
{
for(int i=1; i<exponent; i++)
{
ergebnis=ergebnis*basis;
} //for(int i=0; i<=exponent; i++)
}
return ergebnis;
} //int exponent(int basis, int exponent)//Umrechnung einer Binarzahl in eine Dezimalzahl.
//Die Binarzahl muss durch ein array mit 8 Elementen uebergeben werden.
//Es wird die Dezimalzahl vom Typ int zurueckgegeben.
//Beispiel fuer die Dezimalzahl 192 als Binaerzahl im array.
//Element [1][1][0][0][0][0][0][0 ]
//Index 7 6 5 4 3 2 1 0int bin_to_dezi(int* binaer_feld)
{
int dezizahl,hilf;dezizahl=0;
for(int i=0; i<8; i++)
{
dezizahl=dezizahl+binaer_feld[i]*exponent(2,i);
} //for(int i=0; i<8; i++)return dezizahl;
}//int bin_to_dezi(int* binarzahl)//Umwanldeln von dezimale Darstellung in Binäre Darstellung
void IP_Adress_dezi_to_bin(IP &ip)
{
dezi_to_bin(ip.dez_okt1,ip.bin_okt1);
dezi_to_bin(ip.dez_okt2,ip.bin_okt2);
dezi_to_bin(ip.dez_okt3,ip.bin_okt3);
dezi_to_bin(ip.dez_okt4,ip.bin_okt4);
}//Übergabeparameter call by reference (Original)
void Einlesen(IP &Ip1)
{
char point;
cout <<"Bitte geben Sie die IP-Adresse an:192.1.1.1 :";
cin >>Ip1.dez_okt1>>point>>Ip1.dez_okt2>>point>>Ip1.dez_okt3>>point>>Ip1.dez_okt4;//Umwandlung in Binäre Darstellung
dezi_to_bin(Ip1.dez_okt1,Ip1.bin_okt1);
dezi_to_bin(Ip1.dez_okt2,Ip1.bin_okt2);
dezi_to_bin(Ip1.dez_okt3,Ip1.bin_okt3);
dezi_to_bin(Ip1.dez_okt4,Ip1.bin_okt4);
}//Übergabeparameter call by value (Kopie)
void Auslesen(IP Ip1)
{
cout<<"IP: "<<Ip1.dez_okt1<<"."<<Ip1.dez_okt2<<"."<<Ip1.dez_okt3<<"."<<Ip1.dez_okt4;
}void AuslesenMaske(IP Ip1)
{
cout<<"Maske: "<<Ip1.dez_okt1<<"."<<Ip1.dez_okt2<<"."<<Ip1.dez_okt3<<"."<<Ip1.dez_okt4;
}void AuslesenNetzKlasse(Netz netzwerk)
{
cout<<endl;
cout<<"AdressKlasse: "<<netzwerk.klasse;
}void Auslesen_Binaer_Maske(IP Ip1)
{
int i=0;
cout<<"Maske Binaer: ";
for(i=7;i>=0;i--)
{
cout<<Ip1.bin_okt1[i];
}
cout <<".";
for(i=7;i>=0;i--)
{
cout<<Ip1.bin_okt2[i];
}
cout <<".";
for(i=7;i>=0;i--)
{
cout<<Ip1.bin_okt3[i];
}
cout <<".";
for(i=7;i>=0;i--)
{
cout<<Ip1.bin_okt4[i];
}
}Auslesen_Binaer_IP(IP Ip1)
{
int i=0;
cout<<"IP Binaer: ";
for(i=0;i<=7;i++)
{
cout<<Ip1.bin_okt1[i];
}
cout <<".";
for(i=0;i<=7;i++)
{
cout<<Ip1.bin_okt2[i];
}
cout <<".";
for(i=0;i<=7;i++)
{
cout<<Ip1.bin_okt3[i];
}
cout <<".";
for(i=0;i<=7;i++)
{
cout<<Ip1.bin_okt4[i];
}}
//Übung!!
char IP_AdressKlasse(IP Ip1)
{
if (Ip1.dez_okt1 >=0 && Ip1.dez_okt1<=127) return 'A';
else
{
if (Ip1.dez_okt1 >=128 && Ip1.dez_okt1<=191) return 'B';
else
{
if (Ip1.dez_okt1 >=192 && Ip1.dez_okt1<=223) return 'C';
else
{
return '!';
}
}
}}
BerechneSubnetzmaske(Netz &netzwerk)
{
netzwerk.klasse = IP_AdressKlasse(netzwerk.ip);
switch(netzwerk.klasse)
{
case 'A':
//cout<<"Das ist ein Klasse A Netz.\n";
netzwerk.subnetzmaske.dez_okt1=255;
netzwerk.subnetzmaske.dez_okt2=0;
netzwerk.subnetzmaske.dez_okt3=0;
netzwerk.subnetzmaske.dez_okt4=0;
//Binär Initialisierung
IP_Adress_dezi_to_bin(netzwerk.subnetzmaske);break;
case 'B':
//cout<<"Das ist ein Klasse B Netz.\n";
netzwerk.subnetzmaske.dez_okt1=255;
netzwerk.subnetzmaske.dez_okt2=255;
netzwerk.subnetzmaske.dez_okt3=0;
netzwerk.subnetzmaske.dez_okt4=0;
IP_Adress_dezi_to_bin(netzwerk.subnetzmaske);
break;
case 'C':
//cout<<"Das ist ein Klasse C Netz.\n";
netzwerk.subnetzmaske.dez_okt1=255;
netzwerk.subnetzmaske.dez_okt2=255;
netzwerk.subnetzmaske.dez_okt3=255;
netzwerk.subnetzmaske.dez_okt4=0;
IP_Adress_dezi_to_bin(netzwerk.subnetzmaske);
break;
default:
cout<<"\nFalsche Eingabe.\n";
}//switch(klasse)
//Ausgabe Subnetmaske}
/****************************************************
//Die Funktion berechnet die Maximale Anzahl der Hosts
//Abhängig davon welche Ip Adresse übergeben wird
//Rückgabewert ist die Anzahl der maximalen Hosts
//Die Maxhosts soll zusätzlich in der Datenstrukur
//netzwerk.anzahl_Rechner_gesamt gespeichert werden!
//Erstellen Sie auch ein Struktogramm für die Funktion
*////////////////////////////////////////////////////int BerechneMaxHost(Netz &netzwerk)
{
//???return MaxHosts;
}void Ausgabe_Menu()
{
//Menu
cout <<" |====================================================|" << endl;
cout <<" |$$$$$$$$$$$$$$$$ Network Calculate $$$$$$$$$$$$$$$$|" << endl; cout <<" |____________________________________________________|" << endl; cout <<" |(1) IP - Adresse Binaer umwandeln ! |" << endl; cout <<" |(2) Netzwerkklasse bestimmen! |" << endl; cout <<" |(3) Subnetmaske bestimmen! |" << endl; cout <<" |(4) Anzahl der maximale Hosts bestimmen! |" << endl; cout <<" |(5) Auswahl: Ohne Subnetze ! |" << endl; cout <<" |(6) Auswahl: Mit Subnetze ! |" << endl; cout <<" |(0) Beenden des Programms!! |" << endl; cout <<" |___________________________________________________|" << endl; cout <<" |$$$$$$$$$$ Projekt : SE 11_ $$$$$$$$$$$|" << endl;
cout <<" |====================================================|" << endl;
cout << endl;
}//Der Benutze gibt die Anzahl der Subnetze an.
void AngabeAnzahlSubnetze(Netz &network)
{
cout<<"Wieviel Subnetze wollen Sie bilden?";
cin >> network.anzahl_Subnetze;}
//Die Funktion berechnet die Anzahl der entlehnten Bits
//Abhänig davon der Angabe der Anzahl der Subnetze die
//vorher in network.anzahl_Subnetze angeben werden muss
//Berechnet die Anzahl der Bits die entlehnt werden muessenint anzahl_entlehnterBits(Netz &network)
{
return n;
}///////////////////////////////////////////////////
//Die Funktion bestimmt die Erweiterte Subnetzmaske
////////////////////////////////////////////////////
void BerechneErweiterteSubnetzmaske(Netz &netzwerk)
{
//??????????????
}void AusgabeMaxHost(Netz netzwerk)
{
cout <<"Max_Hosts:"<< netzwerk.anzahl_Rechner_gesamt;
}void AuslesenDatenstruktur(Netz netzwerk)
{
Auslesen(netzwerk.ip);
cout<<endl;
Auslesen_Binaer_IP(netzwerk.ip);
cout<<endl;
AuslesenMaske(netzwerk.subnetzmaske);
cout<<endl;
Auslesen_Binaer_Maske(netzwerk.subnetzmaske);
cout<<endl;
AusgabeMaxHost(netzwerk);
}void main()
{
//IP Ip1;
Netz netzwerk;
int auswahl=0;
do
{
Ausgabe_Menu();
cout <<"Bitte waehlen Sie aus: ";
cin >> auswahl;
switch(auswahl)
{
case 1: //Binäre Umwandlung
Einlesen(netzwerk.ip);
Auslesen_Binaer_IP(netzwerk.ip);
getchar();
break;
case 2: Einlesen(netzwerk.ip);
netzwerk.klasse=IP_AdressKlasse(netzwerk.ip);
cout<< netzwerk.klasse;
getchar();
//usw.
break;
case 3: //Neztmaske bestimmen
Einlesen(netzwerk.ip);
BerechneSubnetzmaske(netzwerk);
getchar();
break;
case 4: //Anzahl der maxiamlen Hosts im Netzwerk bestimmen
Einlesen(netzwerk.ip);
cout<<BerechneMaxHost(netzwerk);
getchar();
break;
case 5:
Einlesen(netzwerk.ip);
BerechneMaxHost(netzwerk);
IP_AdressKlasse(netzwerk.ip);
BerechneSubnetzmaske(netzwerk);
AuslesenDatenstruktur(netzwerk);
getchar();
break;case 6: //Subnetze bilden
Einlesen(netzwerk.ip);
BerechneMaxHost(netzwerk);
IP_AdressKlasse(netzwerk.ip);
AngabeAnzahlSubnetze(netzwerk);
anzahl_entlehnterBits(netzwerk);
BerechneErweiterteSubnetzmaske(netzwerk);
AuslesenDatenstruktur(netzwerk);getchar();
break;}
clrscr();
}
while(auswahl != 0 );getchar();
}
-
Du weißt ja sicherlich, dass so manche Bits und Bytes im Arbeitsspeicher abgelegt werden. Dabei kann man von den Bits und Bytes nicht erkennen, was das jetzt für Daten sind. Nehmen wir mal einen Auszug aus dem Arbeitsspeicher: 0101011101010101010101. Da erkennt man ja nicht, ob das jetzt ein Bild ist, ein Text, eine Zahl, ein Videofilm oder ein Musikstück. Sicherlich, für einen Film oder Song sind diese paar Bits zu wenig, aber es könnte ja ein Auszug sein.
Deshalb "weiß" nur dein Compiler und du, was das für Daten sind.
Wenn du sowas programmierst wie "int x = 10", dann steht an einer gewissen Stelle im Arbeitsspeicher 0000000000001010. Wo die Stelle jetzt ist, merkt sich der Compiler. Was du jetzt damit machst, bleibt dir überlassen.
Die Position, wo die Daten liegen, kannst du aber auch in einem Zeiger speichern. Also "int* ZeigerAufX = &x". Dann steht in der Variable, wo die Daten liegen.
Soviel zu den Grundlagen über den Arbeitsspeicher.Dann die Zeichen/Zeichenketten: Im ASCII-Standard wurde festgelegt, zu welcher Zahl welcher Buchstabe gehört. Also dass zu der 65 ein 'A' (großes A) gehört.
Wenn du also im Arbeitsspeicher ein Byte 01000001 (binär für 65) hast und es ausgeben willst, weiß der Computer, dass er ein 'A' schreiben soll...Jetzt kannst du an eine Stelle in den Arbeitsspeicher 0100000101000001010000010100000100000000 schreibst, kannst du das als vier hintereinander-liegende 'A's interpretieren, gefolgt von einem Byte mit dem Wert 0 (null). Bei Zeichenketten (=Strings) signalisiert ein Byte vom Wert 0 das Ende der Zeichenkette, die "normalen" Buchstaben, Zahlen und Sonderzeichen liegen im Wert von 32-127.
So, und ein Zeiger auf die Stelle im Arbeitsspeicher ist dann ein Pointer (=Zeiger) auf einen String. Beziehungsweise nennt man den Zeiger auf die Zeichen selber einen String.In std::string ist der Zeiger einfach in einer Klasse gekapselt. Also man sieht den Zeiger selber nicht, kann aber über Funktionen drauf zugreifen.
Bei 'std::string MeinSatz = "Katzen sind doof";' sucht sich die Klasse eine freie Stelle im Arbeitsspeicher, schreibt die Zeichen darein, am Schluss eine 0, und merkt sich einen Zeiger, der auf die Stelle zeigt.So, hoffe hab keinen Unfug geschrieben, aber dann wird mich schon jemand korrigieren. Hoffe auch, dass es das war, was du wolltest... Habs jetzt auch nich nochmal durchgelesen, muss jetzt auch los einkaufen

-
Hallo
Findest du das nicht etwas frech: Du verwendest keine Codde-Tags, also ist der Code leserlich. Du schreibst, dass es benotet wird, was darauf schließen lässt, dass du irgendwann mal nicht zugehört hast. Und vor allem stellst du keine konkrete Frage.
Was willst du wissen?
chrische
-
chrische5 schrieb:
Hallo
Findest du das nicht etwas frech: Du verwendest keine Codde-Tags, also ist der Code leserlich. Du schreibst, dass es benotet wird, was darauf schließen lässt, dass du irgendwann mal nicht zugehört hast. Und vor allem stellst du keine konkrete Frage.
Was willst du wissen?
chrische
Meine Frage Habe ich gaaaanz oben gestelle

Naja, unsere Lehrer hat nur Theorie im schnelldurchgang gemacht und aus seinen Powerpoint Präsentationen werd ich einfach nicht schlau.
Also ich weiß einfach net, wie das alles zusammengehört, und wie ich es allein schreibe.Habe zwar zuhaus uralte bücher *g stand 1990 (Programmieren mit C
)
Somit weiß ich auch schonmal was Funktionen sind und wie diese Programmiert werden. Jedoch hat bei Pointer und Strings mein Verständnis aufgehört...PS.: Danke für die Erklärung was diese machen.

-
Hallo
Chaos5 schrieb:
chrische5 schrieb:
Hallo
Findest du das nicht etwas frech: Du verwendest keine Codde-Tags, also ist der Code leserlich. Du schreibst, dass es benotet wird, was darauf schließen lässt, dass du irgendwann mal nicht zugehört hast. Und vor allem stellst du keine konkrete Frage.
Was willst du wissen?
chrische
Meine Frage Habe ich gaaaanz oben gestelle

Sorry, aber du solltest deine Fragen wirklich konkreter stellen und nicht verlangen, dass man alles erklärt.
chrische
-
Naja, Verlangen tu ich nicht's.
Jedoch bin ich wohl wie jeder über jede Hilfe dankbar.
Naja, Fakt ist, ich weiß einfach nicht, wie ich nen Pointer in einem Programm unterbringe. Und diesen dann aufrufe.
Werd mal schauen, was ich zusammen zaubern kann, um ein Beispielprogramm reinzustellen. Jedoch wird dies bei meinen Kenntnissen leider kein Hexenwerk...
-
Hallo
Pointer sind bei C++ nafangs gar nicht so wichtig. Nutz nicht so sehr den Heap und verwende die Klassen aus der StandardLib und der STL. Dann hast mit Pointer erstmal nicht so viel zu tun. Du solltest dich aber mal mit Referenzen bekannt machen.
chrische
-
Kleines Beispiel für Pointer
#include <iostream.h>
#include <stdio.h>void main()
{
//Variablen deklarieren und zuweisen
int GZ=1;
double KZ=5.5;
char Zeichen = 'a';//Zeiger deklarieren
int *Zeiger_GZ;
double *Zeiger_KZ;
char *Zeiger_Z;//Variablenadressen den Zeigern zuweisen
Zeiger_GZ=&GZ;
Zeiger_KZ=&KZ;
Zeiger_Z = &Zeichen;cout << "Adresse: "<< Zeiger_GZ << " Inhalt: " << *Zeiger_GZ<<endl;
cout << "Adresse: "<< Zeiger_KZ << " Inhalt: " << *Zeiger_KZ<<endl;
printf("Adresse: %p Inhalt: %c ",Zeiger_Z,*Zeiger_Z);getchar();
}Naja, die Themen kann ich mir leider nicht aussuchen. Wobei ich auch nur noch 1 Jahr die Bank drücken muss und wohl nichts mehr mit Programmieren zu tun hab.
Aber dass lass ich alles mal offen.Ich weiß halt einfach nichts mit den Pointer anzufangen und so weiß ich auch nicht, wie ich sie am besten Unterbringe und erstelle.
Wenn ich halt was net selbst schonmal gemacht hab schnall ich's net.
So hab ich immer am liebsten ne Vorlage, wo ich's mal abschauen kann.
Und dass kann man dann ja weiter führen
-
#include <iostream> void MitPointer( int *Zahl ); void MitReferenz( int &Zahl ); void OhneAlles( int Zahl ); int main ( void ) { int MeineZahl = 0; // Die Zahl std::cout << "Mit Pointer: "; MitPointer( &MeineZahl ); // Adresse an Funktion übergeben: & = Adressoperator std::cout << MeineZahl << std::endl; std::cout << "Mit Refrenz: "; MitReferenz( MeineZahl ); std::cout << MeineZahl << std::endl; MeineZahl = 0; // Wieder zurücksetzen auf 0 std::cout << "Ohne alles: "; OhneAlles( MeineZahl ); std::cout << MeineZahl << std::endl; return 0; } void MitPointer( int *Zahl ) { *Zahl = 100; // Auf Speicher zugreifen... } void MitReferenz( int &Zahl ) // Dies ist KEIN Adressoperator, sondern eine Referenz { Zahl = 200; } void OhneAlles( int Zahl ) { Zahl = 300; }Spiel damit mal rum. Ein Tipp: Ein Pointer zeigt auf einen Speicherbereich. Und zu Referenzen erkundigst du dich mal über Google oder stellst, falls du das nicht verstehst noch eine genau Frage dazu.
Gruß Patrick
-
Hey, das ist klasse.

Danke.