|
|
Autor | Beitrag |
---|
000 05.12.2010, 16:02 bennifilm |
Hi es geht darum das ein array vergrößert wird und den alten inhalt Das ergebnis sollte so aussehen :
::Alien Swarm Sunstation 583:: |
Profil || Suche |
001 05.12.2010, 17:36 Raziel |
Kann deinen Code leider nicht komplett nachvollziehen, mag auch ein bisschen unübersichtlich sein, aber: Du kannst auf jeden Fall bequem mit der STL Klasse 'vector' arbeiten und Arrays nach belieben verkleinern, vergrößern, manipulieren und so weiter. Bin mir nicht sicher, ob dass nicht ein wenig zu viel Aufwand wäre, aber ein Blick lohnt sich. Zum Beispiel hier: http://www.cplusplus.com/reference/stl/vector/ Kl. Bsp.:
Dieser Beitrag wurde am 05.12.2010 um 18:05 von Raziel bearbeitet. |
Profil || Suche |
002 05.12.2010, 18:51 Bluthund |
Da die Frage mit C++ getaggt ist sollte er das sogar so machen. @Raziel: Wenn man darauf aus ist Zeichen auf ein Array zu pushen macht man das fuer gewoehnlich auch («push_back('a')») und schaut nicht vorher den Dezimal-(/Oktal-/Hexdezimal-)Wert um den dann im Code zu benutzen (97). Ausser man moechte den Code moeglichst unleserlich machen. @bennifilm: Wofuer die Endlosschleife am Ende des Programms? Nicht im Stande deine IDE richtig einzurichten? Wenn du schon unbedingt mit rohem Speicher rumspielen willst, dann solltest du auch die entsprechenden Funktionen nutzen, die fuer solche Sachen ausgelegt worden sind (memset, memcpy, etc.) und dann legst du einfach das neue Array an und kopierst die alten Werte in einem Rutsch mit memcpy rueber. --The C language combines all the power of assembly language with all the ease-of-use of assembly language. |
Profil || Suche |
003 05.12.2010, 19:34 Raziel |
Mit der Übersicht stimmt, trägt nicht gerade posititv dazu bei und natürlich soll der Code nicht unleserlich werden. Dass der size_type nicht in ein int passt hatte ich nicht beachtet und bis dato auch nicht (bewusst) gewusst, aber macht natürlich Sinn. Thx für den Hinweis ;) -- |
Profil || Suche |
004 06.12.2010, 00:38 Kriz |
Wenn's ums Lernen geht, sollte man die STL erstmal weglassen und manuell alles durchkauen, datt hilft! Un ein einfaches Array zu erweitern ist ja mehr als simpel: @Bluthund: memcpy & Co. sind C-Dinger und haben mit C++'s Speicherverwaltung wahrlich nichts zu tun! Außer das bezog sich jetzt nicht auf C++, sondern auf Lowlevel im Allgemeinen... --K:R-I)Z++ |
Profil || Suche |
005 06.12.2010, 01:50 Bluthund |
Das hab ich ja auch so nicht gesagt. Es ging nur darum, dass je nach genutzter Implementierung sizeof(vector<T>::size_type) > sizeof(int) sein kann. Jo, wie oben schon erwaehnt war der Hinweis fuer die Benutzung mit "rohem Speicher". -- The C language combines all the power of assembly language with all the ease-of-use of assembly language. |
Profil || Suche |
006 06.12.2010, 01:51 caedes |
kriz: warum kopierst du die daten 2x um? caedes Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen. Dieser Beitrag wurde am 06.12.2010 um 01:53 von caedes bearbeitet. |
Profil || Suche |
007 06.12.2010, 10:37 Kriz |
Klar geht auch, aber ich wollte es ausführlich machen. Noobs brauchen das ;-) Oder zumindest sollte man es so nicht machen, wenn das ganze publik werden soll. Denn irgendein OpenSource-Heinz wird sich sicherlich fragen: "Da hat einer das temp nicht gelöscht!" unbd schwupps... macht er eventuell ein delete[] temp; rein. Es geht darum, daß solche Zeigerumweisungen von temp auf array gerne mal übersehen und vergessen werden :-) --K:R-I)Z++ Dieser Beitrag wurde am 06.12.2010 um 10:37 von Kriz bearbeitet. |
Profil || Suche |
008 06.12.2010, 14:09 caedes |
naja, is halt unnötiger aufwand. außerdem sieht man an meiner version, dass das pointer sind, also man durch "array = temp;" einfach "array" auf das array hinter temp zeigen lässt (bennifilm scheint in seinem code oben davon ausgegangen zu sein, dass durch sowas der inhalt kopiert wird) ich hab jetzt wenig erfahrung mit "real world" c++ code, aber wenn man da regelmäßig mehr rumkopiert als nötig, nur damit irgendwelche deppen, die den code nicht verstehen, ihn nicht kaputtbugfixen, ist der performance-gewinn gegenüber z.b. java schnell weg. aber man könnte natürlich caedes Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen. Dieser Beitrag wurde am 06.12.2010 um 14:09 von caedes bearbeitet. |
Profil || Suche |
009 06.12.2010, 17:54 CPoly |
Vielleicht steh ich auch auf dem Schlauch, aber hier ist noch nicht "realloc" gefallen. Da C eine echte Untermenge von C++ ist, ist es ja durchaus legitim darauf zurückzugreifen. Wenn nicht genug Speicher sequenziell verfügbar ist, übernimmt realloc auch das Kopieren.
Edit: Ich hab nochmal drüber nachgedacht und wenn das Array per new erzeugt wurde und das auch so bleiben soll, funktioniert die Lösung natürlich nicht. Ich steh halt auf reines C :-D --Dieser Beitrag wurde am 06.12.2010 um 18:05 von CPoly bearbeitet. |
Profil || Suche |
010 06.12.2010, 18:33 theDon |
Ist es aber nicht, versuche mal, in C++ einen void*-Wert an eine char*-Variable zuzuweisen. -- \o tanz den naziprau! o/ And more than ever, I hope to never fall, |
Profil || Suche |
011 06.12.2010, 19:36 CPoly |
Also wenn ich in meinem Beispiel ein char-Array nehme anstatt des int funktioniert es auch. Weder gcc noch g++ geben Fehlermeldung oder Warnung aus. Kannst du das näher erläutern? Lügt unser Professoren? --Dieser Beitrag wurde am 06.12.2010 um 19:38 von CPoly bearbeitet. |
Profil || Suche |
012 06.12.2010, 20:17 caedes |
weil du explizit castest. das ist in C nicht nötig. ja -- caedes Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen. |
Profil || Suche |
013 06.12.2010, 20:20 theDon |
\o tanz den naziprau! o/ And more than ever, I hope to never fall, |
Profil || Suche |
014 06.12.2010, 22:32 bennifilm |
Erstmal danke für die vielen Antworten. Auch wenn mir jetzt jeder eine besser/effektivere Variante für mein Programm Wenn ich das richtig verstanden habe ist eine der Ursachen diese Zeile : ::Alien Swarm Sunstation 583:: |
Profil || Suche |
015 06.12.2010, 23:01 Kriz |
Em ja... Du musst eben nur wissen, daß eine Zuweisung von Zeigern kein Kopieren im eigentlichen Sinne bedeutet (sowas nennt der Fachmann "shallow copy" -> flache Kopie). Ist der Zeiger Startpunkt für ein Array, dann muß man eben durch alle nötigen Elemente des Quellarrays iterieren und elementweise ins Zielarray kopieren ("deep copy" -> tiefe Kopie). Ich lege dir mal ganz dringend den Wälzer von Ulrich Breymann ans Herz (C++ Einführung und professionelle Programmierung, Hanser Verlag), da wird meiner Meinung nach C++ ganz ordentlich in deutsch erklärt. --K:R-I)Z++ |
Profil || Suche |
016 06.12.2010, 23:37 default |
ich leg dir ans herz c++ erstmal zu vergessen und mit c anzufangen, kauf dir kein buch, lies manpages --Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst. |
Profil || Suche |
017 07.12.2010, 09:47 caedes |
Und wenn, dann "The C Programming Language", das hat auch Übungsaufgaben. --caedes Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen. |
Profil || Suche |
018 07.12.2010, 12:00 Mazze |
Zum Thema "C Teilmenge C++": und zu "realloc": cu --BattleTech-MOD: |
Profil || Suche |
019 07.12.2010, 23:52 Kriz |
@default: Laber nicht, kein Mensch muß sich vor C++ mit C rumärgern! Dieses Lernmodell ist ja wohl völlig banane und veraltet. Und manpages sollte man mal so garnicht als Buchersatz betrachten, sondern als Referenz- oder Hilfedoku. Oder ziehst du mit 'nem Schraubendreher Nägel raus? @caedes: Imho sind TCPL/TCPPPL wahre Hämmer und für Noobs eigentlich so gut wie nicht verdaulich, sei es im Originalen oder in der Übersetzung. Da gibt's für Einsteiger ganz klar andere Buchlösungen. Sicher, wer gerne gleich mit der Referenz lernen möchte, der kann das tun. Aber datt wird ein langer Weg ;-) --K:R-I)Z++ |
Profil || Suche |
020 08.12.2010, 09:37 caedes |
bei TCPPPL stimme ich zu, bei TCPL eher nicht. mit ein bisschen programmiererfahrung und motivation sollte man damit eigentlich klarkommen können. --caedes Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen. |
Profil || Suche |
021 08.12.2010, 16:25 default |
Kriz ... Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst. |
Profil || Suche |
022 08.12.2010, 20:54 Prefect |
C ist im Grunde eine sehr einfache und überschaubare Programmiersprache. Nur Pointer verstehen viele Menschen einfach nicht. Aber wer Pointer nicht versteht, der wird auch mit C++ und vielen anderen Programmiersprachen keinen Spaß haben. Andererseits ist es durchaus sinnvoll, direkt in C++ einzusteigen und vernünftig die STL zu lernen. Wer in C++ Stringverarbeitung mit char* macht gehört ordentlich verhauen (Ausnahmen gibt es immer, aber Leute, die solche Threads wie diesen eröffnen sind Kontinente davon entfernt, diesen Ausnahmen zu begegnen). Nur darf man sich deshalb nicht um die Auseinandersetzung mit Pointern drücken. --Widelands - Gemütliche Aufbaustrategie, Free Software |
Profil || Suche |
023 08.12.2010, 23:08 Kriz |
@Prefect: Die Sprache an sich ist simpel gestrickt, da gebe ich dir völlig recht. Nur die mögliche Tiefe scheint einige zu überfordern, besonders wenn es um char und seine Einsatzgebiete geht. Klar, aus einer rationalen Sicht auf die Syntax war es von K&R ein klein wenig unglücklich, daß sich ein Byte und ein Zeichen dasselbe Schlüsselwort teilen müssen (hier hat Java den entscheidenden Schritt getan). Hätte man sowas gleich getrennt, dann wäre glaube ich das Verständnis zwischen Low-Level Dingen wie char*-basierte IO-Puffer und normalen Dingen wie ein char*-String etwas größer. Aber sei's drum. Wem's nicht passt, der kann sich ja in C ein längenterminiertes String-Struct basteln... die Freiheit hat man ja gottseidank. Auch wenn man Zeiger dann immernoch verstanden haben muß, hrhrhr... @default: Macht Sinn, zumindest bekommt man zwangsweise seine Dosis C stets mit C++ verabreicht, ob man nun will oder nicht. Man lernt C quasi mit C++ nebenher (auch wenn man da ganz konsequent auf die Unterschiede pochen sollte, die ja nun mal eben da sind). @caedes: Motivation scheint ja eben bei vielen hier im Forum Mangelware zu sein. Denen kann man mit TCPL nicht (bei)kommen. --K:R-I)Z++ |
Profil || Suche |
024 10.12.2010, 09:45 Prefect |
Naja, C ist halt auch ein Kind seiner Zeit. 127 characters should be enough for everybody, und so. Eine moderne Sprache sollte in der Tat zwischen Bytes und Strings unterscheiden, wobei es m.E. auch unsinnig ist, Strings einfach als Array von Zeichen handzuhaben. Streng genommen ist das aus Unicode-Perspektive nämlich auch durchaus problematisch, angesichts der ganzen Sonderfälle. Außerdem denke man an Schriftsysteme wie Hangul (koreanisch), in der die Zeichen pro Silbe gruppiert werden. Wirklich flexible Stringunterstützung ist ein ziemlich schwieriges Problem. --Widelands - Gemütliche Aufbaustrategie, Free Software |
Profil || Suche |
|