Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C++ (alle ISO-Standards) ::  2d array of pointer     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
7x7-7
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.08.2009
Beiträge: 108
Beitrag 7x7-7 Mitglied 22:42:59 20.03.2017   Titel:   2d array of pointer            Zitieren

Hallo Forum,

Leider gilt wohl: float data[100][100] != float **data;

Wenn man sich die Verteilung der Daten auf die im Speicher belegten Adressen ansieht, findet man für den ersten Fall (float data[100][100]):
data == &data[0][0];
data +4 == &data[1][];
usw...

Nach der Initialisierung des zweiten Falls:

float ** data = new float *[100];
und dann data[1..100] = new float[100];

liegt hier der erste Datenpunkt mehr als 400 byte weit weg von der durch data belegten Adresse, weswegen eine Umwandlung wohl nicht trivial sein dürfte.

Für eine ältere Funktion, die ein "float ** data" übergeben haben möchte, würde ich gern ein data[100][100] übergeben - wie kann ich das eine in das andere umwandeln ?
Knurble Schnurble
Unregistrierter




Beitrag Knurble Schnurble Unregistrierter 22:50:18 20.03.2017   Titel:              Zitieren

&data und die Daten column- statt row-first reinschreiben.
manni66
Unregistrierter




Beitrag manni66 Unregistrierter 09:24:50 21.03.2017   Titel:              Zitieren

Bist du sicher, dass die Funktion da nichts zurück liefern will?
DirkB
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.01.2016
Beiträge: 914
Beitrag DirkB Mitglied 09:42:06 21.03.2017   Titel:   Re: 2d array of pointer            Zitieren

7x7-7 schrieb:
Hallo Forum,

Leider gilt wohl: float data[100][100] != float **data;
Jupp

7x7-7 schrieb:

und dann data[1..100] = new float[100];
Eher data[0..99]

7x7-7 schrieb:
liegt hier der erste Datenpunkt mehr als 400 byte weit weg von der durch data belegten Adresse, weswegen eine Umwandlung wohl nicht trivial sein dürfte.

Für eine ältere Funktion, die ein "float ** data" übergeben haben möchte, würde ich gern ein data[100][100] übergeben - wie kann ich das eine in das andere umwandeln ?
Von dem "echten" 2D-Array zu einem Doppelpointer geht es. Ugekehrt ist schwierig.

C++:
float data_org[100][100]
 
float ** data = new float *[100];
und dann data[i] = data_org[i]  mit i = 0 ...99
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 3917
Beitrag Wutz Mitglied 10:29:00 21.03.2017   Titel:   Re: 2d array of pointer            Zitieren

7x7-7 schrieb:
"float ** data" übergeben haben möchte, würde ich gern ein data[100][100] übergeben - wie kann ich das eine in das andere umwandeln ?

Ohne UB gar nicht, denn die Typen sind inkompatibel.
Fehlerverschleierungen via Zeigercast oder void* ändern daran nichts.

_________________
Java, the best argument for Smalltalk since C++. -- Frank Winkler
7x7-7
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.08.2009
Beiträge: 108
Beitrag 7x7-7 Mitglied 18:53:34 21.03.2017   Titel:              Zitieren

Hallo und danke für die vielen Beiträge.

wie es aussieht, handelt es sich um einen historisch bedingten Effekt, der während der zunächst iterativ verlaufenden Entwicklung der Programmiersprache C entstanden ist. So übersetzt wohl der Compiler die semantisch identisch anmutende Zeichenfolgen a[1][2] und b[1][2] völlig unterschiedlich, wenn int**a und int b[100][100] definiert wurden.

Hier ist der aufschlussreiche Beitrag aus dem die Info stammt:
http://stackoverflow.com/ ....... ecay-into-int-but-not-int
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 3917
Beitrag Wutz Mitglied 09:44:45 22.03.2017   Titel:              Zitieren

7x7-7 schrieb:
historisch bedingten Effekt, der während der zunächst iterativ verlaufenden Entwicklung der Programmiersprache C entstanden ist.

Tatsächlich ist C aus der Praxis heraus entstanden - d.h. von Profis, die wissen was sie können und wollen.
Die meisten anderen Sprachen sind von Theoretikern entworfen worden, die Wert auf leichte intuitive Bedienbarkeit legen - quasi damit auch noch der letzte Depp als Programmierer Unheil anrichten kann.
Problematisch wird es dann, wenn solche Sprachverständnisse aufeinandertreffen, wie bei C-Zeigern und C++.
Dann wird nach dem C++-Motto einfach alles irgendwie (mit C++ Standard(!) Sprachmitteln) zurechtgecastet, weil die Typ"sicherheit" von C++ sowas verlangt, und hinterher wird rumgejammert, wenn man durch solche Casts den C++-Compiler zunächst mal ruhiggestellt hat, sich aber dann unerwartete Ergebnisse einstellen.
Und deshalb gehören C Zeiger nicht C++ Hände und zumindest nur in solche, die von C kamen und "auf"gestiegen sind und nicht umgekehrt.

7x7-7 schrieb:
übersetzt wohl der Compiler die semantisch identisch anmutende Zeichenfolgen a[1][2] und b[1][2] völlig unterschiedlich, wenn int**a und int b[100][100] definiert wurden.

Der C Compiler übersetzt "identisch anmutende Zeichenfolgen" nicht "völlig unterschiedlich" sondern "Ausdrücke" "immer gleich":
Objekte haben Typ und Wert, der Compiler weiß natürlich, dass das eine den Typ Zeiger auf int* und das andere Zeiger auf int[100] hat, und übersetzt für unterschiedliche und inkompatible Typen natürlich was anderes.
Du hast recht, C ist nicht intuitiv - das war auch nie der Anspruch von Ritchie (s.o.) und ist somit nichts für Anfänger oder Sprachumsteiger, die gewohnt sind, dass ihnen alles mundgerecht gereicht wird.

_________________
Java, the best argument for Smalltalk since C++. -- Frank Winkler
C++ Forum :: C++ (alle ISO-Standards) ::  2d array of pointer   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.