135681
Goto Top

C++ Modularisierung Frage

Hallo!
Ich hab eine Frage - undzwar möchte ich mein Programm modularisieren.... hier der Code:
___________________________________________________
dynamischeArrays.cpp

DynamischeArrays.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
Speicher für Eingabe während Laufzeit festlegen
#include "stdafx.h"
#include <iostream>
#include <string>
#include "Header-Data.h"

using namespace std;

int main()
{
int groesse = 0;
string *dyn_array = 0; Zeiger auf einen String


cout << "Eingabe: Anzahl Teilnehmer..." << endl;
cin >> groesse;

dyn_array = new string[groesse];
Anfordern eines Datenfeldes bestehend aus string Werten mit der größe groesse und lass ihn auf dyn_aray zeigeng

einlesen(groesse, dyn_array);
ausgeben(groesse, dyn_array);


delete dyn_array; //Freigeben

return 0;
}

____________________________________________________________________________________________________
____________________________________________________________________________________________________
eingeben.cpp


#include <iostream>
#include <string>

void einlesen(int groesse, string *dyn_array)
{
for (int i = 0; i < groesse; i++)
{
cout << "Geben Sie die Namen (Nachnamen) ein." << endl;
cin >> dyn_array[i];
}
}

____________________________________________________________________________________________________
____________________________________________________________________________________________________
ausgeben.cpp

#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;

void ausgeben(int groesse, string *dyn_array)
{
for (int i = 0; i < groesse; i++)
{
cout << dyn_array[i] << endl;
}
system("pause");
}
____________________________________________________________________________________________________
____________________________________________________________________________________________________
Header-Data.h

#pragma once

#include <iostream>
#include <string>

using namespace std;
void einlesen(int, string *);
void ausgeben(int, string *);

____________________________________________________________________________________________________
____________________________________________________________________________________________________
____________________________________________________________________________________________________
____________________________________________________________________________________________________

Meine Frage: Generelle einwände von euch. Ich möchte eure kritik bzw. kommentar dazu hören... Sehr ihr Fehler?
Danke im Vorraus.
MfG

Content-Key: 368254

Url: https://administrator.de/contentid/368254

Printed on: April 24, 2024 at 11:04 o'clock

Member: Kraemer
Kraemer Mar 16, 2018 updated at 06:46:07 (UTC)
Goto Top
Moin,
Zitat von @135681:
Sehr ihr Fehler?

ja, diverse Typos & Co. in deinem Text und die fehlenden Code-Tags um deinen Code drum herum. Macht so keinen Spaß zu lesen.

Gruß
Member: emeriks
emeriks Mar 16, 2018 at 07:44:31 (UTC)
Goto Top
Hi,
was heißt für Dich "modularisieren"?

E.
Mitglied: 135681
135681 Mar 16, 2018 at 10:32:50 (UTC)
Goto Top
Teil-code in andere cpp´s schreiben und die form beachten
Mitglied: 135681
135681 Mar 16, 2018 at 10:33:06 (UTC)
Goto Top
typos?
Member: rubberman
rubberman Mar 17, 2018 at 10:54:56 (UTC)
Goto Top
So etwas wie ein "Dynamisches Array" gibt es bereits mit automatischer Speicherverwaltung. Nennt sich std::vector und ist ein Klassentemplate aus dem vector Header. Sobald du new und delete in C++ benötigst, hast du im Zweifelsfall bereits etwas falsch gemacht.
http://www.cplusplus.com/reference/vector/vector/
In deinem Fall arbeitest du mit einem std::vector<std::string>
Lass bitte dieses unsägliche using namespace std;weg. In einem Header ist das sowieso ein absolutes No-Go.

Steffen
Mitglied: 135681
135681 Mar 17, 2018 at 12:25:01 (UTC)
Goto Top
Danke Steffen..
Was ist der Vorteil davon wenn ich using namespace weg lasse und warum ist es gerade im header schlimm und weniger lokal?
Member: rubberman
rubberman Mar 17, 2018 updated at 20:41:24 (UTC)
Goto Top
Der Sinn von einem Namensraum ist, dass Klassen und Funktionen in unterschiedlichen Namensräumen denselben Name haben dürfen, aber über den Namensraum eine eindeutige Zuordnung haben. Das wird insbesondere dann interessant, wenn du weitere Bibliotheken einbindest. In C++ wird bspw. gern mit den boost Headern gearbeitet. So gibt es unter anderem ein std::swap() und ein boost::swap().

Wenn du einen Header includierst, dann ist das so als würde dort wo dein #include in der Implementierung steht, der Quellcode deines Headers eingefügt werden. Steht ein using namespace in deinem Headercode, dann ist dieses automatisch im kompletten Code nach dem #include wirksam. Schon kommt es zu Nameclashes bei der Nutzung anderer Bibliotheken.

Außerdem willst du als Sprachbeginner auch erst mal lernen, was alles zum std-Namensraum gehört, oder?


Im Moment versuchst du irgendwie 1 zu 1 von C nach C++ zu übersetzen. So wird da aber kein vernünftiges C++ daraus. C++ ist eben nicht, dass statt der printf() Funktion nun der std::cout Stream verwendet wird. C und C++ sind zwei völlig unterschiedliche Sprachen mit völlig unterschiedlichen Programmierparadigmen.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <limits>

void einlesen(std::vector<std::string>& dyn_array);
void ausgeben(const std::vector<std::string>& dyn_array);

int main()
{
  std::cout << "Eingabe: Anzahl Teilnehmer..." << std::endl;  
  std::size_t groesse{};
  std::cin >> groesse;
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  

  std::vector<std::string> dyn_array{ groesse };

  std::cout << "\nGeben Sie die Namen (Nachnamen) ein." << std::endl;  
  einlesen(dyn_array);
  std::cout << "\nAusgabe:" << std::endl;  
  ausgeben(dyn_array);

  std::cout << "\nPress Enter to continue . . . " << std::flush;  
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  
  return 0;
}

void einlesen(std::vector<std::string>& dyn_array)
{
  std::for_each(dyn_array.begin(), dyn_array.end(), (auto& elem){ std::getline(std::cin, elem); });
}

void ausgeben(const std::vector<std::string>& dyn_array)
{
  std::for_each(dyn_array.cbegin(), dyn_array.cend(), (const auto& elem){ std::cout << elem << std::endl; });
}
Ich habe es dir mit dem obigen Beispielcode einfach gemacht, die Funktionen in separate Implementierungen auszulagern. In der Realität würde man das allerdings nicht tun. Es ist davon auszugehen, dass der Compiler bei der Optimierung ein Inlining vornimmt (der Funktionscode wird an der Stelle eingesetzt, wo der Funktionsaufruf steht). Die Auslagerung in weitere Implementierungen erschwert dieses Inlining, da jede Implementierung zunächst separat kompiliert wird, bevor der Linker die Codes verknüpft.

Steffen
Mitglied: 135681
135681 Mar 17, 2018 at 14:08:32 (UTC)
Goto Top
Okay. Dass muss ich mir ersteinmal auf der Zunge zergehen lassen ... :D ich danke dir aufjedenfall für deine Arbeit und Hilfe. Wirklich viele Dank!
Felix
Mitglied: 135681
135681 Mar 17, 2018 at 14:11:51 (UTC)
Goto Top
Achja.. hab da eventuell noch eine Frage.. Undzwar startet mein Laptop regelmäßig neu. Bzw er geht sofort einfach aus und Startet neu..
Zudem hab ich das Problem bei (jedem) Browser, dass ich oft zu yahoo weitergeleitet werde (wenn ich in der suchliste was eingebe, obwohl die standartsuche auf google gestellt ist und alles andere gelöscht ist) - dann zu einer seite geleitet werde wo irgendwas vonwegen nicht sichere verbindung steht.
Wenn ich es dann geschafft habe auf google zu kommen und etwas eingebe popt oben unter der suchleiste wider die yahoo suche auf ..
wtf?
Member: rubberman
rubberman Mar 17, 2018 at 14:24:33 (UTC)
Goto Top
Hehe, das hat ja nun weder mit C++ noch mit deinem Thema auch nur das geringste zu tun.
Was dein Yahoo Problem angeht, hilft mglw. AdwCleaner
https://de.malwarebytes.com/adwcleaner/
Ob du dir sonst noch irgendwelchen Mist eingefangen hast, kann ich kaum beantworten. Klingt aber so. Dort ist diese Frage aber auf jeden Fall besser aufgehoben ...


Steffen
Mitglied: 135681
135681 Mar 17, 2018 at 15:54:59 (UTC)
Goto Top
Danke dir