Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Array unbekannter Dimension an Funktion übergeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
23.05.2006, 17:33 Uhr
~TheMaD
Gast


Hallo!

Ich sitze gerade an meiner Numerik Aufgabe und habe folgendes Problem:

Für die Aufgabe muss ich mehrmals ein lineares Gleichungssystem der Form Ax=b lösen (mit LU-Zerlegung und Gauß-Algorithmus). Da ich den Code für das Lösen des Systems nicht zig-mal in die main-Funktion schreiben möchte, will ich eine Funktion schreiben, die als Parameter eben die Matrix A, den Vektor b und einen "leeren" Vektor x übernimmt, das Gleichungssystem löst und die Lösung an x übergibt. Die Funktion soll nichts zurückliefern (nur den Vektor x mit der richtigen Lösung "füllen"). Diese Funktion soll aber unabhängig von der Dimension des Gleichungssystems funktionieren, d.h. wenn sie mit einer 2x2 Matrix und einem zweidimensionalen Vektor aufrufe, liefert sie ebenso die richtige Lösung, wie wenn ich z.B. eine 5x5 Matrix und einen fünfdimensionalen Vektor übergebe.

Hier mein Versuch eines Funktionsprototyps:


void Solve(double a[int zeilea][int spaltea],double b[int zeileb],double x[int zeilex])
{
...
}

Der Compiler liefert hier eine Fehlermeldung.


Ich bin noch ziemlicher Programmierneuling und bin daher über möglichst anfängerverständliche Antworten sehr dankbar

Über die Suchfunktion findet man sicher tausend Beiträge zu diesem Thema, ich habe aber noch nichts hilfreiches gefunden.

Vielen Dank
Gruß
Mario
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.05.2006, 17:37 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


soll es c oder c++ sein?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.05.2006, 19:18 Uhr
Helmut



Hi!

Ein Funktionstemplate (C++) könnte die Lösung für Dein Problem sein.
Hintergrund:
Ein Funktionstemplate ist eine Schablone für eine unbegrenzte Zahl von Funktionen mit gleicher Implentierung
und gleicher Schnittstelle aber unterschiedlichen Datentypen(also 2*2 oder 5*5 Matrix usw.). Der Compiler generiert immer die passende Funktion.


C++:
template <typename T1,typename T2,typename T3>
void Solve(T1 a, T2 b, T3 x)
{
........  
}




mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.05.2006, 19:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat:

Der Compiler generiert immer die passende Funktion.



... und damit auch unmengen von daten im obj-file. Ich bin nicht so der Freund von templates, in C würde ich halt nun einfach die Pointer übergeben, in C++ hätte ich das dann genauso gemacht
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.05.2006, 20:13 Uhr
~TheMaD
Gast


Hi!

Ich programmiere c++. Von Templates hab ich bisher noch nichts gehört, das werde ich mir mal genauer ansehen. Mir geht es nur darum, den Code etwas übersichtlicher (sprich kürzer) zu gestalten.

Danke für die Hilfe

Mario
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.05.2006, 21:43 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


kannst einfach nen std::vector nehmen... wie man das ganze rechnet findest du in der rätselecke. da gibts ne matrixinversion in c....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.05.2006, 10:09 Uhr
RHBaum



@FloSoft

wie oft verwendet man in einem programm mehrere auspraegungen eines templates ?
Wie helmut schon sagte, das template generiert die passenden noetigen Versionen nich alle ^^

Zumindest wenn ich programmiere, lohnt sich der aufwand fuern Template fuer eine .exe / eine .dll fuer sich gesehen nich. Aber wenn ich den code so generisch schreibe das er in mehreren programmen verwendet werden kann, dann lohnt sich es extrem.
Hab ich code, den ich iwahrscheinlich in nur einem prog verwende, wird das auch kein template. erst wenn ich den das 2te mal brauch, denk ich drueber nach ^^
Und der overhaed iss so gross nu auch wieder nich ^^ 1 mbyte mehr in der exe (extremstfall) intressiert heut kaum einen, bei RAM ausbaustufen im Giga bereich ^^

templates kann man wiederum auch splitten, so das nen grossteil der redundanz fuer generische dinge vermieden wird.

Versuchs mal ...

@~TheMaD
Ob dir templates so aufn ersten blick weiterhelfen, mag ich bisserl bezweifeln ...
du willst mit den groessen deiner matrix /vectoren variablen dynamisch bleiben, da fallen die groessenangaben ueber templates raus .... den alle templateparameter muessen compilezeit konstanten sein.
Ob sich den typ zu "templatiesiren" lohnt musst selber entscheiden ....

als erstes wuerd ichs soweiso auf herkoemmliche weise probieren (und fertige templates verwenden ^^)
nimm nen std::vector fuer den vector, bau dir noch ne Matrix klasse ebenfalls ausm vector (man kann jedes mehrdimensionale array auf ein array mit einer dimension weniger zurueckrechnen, so das man uberall mit nem eindimensionalen array auskommt, nur in die bedienbarkeit sollt ma dann bisserl investieren), und implementier deine funktion erst mal so, brauchst es spaeter fuer mehrere typen etc ... dann kannst immer noch nen template drausmachen (copy & paste / search & replace funktioniert immer noch, trotz aller hochwissenschaftlichen abhandlungen ueber design pattern ^^)

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.05.2006, 10:39 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von RHBaum:
@FloSoft

wie oft verwendet man in einem programm mehrere auspraegungen eines templates ?
Wie helmut schon sagte, das template generiert die passenden noetigen Versionen nich alle ^^


natürlich nicht für alle möglichen, sondern nur für die die du benutzt, wenn du nun aber z.b

matrix2x2
matrix3x3
matrix4x4
matrix5x5

usw instanzierst in deienr anwendung, generiert er die jedesmall komplett für jedes dieser "typen" objektcode, wo man sich ihn evtl sparen könnte wenn man einfach die matrix per pointer übergibt, das mein ich damit. Teilweise sind templates praktisch, meist aber kann man sich diese sparen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
24.05.2006, 12:45 Uhr
stephanw
localhorst



Zitat von FloSoft:

natürlich nicht für alle möglichen, sondern nur für die die du benutzt, wenn du nun aber z.b

matrix2x2
matrix3x3
matrix4x4
matrix5x5

usw instanzierst in deienr anwendung, generiert er die jedesmall komplett für jedes dieser "typen" objektcode, wo man sich ihn evtl sparen könnte wenn man einfach die matrix per pointer übergibt, das mein ich damit.


Das ist sicher richtig, aber für die vier Klassen sehe ich das auch nicht kritisch. 100 Matrix-Klassen ist es sicher unangebracht, für die vier ist es doch halb so wild. Solange das Speicherproblem nicht signifikant ist, würde ich lieber Entwicklungszeit sparen ;-) Zumal Template-Code häufig laufzeit-effizienter sein kann.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.05.2006, 13:51 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von stephanw:

Das ist sicher richtig, aber für die vier Klassen sehe ich das auch nicht kritisch. 100 Matrix-Klassen ist es sicher unangebracht, für die vier ist es doch halb so wild. Solange das Speicherproblem nicht signifikant ist, würde ich lieber Entwicklungszeit sparen ;-) Zumal Template-Code häufig laufzeit-effizienter sein kann.

naja bei größeren templates merkt man doch sehr schnell wieviel einem das an bytecode kostet, da ist man von ohne templates mit z.b 300kb schnell auf 2-3mb reiner "release-exe" nur weil man ein oder 2 weitere dinge damit instanziert hat. Man sollte halt immer schaun ob man das gleiche nicht auf was anderes rückführen kann wo weniger speicher usw braucht. auch wenn wahrscheinlich jetzt kommt "speicher ist ja nicht mehr das problem" klar, natürlich nicht, aber man soll trotzdem lernen mit den ressourcen vernünftig umzugehen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: